我的问题是:
我在做我的电脑视觉项目。我使用opencv(4.1.2)和python来实现它。
我需要一种更快的方式将读取帧传递到我的计算机上的图像处理(Ubuntu18.04 8核i7 3.00GHz内存32 to )。cv2.VideoCapture.read()
读取帧(帧大小: 720x1280)大约需要120~140 120。太慢了。我的处理模块每次运行大约需要40 is。我们需要25~30 FPS。
到目前为止,下面是我的演示代码:
import cv2
from collections import deque
from time import sleep, time
import threading
class camCapture:
def __init__(self, camID, buffer_size):
self.Frame = deque(maxlen=buffer_size)
self.status = False
self.isstop = False
self.capture = cv2.VideoCapture(camID)
def start(self):
print('camera started!')
t1 = threading.Thread(target=self.queryframe, daemon=True, args=())
t1.start()
def stop(self):
self.isstop = True
print('camera stopped!')
def getframe(self):
print('current buffers : ', len(self.Frame))
return self.Frame.popleft()
def queryframe(self):
while (not self.isstop):
start = time()
self.status, tmp = self.capture.read()
print('read frame processed : ', (time() - start) *1000, 'ms')
self.Frame.append(tmp)
self.capture.release()
cam = camCapture(camID=0, buffer_size=50)
W, H = 1280, 720
cam.capture.set(cv2.CAP_PROP_FRAME_WIDTH, W)
cam.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, H)
# start the reading frame thread
cam.start()
# filling frames
sleep(5)
while True:
frame = cam.getframe() # numpy array shape (720, 1280, 3)
cv2.imshow('video',frame)
sleep( 40 / 1000) # mimic the processing time
if cv2.waitKey(1) == 27:
cv2.destroyAllWindows()
cam.stop()
break
我试过的是:
,
下面
解决方案之一的指出,他可以每隔1秒在mac上读取和保存100个帧。为什么我的机器不能处理帧读取工作?我漏掉了什么吗?我的安装使用了conda和pip conda install -c conda-forge opencv
**,** pip install opencv-python
**(yes,,我尝试了两者。)**
另一个解决方案(1拇指向上)使用ffmpeg解决方案。但是它似乎是用于视频文件,而不是相机设备?
然后,我知道我只是需要一些关键字来跟踪。
以上代码是我的演示代码,到目前为止,我需要一些方法或指南,以使我的videoCapture.read()更快。可能是一种在videoCapture对象或其他相机读取模块中使用多线程的方法。
有什么建议吗?
发布于 2020-11-07 21:18:47
这有点晚,但我想知道这与我的罗技C920高清专业USB摄像头在Ubuntu20.04和OpenCV。我试图命令捕获会话运行全HD @ 30 FPS,但FPS在4-5 FPS之间波动。
我的相机的捕获格式默认为"YUYV 4:2:2“。无论我如何尝试更改视频捕获设置,OpenCV都没有神奇地更改视频格式以匹配例如所需的FPS设置。
当我列出罗技C920的视频格式时,它透露:
ubuntu:~$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
<clip>
Size: Discrete 1600x896
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 2304x1296
Interval: Discrete 0.500s (2.000 fps)
[1]: 'MJPG' (Motion-JPEG, compressed)
<clip>
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
解决方案是手动命令OpenCV捕获设备使用压缩的“MJPG”格式:
import numpy as np
import cv2
capture = cv2.VideoCapture(0)
W, H = 1920, 1080
capture.set(cv2.CAP_PROP_FRAME_WIDTH, W)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, H)
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
capture.set(cv2.CAP_PROP_FPS, 30)
发布于 2021-05-13 18:27:04
--这是有史以来最好的解决方案
从这里
capture = cv2.VideoCapture(0)
至
capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)
我搜索了很长时间,但没有找到最好的解决方案,但这个解决方案工作速度更快,打开cv2视频捕捉尝试,现在希望对您有用。只需使用cv2.VideoCapture(0, cv2.CAP_DSHOW)
发布于 2021-11-23 00:29:14
在我的例子中,我设置了这样的摄像机(在c++代码中):
// cam is cv::VideoCapture object
cam.set(cv::CAP_PROP_BUFFERSIZE, 1);
cam.set(cv::CAP_PROP_FPS, 20); // set fps before set fourcc
cam.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
CAP_PROP_BUFFERSIZE
并不重要,但CAP_PROP_FPS
必须在CAP_PROP_FOURCC
之前设置。
通过这个设置,我的相机fps从5增加到20。
https://stackoverflow.com/questions/59726776
复制相似问题