我试图从一个IP摄像头实时捕捉图像。 流工作得很好的VLC,但OpenCV中的cvQueryFrame()
似乎混杂和腐败传入的图像不承认的地步。
再次,从文件获取工作正常,但不能实时流。 如果它的确与众不同,我使用的是RTSP连接的URL; 我也有两个不同型号的相机(不同品牌)试过了,但问题仍然存在。
:另外,(我假设)编解码器输出以下类型的多个错误Error at MB: 1746
和concealing 6000 DC, 6000 AC, 6000 MV errors
。
我能做什么?
更新:所述序列中的第一误差总是cannot parallelize deblocking type 1, decoding such frames in sequential order
更新2:好吧,看来OpenCV的/ FFmpeg中有RTSP / H264流的问题。 我已经试过了Qt声子库,也没有工作,我已经给了LIVE555库的快速概述。 最后这似乎工作,因为大家都说它的意义,而实际上应用实例(OpenRTSP)扮演我流良好。 然而,相当诚实,越来越交手与LIVE555代码似乎是一个漫长的事情,我几乎现在就可以买得起。 除非任何其他选择,我想我得走这条路。
有没有想到任何其他的解决办法?
更新3:我从LIVE555代码工作的测试RTSP客户端,所以我知道如何提取从流H264帧信息,但现在我需要重组该帧信息转化为实际显示的帧,这似乎并不喜欢的事直截了当! 任何熟悉LIVE555知道如何做到这一点? 谢谢。
看来你需要一个额外的软件层来捕捉流数据包并在本地重建图像,然后养活他们的OpenCV。 您可以轻松地libVLC实现这一目标。 这也将避免编解码器的问题,因为你可以用libVLC解析几乎所有的编解码器,然后喂生帧OpenCV的。
我不知道这是否有助于(因为我不是一个有经验的C ++开发),但我最近设法从流IP摄像机 。 这里有一个快速测试:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
VideoCapture ipCam;
Mat frame;
const string LOCATION = "rtsp://192.168.0.200:554/rtsph264vga";
if(!ipCam.open(LOCATION)) {
cout << "Error opening video stream or file" << endl;
return -1;
}
for(;;) {
if(!ipCam.read(frame)) {
cout << "No frame" << endl;
waitKey();
}
imshow("cam", frame);
if(waitKey(1) >= 0) break;
}
return 0;
}
前往前C ++我设置相机导出到H264 VGA并确保我有在VLC运行流(因为它是默认情况下不上我一起工作的凸轮启用)。 我使用的OpenCV 2.4.1 fffmpeg启用。 据我了解与OpenCV的ffmpeg的整合可从OpenCV的2.0以上。
当我不得不整合,因为我有64位拱建OpenCV的和的ffmpeg +依赖性合并与其他C ++代码的CV代码我也遇到一些问题。 和其他代码是依靠许多32位的库。 该VideoCapture类是highgui LIB的一部分,主要是你需要担心的一个。 如果它不与ffmpeg的支持编译你会得到一个错误或警告如VideoCapture将无法进行转码的内容。
不知道这是最好的选择,但你可以尝试以流/(在开源/网络选项卡滴答流/保存)从转码VLC流
下面的代码片段,我用来捕捉从摄像头帧。 它的工作对我来说,希望它为你的作品,以及...
int main(int argc, char* argv[])
{
CvCapture *capture = NULL;
IplImage* frame=NULL;
int key =0;
capture = cvCaptureFromCAM(0);
if (!capture) {
printf("Cannot initailize webcam");
return 1;
}
cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
while(key != 'q')
{
frame=cvQueryFrame(capture);
if(!frame) break;
cvShowImage("result",frame);
key=cvWaitKey(10);
frame=NULL;
}
cvDestroyWindow("result");
cvReleaseCapture(&capture);
return 0;
}
对于OpenCV的2.3.1我写了这个代码,它正常工作,也就是我从相机饲料获得的图像。
VideoCapture cap(0);
if(!cap.isOpened())
{
cout<<"Camera is not connected"<<endl;
getchar();
}
namedWindow("Camera Feed",1);
for(;;)
{
Mat frame;
cap >> frame;
imshow("Camera Feed", frame);
if(!frame.empty())
detectAndDisplay(frame);
else
cout<<"No frame as input"<<endl;
int c=waitKey(10);
if(c==27)
break;
}
return 0;
正如你所看到的,它需要输入和连续地显示它,如果你按ESC键键盘上的退出。 下面是它具有相同的一组是CV 2.3命令为CV 2.1的文档。 该命令从2.4我想改变,虽然我也不太清楚这件事。 希望能帮助到你。:)