Предположим, что у вас есть файл, или файлы, о действиях с которыми вы хотели бы знать немного больше того, что они были изменены в определенное время. Или вы хотите отследить какой-то процесс и происходящее в это время на экране монитора. Сделать это, в общем-то, несложно. Достаточно установить «сторожа» на файлы или процессы и запускать те или иные действия, которые помогут вам получить информацию. И поможет нам в этом библиотека OpenCV и, конечно же, Python.
На самом деле, я несколько утрирую, говоря о доступе к файлам. По сути, это может быть что угодно, любой процесс, любое изменение файловой системы. Если вы хотите отслеживать изменения файловой системы, вам сюда, можно взять код отслеживания и прикрутить к нему другие действия, а не отправку сообщений в телегу. Мы же будем отслеживать заголовки открытых окон. А подопытным нам послужит файл «Password.docx». Конечно же, это может быть любой файл. С любым расширением и названием. Главное, чтобы вы знали, как он отображается в заголовках, чтобы правильно указать название. Впрочем, я забегаю немного вперед. Но, тем не менее, скажу, что узнать какие заголовки в данный момент у открытых окон можно с помощью простого кода:
После его выполнения вы увидите список с заголовками. А теперь, давайте обо всем по порядку.
Что понадобиться?
Давайте установим все, что потребуется в этом коде одной строкой. А уже дальше я опишу, для чего нужна каждая библиотека в контексте данного кода.
Небольшое описание устанавливаемых библиотек
opencv-python – в данном коде будет нужна для записи видео с камеры, а также с экрана компьютера. По большему счету, OpenCV, это библиотека компьютерного зрения с открытым исходным кодом. Разработка ведется независимой российской командой при поддержке корпораций.
Numpy, в контексте данного кода, будет нужна для преобразования пиксельного массива полученного при создании скриншота в массив numpy. А по большему счету, это фундаментальный пакет для вычисления массивов.
PyAutoGUI. С помощью данной библиотеки мы будем делать скриншот и получать разрешение экрана для того, чтобы записывать видео в полноэкранном режиме, а не только в какой-то области. Ведь разрешение у каждого может быть разное. А вообще, данная библиотека используется для программного управления мышью и клавиатурой.
PyGetWindow. С помощью данного модуля мы и будем получать список заголовков открытых окон. Он является кроссплатформенным и служит для получения информации о графическом интерфейсе и управлении окнами приложений.
Отслеживание заголовков окон
Создадим функцию, которая будет отслеживать заголовки открытых окон и если нужный нам заголовок появиться в списке, будет запускаться запись видео с камеры и запись экрана. Назову ее tracker(). В ней всего лишь четыре строки, а именно цикл, который работает до тех пор, пока в списке заголовков не появиться нужный, таймер, который делает паузу в одну секунду между считыванием заголовков и запуск функции записи.
Запись видео с камеры и экрана
Теперь создадим функцию, которая будет записывать видео для начала с камеры, если она у вас есть. И дальше, с экрана. Если у вас нет камеры, можно удалить код, который относиться к камере и оставить только запись экрана.
Для начала создадим объект захвата фреймов с камеры, где 0, это ее порядковый номер. Если у вас несколько камер, то они будут идти под номерами от 0 и до количества. Затем устанавливаем количество кадров в секунду. Определяем кодек, с помощью которого будем записывать видео.
Сделаем проверку, открывается ли наша камера:
Если открывается, создадим объект для записи видео в файл. Он принимает следующие значения: имя файла, в который будет записываться видео в формате «.avi», кодек, с помощью которого будет кодироваться, количество кадров записи в секунду, и размер записываемого видео. В данном случае, так как видео пишется с камеры, размера 640х480 будет достаточно.
Теперь запускаем цикл, в котором устанавливаем количество секунд для записи видео с камеры равным 3-м. Нам, в общем-то, больше и не надо. Вычисляется количество итераций цикла с помощью умножения количества секунд на количество кадров в секунду. Затем считываем фреймы с камеры и записываем их в файл видео.
После того, как цикл записи видео с камеры завершился, запускаем основной цикл, в котором будет записываться происходящее на экране компьютера. Цикл будет работать до тех пор, пока заголовка отслеживаемого нами документа не будет в списке открытых заголовков.
С помощью pyautogui делаем скриншот и передаем его в массив numpy. Далее, уже в виде фрейма данный скриншот попадает в OpenCV, где делается перевод режима изображения из BRG по умолчанию в режим RGB и уже после всех операций записываем фрейм в файл.
Когда отслеживаемый документ будет закрыт и его заголовка не окажется в списке, закрываем все подключения, все открытые объекты, чтобы освободить их для последующей записи, если таковая будет, и снова запускаем функцию отслеживания заголовков.
Вот такой вот, небольшой код. Конечно же, в таком именно варианте, может быть и будет кому-то полезен, но я просто хотел показать факт того, что так можно сделать ))
А на этом, пожалуй, все.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
На самом деле, я несколько утрирую, говоря о доступе к файлам. По сути, это может быть что угодно, любой процесс, любое изменение файловой системы. Если вы хотите отслеживать изменения файловой системы, вам сюда, можно взять код отслеживания и прикрутить к нему другие действия, а не отправку сообщений в телегу. Мы же будем отслеживать заголовки открытых окон. А подопытным нам послужит файл «Password.docx». Конечно же, это может быть любой файл. С любым расширением и названием. Главное, чтобы вы знали, как он отображается в заголовках, чтобы правильно указать название. Впрочем, я забегаю немного вперед. Но, тем не менее, скажу, что узнать какие заголовки в данный момент у открытых окон можно с помощью простого кода:
print(pg.getAllTitles())
После его выполнения вы увидите список с заголовками. А теперь, давайте обо всем по порядку.
Что понадобиться?
Давайте установим все, что потребуется в этом коде одной строкой. А уже дальше я опишу, для чего нужна каждая библиотека в контексте данного кода.
pip install opencv-python numpy PyAutoGUI PyGetWindow
Небольшое описание устанавливаемых библиотек
opencv-python – в данном коде будет нужна для записи видео с камеры, а также с экрана компьютера. По большему счету, OpenCV, это библиотека компьютерного зрения с открытым исходным кодом. Разработка ведется независимой российской командой при поддержке корпораций.
Numpy, в контексте данного кода, будет нужна для преобразования пиксельного массива полученного при создании скриншота в массив numpy. А по большему счету, это фундаментальный пакет для вычисления массивов.
PyAutoGUI. С помощью данной библиотеки мы будем делать скриншот и получать разрешение экрана для того, чтобы записывать видео в полноэкранном режиме, а не только в какой-то области. Ведь разрешение у каждого может быть разное. А вообще, данная библиотека используется для программного управления мышью и клавиатурой.
PyGetWindow. С помощью данного модуля мы и будем получать список заголовков открытых окон. Он является кроссплатформенным и служит для получения информации о графическом интерфейсе и управлении окнами приложений.
Отслеживание заголовков окон
Создадим функцию, которая будет отслеживать заголовки открытых окон и если нужный нам заголовок появиться в списке, будет запускаться запись видео с камеры и запись экрана. Назову ее tracker(). В ней всего лишь четыре строки, а именно цикл, который работает до тех пор, пока в списке заголовков не появиться нужный, таймер, который делает паузу в одну секунду между считыванием заголовков и запуск функции записи.
Python:
# отслеживание появления окна с определенным заголовком
# если заголовок появился, выходим из цикла и запускаем
# функцию записи экрана
def tracker():
while "Password.docx - Microsoft Word" not in pg.getAllTitles():
time.sleep(1)
recorder()
Запись видео с камеры и экрана
Теперь создадим функцию, которая будет записывать видео для начала с камеры, если она у вас есть. И дальше, с экрана. Если у вас нет камеры, можно удалить код, который относиться к камере и оставить только запись экрана.
Для начала создадим объект захвата фреймов с камеры, где 0, это ее порядковый номер. Если у вас несколько камер, то они будут идти под номерами от 0 и до количества. Затем устанавливаем количество кадров в секунду. Определяем кодек, с помощью которого будем записывать видео.
Python:
cap = cv2.VideoCapture(0)
f_rate = 30.0
fourcc = cv2.VideoWriter_fourcc(*"XVID")
Сделаем проверку, открывается ли наша камера:
Python:
if cap.isOpened() is not False:
Если открывается, создадим объект для записи видео в файл. Он принимает следующие значения: имя файла, в который будет записываться видео в формате «.avi», кодек, с помощью которого будет кодироваться, количество кадров записи в секунду, и размер записываемого видео. В данном случае, так как видео пишется с камеры, размера 640х480 будет достаточно.
Python:
out_cam = cv2.VideoWriter(f"{time.strftime('%Y-%m-%d_%H%M%S')}_cam.avi", fourcc, f_rate, (640, 480))
Теперь запускаем цикл, в котором устанавливаем количество секунд для записи видео с камеры равным 3-м. Нам, в общем-то, больше и не надо. Вычисляется количество итераций цикла с помощью умножения количества секунд на количество кадров в секунду. Затем считываем фреймы с камеры и записываем их в файл видео.
Python:
for i in range(0, int(3 * f_rate)):
ret, frame = cap.read() # читаем фреймы с камеры
out_cam.write(frame) # записываем считанные фреймы
out_cam.release()
После того, как цикл записи видео с камеры завершился, запускаем основной цикл, в котором будет записываться происходящее на экране компьютера. Цикл будет работать до тех пор, пока заголовка отслеживаемого нами документа не будет в списке открытых заголовков.
С помощью pyautogui делаем скриншот и передаем его в массив numpy. Далее, уже в виде фрейма данный скриншот попадает в OpenCV, где делается перевод режима изображения из BRG по умолчанию в режим RGB и уже после всех операций записываем фрейм в файл.
Python:
while "Password.docx - Microsoft Word" in pg.getAllTitles():
img = pyautogui.screenshot()
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out_scr.write(frame)
Когда отслеживаемый документ будет закрыт и его заголовка не окажется в списке, закрываем все подключения, все открытые объекты, чтобы освободить их для последующей записи, если таковая будет, и снова запускаем функцию отслеживания заголовков.
Python:
out_scr.release()
out_cam.release()
cv2.destroyAllWindows()
tracker()
Вот такой вот, небольшой код. Конечно же, в таком именно варианте, может быть и будет кому-то полезен, но я просто хотел показать факт того, что так можно сделать ))
Python:
# pip install opencv-python
# pip install numpy
# pip install PyAutoGUI
# pip install PyGetWindow
import time
import cv2
import numpy as np
import pyautogui
import pygetwindow as pg
# отслеживание появления окна с определенным заголовком
# если заголовок появился, выходим из цикла и запускаем
# функцию записи экрана
def tracker():
while "Password.docx - Microsoft Word" not in pg.getAllTitles():
time.sleep(1)
recorder()
# записываем 3 секунды с камеры в цикле, где кол-во итераций
# равно 3 * на количество кадров в секунду
# затем записываем то, что происходит на экране, пока не закроется окно с заголовком
def recorder():
cap = cv2.VideoCapture(0) # создаем объект захвата видео, где 0, это номер камеры. Если камер несколько (0,1,2,3)
f_rate = 30.0 # устанавливаем кол-во кадров для записи
fourcc = cv2.VideoWriter_fourcc(*"XVID") # устанавливаем код кодека для записи
if cap.isOpened() is not False:
# создаем объект записи видео в файл (назавние файла, кодек, кол-во кадров, разрешение видео)
out_cam = cv2.VideoWriter(f"{time.strftime('%Y-%m-%d_%H%M%S')}_cam.avi", fourcc, f_rate, (640, 480))
# записываем в цикле фреймы в файл
for i in range(0, int(3 * f_rate)):
ret, frame = cap.read() # читаем фреймы с камеры
out_cam.write(frame) # записываем считанные фреймы
out_cam.release()
# создаем объект записи видео (назавние файла, кодек, кол-во кадров, разрешение видео)
out_scr = cv2.VideoWriter(f"{time.strftime('%Y-%m-%d_%H%M%S')}_scr.avi", fourcc, f_rate, (pyautogui.size().width,
pyautogui.size().height))
# запускаем цикл, который работает, пока в списке заголовков окон есть отслеживаемый заголовок
while "Password.docx - Microsoft Word" in pg.getAllTitles():
img = pyautogui.screenshot() # делаем скриншот экрана
frame = np.array(img) # преобразовываем скриншот в массив nampy для последующей работы с OpenCV
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # переводим режим изображения из BGR в RGB
out_scr.write(frame) # записываем преобразованный фрейм
# закрываем все подключения, объекты и окна, после чего запускаем отслеживание заголовков
out_scr.release()
cap.release()
cv2.destroyAllWindows()
tracker()
# запускаем отслеживание заголовков окон
def main():
tracker()
if __name__ == "__main__":
main()
А на этом, пожалуй, все.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна