无法使用 mss 和 cv2 录制屏幕
Can't record screen using mss and cv2
我有以下代码
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,虽然在 window 中显示正常,但生成了 5kb 的大文件,我无法播放。
使用 PIL.ImageGrab(此处未包含)工作正常,所以我想知道 mss 具体有什么问题。
我做错了什么,我该如何解决问题?
OS: 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 returns 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)
我有以下代码
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,虽然在 window 中显示正常,但生成了 5kb 的大文件,我无法播放。
使用 PIL.ImageGrab(此处未包含)工作正常,所以我想知道 mss 具体有什么问题。
我做错了什么,我该如何解决问题?
OS: 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 returns 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)