python实现录制全屏和选择区域录屏功能


Posted in Python onFebruary 05, 2021

最近给客户演示程序运行结果,我就想到用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录屏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python冒泡排序算法的实现代码
Nov 21 Python
Python正则表达式的使用范例详解
Aug 08 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
Python中类型检查的详细介绍
Feb 13 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 Python
在pycharm中实现删除bookmark
Feb 14 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 Python
七个Python必备的GUI库
Apr 27 Python
python中pycryto实现数据加密
Apr 29 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 #Python
通用的Django注册功能模块实现方法
Feb 05 #Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 #Python
ASP.NET Core中的配置详解
Feb 05 #Python
pycharm 的Structure界面设置操作
Feb 05 #Python
Python实现疫情地图可视化
Feb 05 #Python
pycharm 实现调试窗口恢复
Feb 05 #Python
You might like
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
php读取mysql的简单实例
2014/01/15 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
javascript 操作文件 实现方法小结
2009/07/02 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
浅谈Node.js 沙箱环境
2018/05/15 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python解决网站的反爬虫策略总结
2016/10/26 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
Python之循环结构
2019/01/15 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
酒店管理毕业生自我鉴定
2014/03/02 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书