6

IPカメラからリアルタイムで画像をキャプチャしようとしています。ストリームはVLCで完全に機能しますが、OpenCVcvQueryFrame()は受信画像を混乱させ、認識できないほど破損させているようです。

繰り返しますが、ファイルからのキャプチャは正常に機能しますが、ライブストリームでは機能しません。違いが生じる場合は、rtsp接続URLを使用しています。また、2つの異なるカメラモデル(異なるブランド)でこれを試しましたが、問題は残っています。

その上、(私が想定している)コーデックは次の種類のいくつかのエラーを出力しています: 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 Phononライブラリを試しましたが、これも機能しません。Live555ライブラリの概要を簡単に説明しました。これは、誰もがそう言っているという意味で、最後に機能しているように見えます。実際、アプリケーション例(OpenRTSP)は、私のストリームをうまく再生します。ただし、正直に言うと、Live555コードを理解するのは時間のかかる作業のように思えますが、今のところ私にはほとんど余裕がありません。他の選択肢を除けば、私はそのルートに行かなければならないと思います。

頭に浮かぶ他の解決策はありますか?

更新3: Live555コードからテストRTSPクライアントを機能させたので、ストリームからh264フレーム情報を抽出する方法を知っていますが、今度はそのフレーム情報を実際の表示可能なフレームに再結合する必要があります。簡単です!Live555に精通している人は、これを行う方法を知っていますか?ありがとう。

4

4 に答える 4

3

それが役立つかどうかはわかりませんが(私は経験豊富な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でストリームが実行されていることを確認しました。fffmpegを有効にしてOpenCV2.4.1を使用しています。私が理解している限り、OpenCVとのffmpeg統合は、OpenCV2.0以降で利用できます。

OpenCVとffmpeg+の依存関係が64ビットアーチ用に構築されているため、cvコードを他のc++コードと統合してマージする必要があるときにいくつかの問題が発生しました。他のコードは多くの32ビットライブラリに依存していました。VideoCaptureクラスはhighguilibの一部であり、主に心配する必要があるクラスです。ffmpegサポートを使用してコンパイルされていない場合、VideoCaptureはコンテンツをトランスコードできないため、エラーまたは警告が表示されます。

それが最良のオプションかどうかはわかりませんが、VLCからストリームをストリーミング/トランスコードすることを試みることができます([オープンソース/ネットワーク]タブで[ストリーミング/保存]にチェックマークを付けることにより)

于 2012-07-23T08:18:44.617 に答える
2

ストリームパケットをキャプチャしてフレームをローカルで再構築し、それらをopenCVにフィードするには、追加のソフトウェアレイヤーが必要なようです。これは、libVLCを使用して簡単に実現できます。これにより、libVLCを使用してほぼすべてのコーデックを解析し、生のフレームをopenCVにフィードできるため、コーデックの問題も回避できます。

于 2012-07-23T16:16:28.633 に答える
1

これは、WebCamからフレームをキャプチャするために使用したコードスニペットです。それは私のために働いた、それがあなたのためにも働くことを願っています...

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;
}
于 2012-07-18T18:07:19.460 に答える
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を押すと終了します。 これは、CV2.3と同じコマンドセットを持つCV2.1のドキュメントですコマンドは2.4から変更されたと思いますが、よくわかりません。それが役に立てば幸い。:)

于 2012-07-19T04:25:24.723 に答える