Python 树莓Pi和OpenCV的视频处理效率

Python 树莓Pi和OpenCV的视频处理效率,python,optimization,process,raspberry-pi3,opencv3.1,Python,Optimization,Process,Raspberry Pi3,Opencv3.1,目标是一个小型视频分析程序,带有覆盆子皮3 B,带有摄像头和体操电视。因此,程序将捕获摄像机的输入,将其缓冲一个设定的长度(比方说5秒),然后将其输出到屏幕。现在,在这个视频流中,应该可以通过以下功能像观看普通视频一样四处导航。停下来玩。倒带、更改速度、逐帧、向后或向前跳转设置帧数 现在我试图用Python和OpenCV实现这一点。我遇到的问题如下: 如果我捕获相机输出并用OpenCV将其写入文件,我会得到50-70%的CPU负载,并在其中显示延迟视图和导航。我似乎效率很低,因为我的帧速率为10

目标是一个小型视频分析程序,带有覆盆子皮3 B,带有摄像头和体操电视。因此,程序将捕获摄像机的输入,将其缓冲一个设定的长度(比方说5秒),然后将其输出到屏幕。现在,在这个视频流中,应该可以通过以下功能像观看普通视频一样四处导航。停下来玩。倒带、更改速度、逐帧、向后或向前跳转设置帧数

现在我试图用Python和OpenCV实现这一点。我遇到的问题如下:

如果我捕获相机输出并用OpenCV将其写入文件,我会得到50-70%的CPU负载,并在其中显示延迟视图和导航。我似乎效率很低,因为我的帧速率为10 fps,分辨率为720x400px,更高的帧速率会让你忘记性能,更少的帧速率会影响质量。我想指出的是,我正在使用线程来尝试改进fps。读取相机和读取文件都在分开的线程上运行

现在我发现使用raspivid写入文件的速度要快得多,因为它使用h264的硬件编码器,最终使用了0-1%的CPU。不幸的是,OpenCV(3.1.0)似乎与我生成的输出文件有问题。我正在创建一个.h264文件,然后使用OpenCV使用python脚本打开该文件。但OpenCV似乎无法读取关键帧,因为当我尝试更改要读取的下一帧时

cap.set(cv2.cap\u PROP\u POS\u框架、jumpToFrame)

然后再读一遍,它总是跳转到第0帧。当我尝试设置毫秒时也是如此

下面是我尝试过的不同raspivid配置的列表

raspivid -v -w 720 -h 400 -n -t 0 -fps 20 -o data.h264

raspivid -g 1 -v -w 720 -h 400 -n -t 100 -fps 20 -o data.h264

raspivid -g 1 -ih -qp 10 -v -pf main -w 720 -h 400 -n -t 100 -fps 20 -o data.h264
因此,我尝试使用-g 1参数更改raspivid关键帧的输出,但这似乎也无法解决问题。还玩了一些其他设置,但没有取得任何进展

现在来回答我的一些问题。您认为这个项目是否可以用Raspberry Pi实现,分辨率不低于720x400px,帧速率至少为20fps或更好的30fps

如果是的话,您认为将视频流的缓冲区写入一个文件以便在中间保存是一个好主意吗?或者我应该考虑保持变量吗?也许一份清单?但这看起来是个坏主意,因为opencv中的一个原始帧的大小似乎为7.1MB(我也尝试在文件中使用pytables编写numpy数组)

对于我来说,最接近于解决上述我无法解决的问题

我还考虑了输出流是否可以通过VLC或GStreamer进行选择。但我不确定是否可以解决关键帧问题

当我使用opencv和编解码器“MJPG”以及文件扩展名.avi编写文件时,关键帧处理在opencv中可以正常工作,但同时运行这两个关键帧的过程非常复杂,因为我只能获得8fps(在使用线程时,或者可能是因为我使用线程)

现在我不指望你能解决我所有的问题,我更想知道你的意见,你认为什么样的尝试最有希望