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使用7z解压软件备份文件脚本分享
Feb 21 Python
Python获取服务器信息的最简单实现方法
Mar 05 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
Python导入模块时遇到的错误分析
Aug 30 Python
python 文件操作删除某行的实例
Sep 04 Python
Python算法之求n个节点不同二叉树个数
Oct 27 Python
基于python指定包的安装路径方法
Oct 27 Python
pycharm的console输入实现换行的方法
Jan 16 Python
Python调用.NET库的方法步骤
Dec 27 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
利用Pycharm连接服务器的全过程记录
Jul 01 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
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
深入解析php之sphinx
2013/05/15 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
nodeJS微信分享
2017/12/20 NodeJs
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
在python中修改.properties文件的操作
2020/04/08 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
外语专业毕业生自我评价分享
2013/10/05 职场文书
应届生保险求职信
2013/11/11 职场文书
2013英文求职信模板范文
2013/11/15 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
工作会议欢迎词
2014/01/16 职场文书
工作表现评语
2014/01/19 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
高校十八大报告感想
2014/01/27 职场文书
5s推行计划书
2014/05/06 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js