python은 전체 화면 녹화와 선택 영역 녹화 기능을 실현한다

최근에 고객에게 프로그램 실행 결과를 보여 주었는데, 나는 Python으로 녹화 프로그램을 하나 써서 인터넷에서 기존의 원본 코드를 찾을 수 있으나, 그것의 녹화 프로그램은 전체 화면을 녹화하는 것이다.그러나 화면 데스크톱 아래의 작업 표시줄 도구 모음에 동영상에 녹화되는 것을 원하지 않기 때문에 qq 캡처와 같은 선택 영역 녹화를 실현해야 한다.내가 작성한 프로그램은 다음과 같다. 주 함수의 입력 매개 변수에 전체 화면 녹화인지 선택 영역 녹화인지 제어하는 옵션이 있다.이 프로그램을 작성할 때, 나는 동영상을 초기화하는 데 의문이 하나 있었다VideoWriter 4 , , 전체 화면 녹화 방식의 매개 변수는 (height,width), 선택 영역 녹화의 매개 변수는 (width,height) 이다.나는 일찍이 이 매개 변수를 (height,width) 또는 (width,height) 로 통일하려고 시도한 적이 있다.그러나 프로그램을 실행하면 항상 녹화 방식으로 저장된 영상 파일은 열 수 없습니다. 파일 크기는 1kb입니다. 왜 그런지 모르겠습니다.

import cv2
from PIL import ImageGrab
import numpy as np
import argparse
import time
 
global img
global point1, point2
 
def on_mouse(event, x, y, flags, param):
  global img, point1, point2
  img2 = img.copy()
  if event == cv2.EVENT_LBUTTONDOWN: #  
    point1 = (x, y)
    cv2.circle(img2, point1, 10, (0, 255, 0), thickness=2)
    cv2.imshow('image', img2)
  elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): #  
    cv2.rectangle(img2, point1, (x, y), (255, 0, 0), thickness=2)
    cv2.imshow('image', img2)
  elif event == cv2.EVENT_LBUTTONUP: #  
    point2 = (x, y)
    cv2.rectangle(img2, point1, point2, (0, 0, 255), thickness=2)
    cv2.imshow('image', img2)
 
def select_roi(frame):
  global img, point1, point2
  img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
  winname = 'image'
  cv2.namedWindow(winname, cv2.WINDOW_NORMAL)
  cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  cv2.setMouseCallback(winname, on_mouse)
  cv2.imshow(winname, img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  return point1, point2
 
if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--fps', type=int, default=10, help='frame per second')
  parser.add_argument('--total_time', type=int, default=15, help='video total time')
  parser.add_argument('--savename', type=str, default='video.mp4', help='save file name')
  parser.add_argument('--screen_type', default=1, type=int, choices=[0, 1], help='1: full screen, 0: region screen')
  args = parser.parse_args()
 
  print(' 3 , ')
  if args.screen_type==0:
    print('Press Esc to close window')
  time.sleep(3)
 
  curScreen = ImageGrab.grab() #  
  if args.screen_type:
    height, width = curScreen.size
    min_x, min_y, max_x, max_y = 0, 0, width, height
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video = cv2.VideoWriter(args.savename, fourcc, args.fps, (height, width))
  else:
    point1, point2 = select_roi(curScreen)
    min_x = min(point1[0], point2[0])
    min_y = min(point1[1], point2[1])
    max_x = max(point1[0], point2[0])
    max_y = max(point1[1], point2[1])
    height, width = max_y - min_y, max_x - min_x
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video = cv2.VideoWriter(args.savename, fourcc, args.fps, (width, height))
 
  imageNum = 0
  while True:
    imageNum += 1
    captureImage = ImageGrab.grab() #  
    frame = cv2.cvtColor(np.array(captureImage), cv2.COLOR_RGB2BGR)
    if args.screen_type==0:
      frame = frame[min_y:max_y, min_x:max_x, :]
    
    if imageNum < args.fps * args.total_time:
      video.write(frame)
    #  
    if cv2.waitKey(50) == ord('q') or imageNum > args.fps * args.total_time:
      break
  video.release()
  cv2.destroyAllWindows()
이는python의 전체 화면 녹화 및 선택 영역 녹화 기능에 관한 글을 소개합니다. 더 많은 관련python 녹화 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기