Найти тему
IT Start | Python

Запись определённого окна на видео в Python

Оглавление

Введение

В ходе статьи напишем небольшую программу на языке программирования Python, благодаря которой можно будет записывать определённые окна на видео.

Установка модулей

Для написания программы нам понадобится установить модуль cv2, numpy, pyautogui и pygetwindow. Для их установки нужно перейти в терминал, или же командную строку, прописать pip install opencv-python numpy pyautogui pygetwindow, нажать Enter и ждать установки. После инсталляции импортируем необходимые нам модули:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

Написание кода

Создадим переменную, в которую сохраним название окна, которое нужно записать. Допустим мы хотим записать блокнот на видео:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

Определим кодек, количество кадров в секунду и время, в течении которого будет идти запись в секундах:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

Найдём окно, которое нам нужно записать и активируем его:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

Создадим объект записи видео:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

out = cv2.VideoWriter("название_видео.avi", fourcc, fps, tuple(w.size))

Создадим цикл, количество итераций в котором будет равно указанному числу в record_seconds помноженному на fps. Сама съёмка видео происходит за счёт быстрого создания скриншотов, поэтому внутри цикла делаем скриншот и сохраняем в переменную img:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

out = cv2.VideoWriter("название_видео.avi", fourcc, fps, tuple(w.size))

for i in range(int(record_seconds * fps)):
img = pyautogui.screenshot(region=(w.left, w.top, w.width, w.height))

Далее преобразуем пиксели в правильный массив numpy для работы с OpenCV:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

out = cv2.VideoWriter("название_видео.avi", fourcc, fps, tuple(w.size))

for i in range(int(record_seconds * fps)):
img = pyautogui.screenshot(region=(w.left, w.top, w.width, w.height))
frame = np.array(img)

Преобразуем цвета из BGR в RGB. Создадим рамку и выведем её:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

out = cv2.VideoWriter("название_видео.avi", fourcc, fps, tuple(w.size))

for i in range(int(record_seconds * fps)):
img = pyautogui.screenshot(region=(w.left, w.top, w.width, w.height))
frame = np.array(img)
out.write(frame)
cv2.imshow("screenshot", frame)

Добавим условие, что при нажатии на клавишу “q” запись будет прекращена:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")

fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

out = cv2.VideoWriter("название_видео.avi", fourcc, fps, tuple(w.size))

for i in range(int(record_seconds * fps)):
img = pyautogui.screenshot(region=(w.left, w.top, w.width, w.height))
frame = np.array(img)
out.write(frame)
cv2.imshow("screenshot", frame)

if cv2.waitKey(1) == ord("q"):
break

Закроем всё и получим итоговый код программы на Python для записи определённого окна:

import cv2
import numpy as np
import pyautogui
import pygetwindow as gw

window_name = 'notepad.txt'

fourcc = cv2.VideoWriter_fourcc(*"XVID")
fps = 30.0
record_seconds = 15

w = gw.getWindowsWithTitle(window_name)[0]
w.activate()

out = cv2.VideoWriter("output.avi", fourcc, fps, tuple(w.size))

for i in range(int(record_seconds * fps)):
img = pyautogui.screenshot(region=(w.left, w.top, w.width, w.height))
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out.write(frame)
cv2.imshow("screenshot", frame)

if cv2.waitKey(1) == ord("q"):
break

cv2.destroyAllWindows()
out.release()

     Пример записи видео Admin
Пример записи видео Admin

Видеоурок

Заключение

В ходе статьи мы с Вами написали программу для записи определённого окна на видео в Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Мой Telegram канал

Мой YouTube канал

Курс по созданию GUI на Python

Наука
7 млн интересуются