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的正则表达式re模块的常用方法
Mar 09 Python
python常规方法实现数组的全排列
Mar 17 Python
python中使用mysql数据库详细介绍
Mar 27 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
基于python的Paxos算法实现
Jul 03 Python
200行python代码实现2048游戏
Jul 17 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
python创建学生管理系统
Nov 22 Python
pytorch中的卷积和池化计算方式详解
Jan 03 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 define函数的使用说明
2008/08/27 PHP
php adodb介绍
2009/03/19 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
使javascript也能包含文件
2006/10/26 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
Python数据可视化图实现过程详解
2020/06/12 Python
python实现马丁策略的实例详解
2021/01/15 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
电子商务专业学生的学习自我评价
2013/10/27 职场文书
大学毕业后的十年规划
2014/01/07 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
节约电力资源的建议书
2014/03/12 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
体检通知范文
2015/04/21 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript