如何使用python cv2实时获取屏幕画面,就像cv2.VideoCapture一样
可以参考https://python-mss.readthedocs.io/examples.html#opencv-numpy
import numpy as np
import cv2
from mss import mss
from PIL import Image
mon = {'left': 400, 'top': 0, 'width': 200, 'height': 200}
with mss() as sct:
while True:
screenShot = sct.grab(mon)
img = Image.frombytes(
'RGB',
(screenShot.width, screenShot.height),
screenShot.rgb,
)
cv2.imshow('test', np.array(img))
if cv2.waitKey(33) & 0xFF in (
ord('q'),
27,
):
break
VideoCapture()
是用于从视频文件、图片序列、摄像头捕获视频的类;
VideoCapture()
中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频 ,
(1)ret,frame = cap.read()
cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
(2)cap.isOpened()
摄像头初始化,返回true则成功
import cv2 as cv
import numpy as np
if __name__ == '__main__':
# 实例化控制摄像头的类
cap = cv.VideoCapture(0)
# cap = cv.VideoCapture("视频文件路径")
# cap.isOpened() 摄像头初始化,返回true则成功
while cap.isOpened():
# 读取一帧图像,ret :是否读取正确 , frame : 读取的图像
ret,frame = cap.read()
# 加载模型文件
face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
# 执行模型,左上顶点(x,y)和w(宽),h(高)
faces = face.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4)
# 循环遍历识别到的每一张人脸数据
for x, y, w, h in faces:
# 在人脸上加马赛克
frameBox = frame[y:y+h,x:x+w]
frameBox = frameBox[::10,::10]
frameBox = np.repeat(frameBox,10,axis=0)
frameBox = np.repeat(frameBox, 10, axis=1)
a,b = frame[y:y + h, x:x + w].shape[:2]
frame[y:y + h, x:x + w] = frameBox[:a,:b]
# 在人脸周围画框
cv.rectangle(frame, (x, y), (x + w, y + h), [0, 0, 255], 2)
# 展示照片
cv.imshow('frame', frame)
# 1ms 读取一帧
k = cv.waitKey(1)
print(k)
# 按“q”退出
if k == ord('q'):
break
cv.destroyAllWindows()
效果图展示:
没有效果图!!!!!
还是蛮好玩的,大家也可以试一下!!!
根据参考资料中的段落1和段落2,我们可以使用cv2.VideoCapture来实时获取屏幕画面。具体实现步骤如下:
导入cv2模块。
创建一个VideoCapture对象,指定参数为0来打开默认摄像头。
创建一个while循环,不断读取每一帧的画面。
使用cap.read()方法获取每一帧的画面,并将返回值赋给ret和frame变量。
使用cv2.imshow()方法显示画面,第一个参数是窗口的名称,第二个参数是要显示的画面。
使用cv2.waitKey(1)检测用户按键,如果按键是'q',则退出循环。
在循环结束后,调用cap.release()释放摄像头资源。
最后调用cv2.destroyAllWindows()关闭所有窗口。
下面是具体的代码实现:
import cv2
cap = cv2.VideoCapture(0) # 打开默认摄像头
while True:
ret, frame = cap.read() # 读取每一帧的画面
cv2.imshow("Screen", frame) # 显示画面
if cv2.waitKey(1) & 0xFF == ord('q'): # 检测按键
break
cap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭窗口
注意:上述代码中,摄像头的采集速度是受计算机性能限制的,如果感觉画面卡顿或延迟严重,可以适当调整cv2.waitKey()
方法的参数来增加等待时间,例如改为cv2.waitKey(10)
。
希望以上内容对你有帮助!如果还有其他问题,请随时提问。