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 相关文章推荐
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
python发送邮件脚本
May 22 Python
基于python绘制科赫雪花
Jun 22 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
Python多线程threading模块用法实例分析
May 22 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
Python之字符串的遍历的4种方式
Dec 08 Python
判断Python中的Nonetype类型
May 25 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
信用卡效验程序
2006/10/09 PHP
PHP的中问验证码
2006/11/25 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
jquery radio 操作代码
2011/03/16 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
js实现密码强度检验
2017/01/15 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
python虚拟环境virualenv的安装与使用
2016/12/18 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
农田水利实习自我鉴定
2013/09/19 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
母校寄语大全
2014/04/10 职场文书
公司放假通知范文
2015/04/14 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
学习计划是什么
2019/04/30 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫