opencv cvblob渲染问题

时间:2011-08-18 03:09:33

标签: c++ 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 个答案:

答案 0 :(得分:1)

该错误来自视频捕获系统,而非cvBlob。

我看到一些问题:

  1. 您必须在创建capture后对其进行测试,以确保您已成功打开相机。
  2. 您的while循环应该测试frame,而不是capture,以确保您已成功收到一帧视频。
  3. 您确定索引1处有相机吗?
  4. 试试这个简化版本,看它是否有效。请注意,我正在测试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.然后尝试一次添加一些代码。