2

カメラからビデオをキャプチャし、背景を削除した後、別のビデオにオーバーレイするOpenCVアプリケーションを構築しています。

バックグラウンド除去が3fpsで機能しているのに対し、出力を約1 fpsで再生しているため、妥当な速度を達成できません。

バックグラウンドビデオを通常の速度で表示し、処理されたビデオを3fpsでオーバーレイする方法はありますか?

コードをコメントアウトしてみたところ、問題は主にレンダリング部分自体にあることがわかりました。Webカメラフィードと一緒にビデオを表示しようとしましたが、openCVで表示すると、実際のfpsとビデオのfpsが低下することに気付きました。

サンプルコードは次のとおりです。

 void main()
{
    CvCapture* capture, *Vcap;
    capture = cvCaptureFromCAM(0);
    if(!capture)
    {
        printf("Video Load Error");
    }

    Vcap = cvCaptureFromAVI("bgDemo.mp4");
    //printf("\nEntered BGR");
    if(!Vcap)
    {
        printf("Video Load Error");
    }

    while(1)
    {

        IplImage* src = cvQueryFrame(Vcap);
        if(!src)
        {
            Vcap = cvCaptureFromAVI("bgDemo.mp4");
            continue;
        }
        IplImage* bck1 = cvCreateImage(cvGetSize(src),8,3);
        cvResize(src,bck1,CV_INTER_LINEAR);

        cvShowImage("BCK",bck1);
        cvWaitKey(1);
    }
}
4

1 に答える 1

6

な問題は、ループの最後に解放せずに、ループの反復ごとに新しいイメージを割り当てていることです。言い換えれば、あなたは美しいメモリリークを持っています。

より良いアプローチは、ループが始まる前にビデオのフレームを単につかむことです。これbck1により、適切なサイズで1回だけ作成できます。

コードには他にも問題があります。以下の修正バージョンを共有しています。コードのすべての行に注意を払い、何が変更されたかを確認してください。私はそれをテストする時間がありませんでしたが、あなたはそれを理解すると確信しています:

int main()
{
    // I know what you are doing, just one capture interface is enough
    CvCapture* capture = NULL; 

    capture = cvCaptureFromCAM(0);
    if(!capture)
    {
        printf("Ooops! Camera Error");            
    }

    capture = cvCaptureFromAVI("bgDemo.mp4");
    if(!capture)
    {
        printf("Ooops! Video Error");
        // if it failed here, it means both methods for loading a video stream failed.
        // It makes no sense to let the application continue, so we return.
        return -1; 
    }

    // Retrieve a single frame from the camera
    IplImage* src = cvQueryFrame(capture);
    if(!src)
    {
        printf("Ooops! #1 cvQueryFrame Error");
        return -1; 
    }

    // Now we can create our backup image with the right dimensions.
    IplImage* bck1 = cvCreateImage(cvGetSize(src),src->depth, src->nChannels);
    if(!bck1)
    {
        printf("Ooops! cvCreateImage Error");
        return -1; 
    }

    while(1)
    {
        src = cvQueryFrame(capture);
        if(!src)
        {
             printf("Ooops! #2 cvQueryFrame Error");  
             break; 
        }

        cvResize(src, bck1, CV_INTER_LINEAR);

        cvShowImage("BCK",bck1);
        cvWaitKey(10);
    }

    cvReleaseImage( &bck1 ); // free manually allocated resource

    return 0;
}

これらの修正により、アプリケーションが大幅に高速化されます。

于 2012-11-05T16:10:15.760 に答える