OpenCV HoughCircles

时间:2010-08-02 12:58:28

标签: c++ xcode opencv

我正在使用Xcode和c ++

我已经复制了OpenCV documentation

中的HoughCircles代码
#include <cv.h>
#include <highgui.h>
#include <math.h>

using namespace cv;

int main(int argc, char** argv)
{
    Mat img, gray;
    if( argc != 2 && !(img=imread(argv[1], 1)).data)
        return -1;
    cvtColor(img, gray, CV_BGR2GRAY);
    // smooth it, otherwise a lot of false circles may be detected
    GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
    vector<Vec3f> circles;
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                 2, gray->rows/4, 200, 100 );
    for( size_t i = 0; i < circles.size(); i++ )
    {
         Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
         int radius = cvRound(circles[i][2]);
         // draw the circle center
         circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );
         // draw the circle outline
         circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );
    }
    namedWindow( "circles", 1 );
    imshow( "circles", img );
    return 0;
}

然后像这样修改它:

int main(int argc, char** argv)
{
    VideoCapture cap(0);
    if(!cap.isOpened())
        return -1;
    namedWindow( "circles", 1 );

    Mat img, gray;
    for( ;; )
    {

        cap >> img;
        vector<Vec3f> circles;      
        cvtColor(img, gray, CV_BGR2GRAY);
        GaussianBlur(gray, gray, Size(7,7), 1.5, 1.5);
        HoughCircles(img, circles, CV_HOUGH_GRADIENT, 2, img->rows/4, 200, 100 );
        imshow( "circles", img );
        if(waitKey(30) >= 0) break;
    }

    return 0;
}

我在两种情况下都收到错误:错误:' - &gt;'的基本操作数有非指针类型'cv :: Mat' 我然后替换 - &gt;与。并仍然得到另一个错误。这与我从文档中复制的代码相同。

我的理论是,这种情况发生是因为它没有得到和形象或某些东西。但是当我拿出HoughCircles代码时,相机运行正常。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

首先,您不得传递imgcircles的地址。 HoughCircles接受引用,而不是指针。如果您尝试传递&img&circles,则会收到新的令人兴奋的类型错误。在这方面,您的原始代码是正确的。

如果函数接受指针,它的声明就是:

void HoughCircles(Mat * image, vector<Vec3f> * circles, ...);

(事实并非如此 - 我只提及其他被C ++函数声明中的&语法混淆的人)

其次,->不起作用,因为Mat是一个对象,而不是一个指针。我对原始文档错误感到有点惊讶。 OpenCV的C ++接口(如果你使用的是cv::Mat,你正在使用它)是一种新的东西,而且东西仍在转换。这可能是从C API文档中复制/粘贴的,->错过了。

img.rows应该有用(并且对我有用)。您为img.rows案例提供的错误并非完整错误,因此我不确定为何会投诉。

我现在唯一看到的是dp参数是double,而你传递的是int。我用过的任何C ++编译器都会为你做上转换,但是如果你的编译器处于完全偏执模式,你可以尝试将2更改为2.0。 (我真的非常怀疑这是问题,但是如果没有关于错误的更多细节,我不明白你为什么会遇到编译时错误)

然而,在运行时,它会爆炸,因为你将HoughCircles传递给原始的基于BGR的img而不是传递单个频道gray

答案 1 :(得分:0)

两个编译错误都是?使用访问 img 成员时会出现什么错误?我确定你应该使用 - &gt; ,因为 img 不是指向Mat的指针。

根据API reference manual(你应该拿一个战利品):

void HoughCircles(Mat& image, vector<Vec3f>& circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0);

您必须传递对象 img circles 的内存地址,而不是传递对象本身。

您应该执行以下操作:

HoughCircles(&img, &circles, CV_HOUGH_GRADIENT, 2, img.rows/4, 200, 100 );