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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Python的subprocess模块总结
Nov 07 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python元字符的用法实例解析
Jan 17 Python
python实现Adapter模式实例代码
Feb 09 Python
Python搭建Spark分布式集群环境
Jul 05 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 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类
2006/11/27 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
jQuery版Tab标签切换
2011/03/16 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python编程线性回归代码示例
2017/12/07 Python
python字符串string的内置方法实例详解
2018/05/14 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
python程序控制NAO机器人行走
2019/04/29 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
行政人员岗位职责
2013/12/08 职场文书
入学生会自荐书范文
2014/02/05 职场文书
租赁协议书范本
2014/04/22 职场文书
说明书范文
2014/05/07 职场文书
医德考评自我评价
2014/09/14 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
雷锋之歌观后感
2015/06/10 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang