在 opencv 中使用 gstreamer 从树莓派捕获流
capture stream from raspberrry pi using gstreamer in opencv
我正在尝试通过本地网络将来自 raspberry pi 摄像头的视频流式传输到我的 PC。
在 RaspberryPi 端,我通过以下命令使用 gstreamer:
raspivid -n -t 0 -rot 270 -w 960 -h 720 -fps 30 -b 6000000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=192.168.1.85 port=5000
而我在PC端使用如下命令:
gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
在这种情况下,可以显示视频并且一切正常。但是,我想在 C++ 程序中使用 OpenCV 捕获流。我正在尝试使用用 gstreamer-1.0 32 位编译的 OpenCV 3.2 来做到这一点。
当我运行以下代码尝试抓取流时:
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
cv::VideoCapture cap("udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! appsink");
return 0;
}
我收到以下错误:
GStreamer Plugin: Embedded video playback halted; module udpsrc0 reported: Internal data stream error.
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline) in cvCaptureFromCAM_GStreamer, file:\opencv\modules\videoio\src\cap_gstreamer.cpp, line 832
我能够使用 OpenCV 接收其他流,但我无法让它与 gstreamer 一起工作。
我搜索了这个问题,但没有找到任何有用的信息,所以非常感谢您的帮助。
我又试了一次这个问题,现在可以了。我会 post 我是如何做到的,希望其他人能过得更轻松。
我按照 wumpus 的说明进行了操作。
在pc端我运行:
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
cv::VideoCapture cap("udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! appsink sync=false");
return 0;
}
然后我 运行 在 raspberry pi:
gst-launch-1.0 rpicamsrc bitrate=3000000 ! video/x-h264, width=960, height=720 ! h264parse ! queue ! rtph264pay config-interval=1 pt=96 ! gdppay ! udpsink host=192.168.1.85 port=5000
要完成这项工作,您需要在 raspberry pi 上安装 gstreamer 和 rpicamsrc。
此外,您还需要在您的电脑上使用 gstreamer 32 位编译 opencv。先安装gstreamer,开发者版,然后编译opencv。有关在 visual studio.
中编译 opencv 的帮助,请参阅 this
我正在尝试通过本地网络将来自 raspberry pi 摄像头的视频流式传输到我的 PC。
在 RaspberryPi 端,我通过以下命令使用 gstreamer:
raspivid -n -t 0 -rot 270 -w 960 -h 720 -fps 30 -b 6000000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=192.168.1.85 port=5000
而我在PC端使用如下命令:
gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
在这种情况下,可以显示视频并且一切正常。但是,我想在 C++ 程序中使用 OpenCV 捕获流。我正在尝试使用用 gstreamer-1.0 32 位编译的 OpenCV 3.2 来做到这一点。
当我运行以下代码尝试抓取流时:
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
cv::VideoCapture cap("udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! appsink");
return 0;
}
我收到以下错误:
GStreamer Plugin: Embedded video playback halted; module udpsrc0 reported: Internal data stream error.
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline) in cvCaptureFromCAM_GStreamer, file:\opencv\modules\videoio\src\cap_gstreamer.cpp, line 832
我能够使用 OpenCV 接收其他流,但我无法让它与 gstreamer 一起工作。 我搜索了这个问题,但没有找到任何有用的信息,所以非常感谢您的帮助。
我又试了一次这个问题,现在可以了。我会 post 我是如何做到的,希望其他人能过得更轻松。
我按照 wumpus 的说明进行了操作。 在pc端我运行:
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
cv::VideoCapture cap("udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! appsink sync=false");
return 0;
}
然后我 运行 在 raspberry pi:
gst-launch-1.0 rpicamsrc bitrate=3000000 ! video/x-h264, width=960, height=720 ! h264parse ! queue ! rtph264pay config-interval=1 pt=96 ! gdppay ! udpsink host=192.168.1.85 port=5000
要完成这项工作,您需要在 raspberry pi 上安装 gstreamer 和 rpicamsrc。
此外,您还需要在您的电脑上使用 gstreamer 32 位编译 opencv。先安装gstreamer,开发者版,然后编译opencv。有关在 visual studio.
中编译 opencv 的帮助,请参阅 this