Opencv cvblob渲染问题

opencv cvblob render issue

本文关键字:问题 cvblob Opencv      更新时间:2023-10-16

我刚刚安装了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信息。

谁能帮我找出为什么图像不显示?

谢谢,米洛

该错误来自视频捕获系统,而不是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。然后尝试一次添加一点代码。