我正在使用 Python 2.7 和 OpenCV 2.4.9 。
我需要捕获正在向用户显示的当前帧,并将其作为 cv :: Mat 对象加载到Python中。
你们知道一种快速的递归方法吗?
我需要像下面示例中所做的那样,以递归方式从网络摄像头捕获 Mat 帧:
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('WindowName', frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
cap.release()
cv2.destroyAllWindows()
break
在示例中,它使用 VideoCapture类来处理来自网络摄像头的捕获图像。
使用VideoCapture.read(),新帧始终被呈现并存储到 Mat 对象中。
我可以将“printscreens stream”加载到VideoCapture对象中吗?我是否可以使用Python中的OpenCV创建计算机屏幕流,而无需每秒保存和删除大量 .bmp 文件?
我需要这些帧是 Mat 对象或 NumPy数组 ,所以我可以执行一些计算机视觉具有此帧的实时例程。
答案 0 :(得分:26)
这是我用@Raoul提示编写的解决方案代码。
我使用PIL ImageGrab模块来抓取printcreen框架。
import numpy as np
from PIL import ImageGrab
import cv2
while(True):
printscreen_pil = ImageGrab.grab()
printscreen_numpy = np.array(printscreen_pil.getdata(),dtype='uint8')\
.reshape((printscreen_pil.size[1],printscreen_pil.size[0],3))
cv2.imshow('window',printscreen_numpy)
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
答案 1 :(得分:18)
我的其他解决方案存在帧速率问题,mss解决了这些问题。
import numpy as np
import cv2
from mss import mss
from PIL import Image
mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}
sct = mss()
while 1:
sct.get_pixels(mon)
img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
cv2.imshow('test', np.array(img))
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
答案 2 :(得分:4)
这是@Neabfi的答案的更新答案
import time
import cv2
import numpy as np
from mss import mss
mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}
with mss() as sct:
# mon = sct.monitors[0]
while True:
last_time = time.time()
img = sct.grab(mon)
print('fps: {0}'.format(1 / (time.time()-last_time)))
cv2.imw('test', np.array(img))
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
并保存到mp4视频
import time
import cv2
import numpy as np
from mss import mss
def record(name):
with mss() as sct:
# mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}
mon = sct.monitors[0]
name = name + '.mp4'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
desired_fps = 30.0
out = cv2.VideoWriter(name, fourcc, desired_fps,
(mon['width'], mon['height']))
last_time = 0
while True:
img = sct.grab(mon)
# cv2.imshow('test', np.array(img))
if time.time() - last_time > 1./desired_fps:
last_time = time.time()
destRGB = cv2.cvtColor(np.array(img), cv2.COLOR_BGRA2BGR)
out.write(destRGB)
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
record("Video")