Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t使用mss和cv2记录屏幕_Python_Cv2_Python Mss - Fatal编程技术网

Python Can';t使用mss和cv2记录屏幕

Python Can';t使用mss和cv2记录屏幕,python,cv2,python-mss,Python,Cv2,Python Mss,我有以下代码 from mss import mss import cv2 import numpy class MSSSource: def __init__(self): self.sct = mss() def frame(self): monitor = {'top': 0, 'left': 0, 'width': 640, 'height': 480} grab = self.sct.grab(monitor)

我有以下代码

from mss import mss
import cv2
import numpy


class MSSSource:
    def __init__(self):
        self.sct = mss()

    def frame(self):
        monitor = {'top': 0, 'left': 0, 'width': 640, 'height': 480}
        grab = self.sct.grab(monitor)
        return True, numpy.array(grab)

    def release(self):
        pass


class CapSource:
    def __init__(self):
        self.cap = cv2.VideoCapture(0)

    def frame(self):
        return self.cap.read()

    def release(self):
        self.cap.release()


if __name__ == '__main__':
    fourcc = cv2.VideoWriter_fourcc(*'DIVX')
    out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
    source = MSSSource()

    while (True):
        ret, frame = source.frame()
        if not ret:
            break
        out.write(frame)
        cv2.imshow('hello', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    out.release()
    source.release()
    cv2.destroyAllWindows()
使用CapSource,我可以从我的相机录制工作视频

MSSSource在窗口中显示精细时,生成了5kb的大文件,我无法播放

使用PIL.ImageGrab(此处不包括)效果很好,因此我想知道mss的具体问题是什么

我做错了什么,如何解决问题


操作系统:Windows 10

MSSSource.frame()
重新定义为:

def frame(self):
    monitor = {'top': 0, 'left': 0, 'width': 640, 'height': 480}
    im = numpy.array(self.sct.grab(monitor))
    im = numpy.flip(im[:, :, :3], 2)  # 1
    im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)  # 2
    return True, im

MSS以
BGRA
形式返回原始像素(蓝色、绿色、红色、Alpha)。因此#1将从
BGRA
重塑为
BGR
,#2将
BGR
转换为
RGB
,正如guest-418所说,您需要使用cv2.cvtColor()从BGRA转换为BGR,例如:

with mss.mss() as sct:
    sct_img = sct.grab(zone)
    img = cv2.cvtColor(numpy.array(sct_img), cv2.COLOR_BGRA2BGR)
    cv2.imwrite("img.png", img)

cv2已经使用BGR,所以不需要转换,丢弃alpha通道就足够了。
numpy.flip(im,2)
cv2.cvtColor(im,cv2.COLOR\u BGR2RGB)
基本上执行相同的转换-交换图像每个像素中的第一个字节和最后一个字节。因此,应用这两种方法都没有效果。我认为#1和#2应该用
im=im[:,:,:3]
im=cv2.cvtColor(im,cv2.COLOR\u BGRA2BGR)
来代替。似乎只要使用
np.array(self.sct.grab(monitor))[:,:,:3]
,就足够了,这样就可以将阿尔法通道从传递给
cv2.VideoWriter.write