opencv - 通过 OpenCV 使用 Gstreamer 流式传输实时 MJPEG 视频
问题描述
我有一个可以传输 MJPEG 视频的 USB 网络摄像头。我正在尝试在笔记本电脑上将流读入 OpenCV,对 OpenCV 中的帧进行一些处理,然后通过 UDP 将流发送到树莓派。
使用 gstreamer 命令行界面,我可以将网络摄像头提要直接从笔记本电脑发送到树莓派。我在笔记本电脑上运行这个命令:
gst-launch-1.0 v4l2src device=/dev/video1 ! image/jpeg,width=640,height=480,framerate=30/1 ! jpegparse ! rtpjpegpay ! udpsink host=10.1.10.77 port=8090
这是来自 Pi:
gst-launch-1.0 udpsrc address=10.1.10.77 port=8090 ! application/x-rtp, encoding-name=JPEG,payload=96 ! rtpjpegdepay ! jpegdec ! videoconvert ! fbdevsink device=/dev/fb0
视频显示在 Pi 的屏幕中间,一切正常。但是,当我尝试将 OpenCV 引入这个过程时,我感到很困惑。以下代码成功发送视频...
import cv2
# Object that pulls frames from webcam
cap_fetch = cv2.VideoCapture(1)
cap_fetch.set(cv2.CAP_PROP_FRAME_WIDTH,640);
cap_fetch.set(cv2.CAP_PROP_FRAME_HEIGHT,480);
# Object that sends frames over gstreamer pipeline
cap_send = cv2.VideoWriter('appsrc ! videoconvert ! video/x-raw,format=YUY2 ! jpegenc ! rtpjpegpay ! udpsink host=10.1.10.77 port=9000', 0, 0 , 30, (640,480))
if not cap_fetch.isOpened() or not cap_send.isOpened():
print('VideoCapture or VideoWriter not opened')
exit(0)
while True:
ret,frame = cap_fetch.read()
if not ret:
print('empty frame')
break
# do stuff to frame
cap_send.write(frame)
cv2.imshow('send', frame)
if cv2.waitKey(1)&0xFF == ord('q'):
break
cap_fetch.release()
cap_send.release()
...但是如果我选择除 YUY2 之外的任何格式,或者我尝试这样的事情,它都不起作用:
cap_send = cv2.VideoWriter('appsrc ! image/jpeg ! jpegenc ! rtpjpegpay ! udpsink host=10.1.10.77 port=9000', 0, cv2.VideoWriter_fourcc('M','J','P','G'), 30, (640,480))
知道为什么会这样吗?我对 gstreamer 很陌生,但我认为从 OpenCV 到 Pi 的工作管道正在将原始 BGR 图像矩阵从 openCV 转换为 YUY2 视频,然后转换为 MJPEG 视频,然后发送——这似乎效率不高,或者我错过了什么吗?有没有更清洁的方法来做到这一点?
解决方案
推荐阅读
- ios - 自类型的协议功能
- coldfusion - 从字符串coldfusion中删除数字
- python-3.x - ImportError:使用 EdjeElectronics 教程通过 tensorflow 训练图像时无法导入名称“coco”
- r - 将静态数字/字符向量分配给 data.tree 中的节点
- wordpress - 如何在 wordpress 5.1 中创建自定义块
- ios - 如何将两个不同的 UIPickerView 数据添加到单个标签中?
- php - jQuery.post 修改 html 地址
- mysql - 首先获取最后一条记录,然后按升序获取其余记录
- android-studio - 更新到 3.3.2 后的 Android Studio 错误 gradle 同步问题
- javascript - JavaScript AddEventListener 无法正常工作