1

openCVビデオ処理をしたいです。Xcode 4でopenCVを使用しているMacを使用しているので、実際のコードはObjectiveC++です。

ビデオのすべてのフレームにできるだけ速く(表示せず、ドロップなしで)アクセスし、それらに対して計算を行いたいです。

フレームを取得するための私のコード:

CvCapture* capture = cvCaptureFromFile("A MOVIE FILE HERE");

IplImage* frame;

 while(1) {
    frame = cvQueryFrame(capture);

    if (!frame) break;

       // openCV Stuff here...

    char c = cvWaitKey(1); 
    if(c==27) break;
}

速度はコーデック/解像度/ビットレートに大きく依存することは知っていますが、120%を超える速度では読み取れないようです...フレームをより速く取得する方法はありますか?

4

3 に答える 3

1

実際、プログラムの速度を低下させる原因は 1 つだけです。それwaitKeyQuentin Geissmannが既に述べたとおりです。そして、あなたが言うなら:

すでにそれを試しました-それについて言及するのを忘れました。物事を本当にスピードアップしませんでした。

私の環境でテストしたところ、30〜40%高速化したので、あなたを信じていません。

ベンチマークコードは次のとおりです。

#define WAIT_ON
int main()
{
    cv::Mat frame;
    cv::VideoCapture capture = cv::VideoCapture("video/in.avi");
    int k;

    double benchTime = (double)cv::getTickCount();
    while (1)
    {
        capture >> frame;
        if (!frame.data)
        {
            break;
        }

#ifdef WAIT_ON
        k = cv::waitKey(1);
        if (k == 27)
        {
            break;
        }
#endif
    }

    std::cout << ((double)cv::getTickCount() - benchTime)/cv::getTickFrequency() << std::endl;
}

ビデオ入力: 854x480, 24fps, 2:00

マクロWAIT_ONあり: ~11 秒

なし: ~7.3 秒

アップデート:

videostream の画像解像度を下げるには、次のパラメータを設定します。

CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.

in setmethod to other (320x240)。

于 2012-10-13T20:13:34.553 に答える
0

cv::waitKey()/cvWaitKey()が短い時間 (<10ms) では正確でないことに何度か気づきました。実際、私の場合、10ms 未満の値で少なくとも 10ms スリープするようです。誰かがこれについてもっと正確に説明できるかもしれませんが、ループから削除することをお勧めします (可能であれば)。

うまくいくといいのですが、頑張ってください

于 2012-10-13T19:27:12.717 に答える