如何使用python cv2实时获取屏幕画面

如何使用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
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/1067665
  • 这篇博客你也可以参考下:python opencv cv2.VideoCapture()类
  • 除此之外, 这篇博客: opencv-python 人脸识别检测+人脸马赛克中的 cv2.VideoCapture()类 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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()

    效果图展示:

    没有效果图!!!!!

    还是蛮好玩的,大家也可以试一下!!!

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的段落1和段落2,我们可以使用cv2.VideoCapture来实时获取屏幕画面。具体实现步骤如下:

    1. 导入cv2模块。

    2. 创建一个VideoCapture对象,指定参数为0来打开默认摄像头。

    3. 创建一个while循环,不断读取每一帧的画面。

    4. 使用cap.read()方法获取每一帧的画面,并将返回值赋给ret和frame变量。

    5. 使用cv2.imshow()方法显示画面,第一个参数是窗口的名称,第二个参数是要显示的画面。

    6. 使用cv2.waitKey(1)检测用户按键,如果按键是'q',则退出循环。

    7. 在循环结束后,调用cap.release()释放摄像头资源。

    8. 最后调用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)

    希望以上内容对你有帮助!如果还有其他问题,请随时提问。