2011-04-29 79 views
4

我正在開發一個Opencv(C++)實時光流應用程序。 我不明白如何捕捉兩個連續幀來應用Lucas-Kanade Tracking方法。Opencv從網絡攝像頭捕獲連續幀

這不起作用:

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

任何想法?我希望這不是一個愚蠢的問題,但我懷疑它是:/提前對不起。 謝謝!

+0

這是合乎邏輯的,它不會退出循環,因爲網絡攝像頭永遠不會停止將其饋送到圖像中。你有沒有嘗試用cvShowImage()在窗口中觀察結果? – 2011-04-29 09:13:56

+1

「連續」是什麼意思? – 2011-04-29 10:29:12

+0

我使用這個QTOpencv APP:[鏈接](http://qt-apps.org/content/show.php/Qt+Opencv+webcam+viewer?content=89995) cvwidget-> putImage(imgA); – EnneKappa 2011-04-29 10:34:14

回答

3
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. 
1

我解釋了爲什麼原始代碼不起作用。 cvQueryFrame每次重用相同的緩衝區。所以當你這樣做時:

IplImage *imgA=cvQueryFrame(capture); 

你得到指向他的內部緩衝區的圖像被保存。現在在做:

IplImage *imgB=cvQueryFrame(capture); 

圖像被重寫,並指向相同的緩衝區。 IMGA == IMGB。查詢第一幀後必須複製,然後一切正常。在循環之前

1

一個查詢,而另一個循環內可能足以在這裏 (僞):

IplImage prev = query(capture) 

while(1) 
    next = query(capture) 

    opticalflow(prev, next) 

    prev = cvCopy(next) 
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);只是指向捕獲的緩衝區,所以我可以將該幀保存在另一個內存中。