C++ 通过录像机发送帧;can';无法再次捕获它(OpenCV 3.1,c+;+;)
我正在尝试编写一个简单的视频流应用程序,它执行以下任务:C++ 通过录像机发送帧;can';无法再次捕获它(OpenCV 3.1,c+;+;),c++,opencv,gstreamer,C++,Opencv,Gstreamer,我正在尝试编写一个简单的视频流应用程序,它执行以下任务: 从相机获取一帧(该部件正在工作) 修改框架 发送到gstreamer管道 代码: VLC玩家无法使用命令查看任何内容: vlc -vvv rtp://@localhost:5000 我试过: cv::VideoCapture cap("udpsrc port=5000 ! tsparse ! videoconvert ! appsink"); 但是它没有启动(没有错误日志,只是没有得到任何帧)。 我使用的是OpenCV 3.1,我已经
gstreamer
管道vlc -vvv rtp://@localhost:5000
我试过:
cv::VideoCapture cap("udpsrc port=5000 ! tsparse ! videoconvert ! appsink");
但是它没有启动(没有错误日志,只是没有得到任何帧)。
我使用的是OpenCV 3.1,我已经阅读了GStreamer
的支持文档。
有什么问题吗?在使用OpenCV的Gstreamer API之前,使用Gstreamer的命令行工具建立一个工作管道是很重要的 发件人: 工作管道:
gst-launch-1.0 -v v4l2src \
! video/x-raw, framerate=30/1, width=640, height=480, format=BGR \
! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 \
! rtpvrawpay ! udpsink host=127.0.0.1 port=5000
bool sender()
{
VideoCapture cap = VideoCapture("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=BGR ! appsink",cv::CAP_GSTREAMER);
VideoWriter out = VideoWriter("appsrc ! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 ! rtpvrawpay ! udpsink host=127.0.0.1 port=5000",CAP_GSTREAMER,0,30,Size(640,480));
if(!cap.isOpened() || !out.isOpened())
{
cout<<"VideoCapture or VideoWriter not opened"<<endl;
return false;
}
Mat frame;
while(true)
{
cap.read(frame);
if(frame.empty())
break;
/* Modify frame here*/
out.write(frame);
imshow("frame", frame);
if(waitKey(1) == 'q')
break;
}
cap.release();
out.release();
return true;
}
OpenCV代码:
gst-launch-1.0 -v v4l2src \
! video/x-raw, framerate=30/1, width=640, height=480, format=BGR \
! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 \
! rtpvrawpay ! udpsink host=127.0.0.1 port=5000
bool sender()
{
VideoCapture cap = VideoCapture("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=BGR ! appsink",cv::CAP_GSTREAMER);
VideoWriter out = VideoWriter("appsrc ! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 ! rtpvrawpay ! udpsink host=127.0.0.1 port=5000",CAP_GSTREAMER,0,30,Size(640,480));
if(!cap.isOpened() || !out.isOpened())
{
cout<<"VideoCapture or VideoWriter not opened"<<endl;
return false;
}
Mat frame;
while(true)
{
cap.read(frame);
if(frame.empty())
break;
/* Modify frame here*/
out.write(frame);
imshow("frame", frame);
if(waitKey(1) == 'q')
break;
}
cap.release();
out.release();
return true;
}
问题是我的openCV版本不支持gstreamer的VideoWriter。我把它改为3.3.0,它就可以工作了。你能显示更多的代码吗?尚不清楚
帧的来源。我有一个关于Gstream的问题,以及它们应用于帧的过滤器。。您能检查一下这个问题吗?这似乎是OpenCV 3.3.0以来的新版本(以前的版本中没有提到备用后端)。