2011-08-18 71 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