将ffmpeg流传递到OpenCV

将ffmpeg流传递到OpenCV,opencv,ffmpeg,raspivid,Opencv,Ffmpeg,Raspivid,我想使用重定向操作符将流从ffmpeg带到cv2,这样我可以识别或标记流上的面,并再次重定向此流,使其在另一个流下运行 一个没有人脸检测,一个没有人脸检测 raspivid -w 1920 -h 1080 -fps 30 -o - -t 0 -vf -hf -b 6000000 | ffmpeg -f h264 -i - -vcodec copy -g 50 -strict experimental -f tee -map 0:v "[f=flv]rtmp://xx.xx.xx.xx/

我想使用重定向操作符将流从ffmpeg带到cv2,这样我可以识别或标记流上的面,并再次重定向此流,使其在另一个流下运行

一个没有人脸检测,一个没有人脸检测

raspivid -w 1920 -h 1080 -fps 30 -o - -t 0 -vf -hf -b 6000000 | ffmpeg -f h264 -i - -vcodec copy -g 50 -strict experimental -f tee -map 0:v "[f=flv]rtmp://xx.xx.xx.xx/live/withoutfacedetect |[f=h264]pipe:1" > test.mp4
然后我读了CV2,偶然发现了这篇文章

然后我用我的照片运行脚本,非常惊讶我的脸周围有一个正方形

但现在回到正题上来。最好的方法是什么


多亏了@Mark Setchell,我忘了提到我使用的是覆盆子Pi 4。

我仍然无法100%确定您真正想做什么,而且我的想法超出了我在评论中所能表达的范围。我还没有尝试所有我认为你正在尝试做的事情,我可能想得太多了,但是如果我放下我的思路,也许其他人会加入一些有用的想法/更正

好的,视频流最初以RGB或YUV的形式从摄像机进入Raspberry Pi。使用
ffmpeg
将其编码到h264,并将其传递到
stdin
上的OpenCV似乎很愚蠢,但当遇到问题时,OpenCV无法轻松将其解码回BGR或它自然喜欢使用的任何人脸检测工具

因此,我想我应该将参数改为
raspivid
,这样它就可以生成RGB数据帧,并删除所有h264比特率的内容,即

raspivid -rf rgb  -w 1920 -h 1080 -fps 30 -o - | ffmpeg ...
现在,RGB进入了
ffmpeg
,因此您需要使用
tee
map
类似于您已经拥有的,并将
RGB
发送到其
stdin
上的OpenCV,并将第二个流编码到
rtmp

然后在OpenCV中,您只需从
stdin
执行1920x1080x3字节的
read()
,即可获得每个帧。该帧将采用RGB格式,但您可以使用:

cv2.cvtColor(cv2.COLOR_RGB2BGR)
要按照OpenCV的要求将频道重新排列到BGR,需要

stdin
读取数据时,需要执行以下操作:

frame = sys.stdin.buffer.read(1920*1080*3)
而不是:

frame = sys.stdin.read(1920*1080*3)

这会损坏二进制数据,如图像。

您的问题引发了几个问题。1) 你用的是覆盆子皮,不是吗?你好像没提那件事。2) 您是想在网络上传输这些信息,还是所有这些信息都是您的Raspi本地的?这会对带宽/压缩产生影响。3) 为什么有
-acodec XX-ab XX
?当然没有音频,您想要
-一个
?4) 你的问题是“如何将
raspivid
流到OpenCV中”?谢谢,我换了帖子。我拿出了音频标签。忘了从模板里拿出来。我想在互联网上传输这个。那么你想用
raspivid
阅读Raspberry Pi摄像头,用Python处理它吗?(C++?)在Raspberry Pi上,然后在您的网络上传输,或者在网络上传输并在其他地方处理?同时还将未处理的流发送到Raspberry Pi上的磁盘文件?是的,我想使用raspivid读取相机,将此流传输到ffmpeg,然后将流从ffmpeg传输到OpenCV,然后再次作为第二个流。