OpenCV的/ FFmpeg的图像捕获问题(OpenCV/FFMpeg image capture

2019-07-30 05:44发布

我试图从一个IP摄像头实时捕捉图像。 流工作得很好的VLC,但OpenCV中的cvQueryFrame()似乎混杂和腐败传入的图像不承认的地步。

再次,从文件获取工作正常,但不能实时流。 如果它的确与众不同,我使用的是RTSP连接的URL; 我也有两个不同型号的相机(不同品牌)试过了,但问题仍然存在。

:另外,(我假设)编解码器输出以下类型的多个错误Error at MB: 1746concealing 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知道如何做到这一点? 谢谢。

Answer 1:

看来你需要一个额外的软件层来捕捉流数据包并在本地重建图像,然后养活他们的OpenCV。 您可以轻松地libVLC实现这一目标。 这也将避免编解码器的问题,因为你可以用libVLC解析几乎所有的编解码器,然后喂生帧OpenCV的。



Answer 2:

我不知道这是否有助于(因为我不是一个有经验的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流



Answer 3:

下面的代码片段,我用来捕捉从摄像头帧。 它的工作对我来说,希望它为你的作品,以及...

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;
}


Answer 4:

对于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我想改变,虽然我也不太清楚这件事。 希望能帮助到你。:)



文章来源: OpenCV/FFMpeg image capture problems