2011-08-18 25 views
0

我剛安裝了cvblob進行對象檢測。opencv cvblob呈現問題

當我試圖運行程序,圖像不會出現了,它給了我一個錯誤: 「VIDIOC_QUERYMENU:無效參數」

這裏是代碼。

#include "highgui.h" 
#include "cv.h" 
#include "cvaux.h" 
#include "iostream" 
#include <stdio.h> 
#include <ctype.h> 

#include <cvblob.h> 

using namespace cv; 
using namespace std; 
using namespace cvb; 

int main(int argc, char** argv) { 
    CvTracks tracks; 

    namedWindow("frame", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("frame", 50, 100); 

    CvCapture* capture; 

    IplImage* frame = 0; 

// frame = cvLoadImage("fruits.jpg", 1); 

    capture = cvCreateCameraCapture(1); //capture frames from cam on index 0: /dev/video0/ 

    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 240); 
    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 320); 

    frame = cvQueryFrame(capture); 

    while(capture) { 
     IplImage *gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
     cvCvtColor(frame, gray, CV_BGR2GRAY); 
     cvThreshold(gray, gray, 150, 255, CV_THRESH_BINARY); 

     IplImage *labelImg=cvCreateImage(cvGetSize(gray), IPL_DEPTH_LABEL, 1); 
     CvBlobs blobs; 
     unsigned int result=cvLabel(gray, labelImg, blobs); 

     cvFilterByArea(blobs, 500, 1000000); 
     cvRenderBlobs(labelImg, blobs, frame, frame, CV_BLOB_RENDER_BOUNDING_BOX); 
     cvUpdateTracks(blobs, tracks, 200., 5); 
     cvRenderTracks(tracks, frame, frame, CV_TRACK_RENDER_ID|CV_TRACK_RENDER_BOUNDING_BOX); 

//  for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it) { 
//   cout << "Blob #" << it->second->label << ": Area=" << it->second->area << ", Centroid=(" << it->second->centroid.x << ", " << it->second->centroid.y << ")" << endl; 
//  } 

     cvShowImage("frame", frame); 

     frame = cvQueryFrame(capture); 
    } 
} 

如果我取消註釋註釋部分,將顯示blob信息。

任何人都可以幫我找出圖像不顯示的原因嗎?

感謝, 米洛

回答

1

該錯誤是由視頻採集系統,而不是cvBlob到來。

我看到幾個問題:

  1. 你必須創建它,以確保您已成功打開相機後進行測試capture
  2. 您的while循環應測試frame而不是capture以確保您已成功接收到一幀視頻。
  3. 你確定你在索引1有一個攝像頭嗎?

試試這個簡化版本,看它是否工作。請注意,我正在測試capture,循環播放,而frame不是0,並在索引0處打開相機。這適用於我的系統。

int main(int argc, char** argv) { 
    namedWindow("frame", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("frame", 50, 100); 

    CvCapture* capture; 

    IplImage* frame = 0; 

    capture = cvCreateCameraCapture(0); //capture frames from cam on index 0: /dev/video0/ 
    if (!capture) { 
     return -1; 
    } 

    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 240); 
    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 320); 

    frame = cvQueryFrame(capture); 

    while(frame) { 
     cvShowImage("frame", frame); 

     frame = cvQueryFrame(capture); 
    } 
} 

如果這對你的作品,嘗試改變cvCreateCameraCapture參數1,然後嘗試重新添加你的代碼一點點在一個時間。

+0

我試過你的代碼。儘管如此,沒有圖像顯示。然後我試着添加「if(cvWaitKey(10)== 27)break;」。圖像終於顯示出來了。我想知道爲什麼沒有這條線沒有顯示。無論如何,你的答案被接受。謝謝。 – hoyomi