4

Opencv(C ++)を使用してリアルタイムオプティカルフローアプリを開発しています。Lucas-Kanade Trackingメソッドを適用するために、2つの連続するフレームをキャプチャする方法がわかりません。

これは機能しません:

CvCapture* capture = cvCaptureFromCAM(1);
IplImage *imgA=cvQueryFrame( capture );
IplImage *imgB=cvQueryFrame( capture );

私もこれを試しましたが、プログラムはループを終了しません:

CvCapture* capture = cvCaptureFromCAM(1);
IplImage *imgA=cvQueryFrame( capture );
IplImage *imgB=cvCreateImage(cvSize(imgA),IPL_DEPTH_32F,3);
while(cvNorm(imgA,imgB)==0)
    imgB=cvQueryFrame( capture );

何か案は?これがばかげた質問ではないことを願っていますが、私はそれが:/事前に申し訳ありません。ありがとう!!

4

4 に答える 4

4
cv::Mat m1, m2;
cv::VideoCapture cap(0);

if(!cap.isOpened())
    ;// ... throw error here

cap >> m1;
cap >> m2;

// m1 and m2 now contain consecutive frames.
于 2011-04-29T10:15:44.553 に答える
1

ここでは、ループの前に1つのクエリを作成し、ループ内に別のクエリを作成するだけで十分な場合があります(擬似コード)。

IplImage prev = query(capture)

while(1)
   next = query(capture )

   opticalflow( prev, next )

   prev = cvCopy( next )
于 2013-02-12T09:31:36.720 に答える
1

元のコードが機能しない理由を説明します。cvQueryFrameは、毎回同じバッファを再利用します。だからあなたがするとき:

IplImage *imgA=cvQueryFrame( capture );

画像が保持されている彼の内部バッファへのポインタを取得します。今やっているとき:

IplImage *imgB=cvQueryFrame( capture );

画像が書き換えられ、同じバッファへのポインタが与えられます。ImgA==ImgB。最初のフレームをクエリした後にコピーを作成する必要があります。そうすれば、すべてが機能します。

于 2013-02-12T05:25:30.857 に答える
0
Mat* mImg;
IplImage* _image;
IplImage* image;
CvCapture* capture = cvCaptureFromCAM(0);

for (int i = 0; i < 15; i++) {
    _image = cvQueryFrame(capture);
}

*image = *_image;

私はいつもこれで状況0xC0000005に会います。私のコードに何か問題があるのだろうか。を使用image = _imageします。これ_image = cvQueryFrame(capture);は、キャプチャのバッファを指しているだけなので、別のメモリ状況でフレームを保存できます。

于 2017-08-03T09:12:38.540 に答える