最近给客户演示程序运行结果,我就想到用Python写一个录屏程序,在网上能找到现成的源码,但是它的录屏是录制整个屏幕的。但是在屏幕桌面下方的任务栏工具栏里有些东西,不希望被录制到视频里,因此需要实现一个选择区域录屏,就像qq截图那样的。我编写的程序如下,在主函数的输入参数里有一个选项控制是全屏录制还是选择区域录制。在编写这个程序时,我有一个疑问,在初始化写视频VideoWriter函数的第4个参数,它表示视频帧的高和宽,
全屏录制方式的参数是(height,width),选择区域录制的参数是(width,height)。我曾尝试过把这个参数统一写成(height,width)或者(width,height)。但是运行程序后,总有一种录屏方式保存的视频文件是无法打开的,文件大小是1kb,不知这是为何?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
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录屏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/nihate/article/details/113662290