无法使用MSS和CV2录制屏幕

时间:2018-07-23 23:02:26

标签: 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)
        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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

正如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)