试图用opencv获得一个圆心

时间:2012-02-22 13:48:02

标签: java image-processing opencv computer-vision

我正试图检测一个圆圈的中心。我尝试用cvHoughCircle做到这一点。但我似乎无法让它正常工作。

enter image description here

唯一可以改变的是圆的大小。

我尝试通过以下方式检测圆圈:

circle = cvHoughCircles(imgThreshold, storage, CV_HOUGH_GRADIENT, 1,
(double)imgThreshold.height()/20, 200, 20, 0, 0);

imgThreshold是您可以在此处看到的黑白图像。图像的分辨率实际上是1280 * 1024。

任何人都可以告诉我我做错了什么。

4 个答案:

答案 0 :(得分:3)

不是使用cvHoughCircle,而是可以通过一些数学解决这个问题:

        CvMoments moments = new CvMoments();

        cvMoments(imgThreshold, moments, 1);

        double moment10 = cvGetSpatialMoment(moments, 1, 0);
        double moment01 = cvGetSpatialMoment(moments,0,1);
        double area = cvGetCentralMoment(moments, 0, 0);

         int posX = 0;
         int posY = 0;

        int lastX = posX;
        int lastY = posY;

        posX = (int) (moment10/area);
        posY = (int) (moment01/area);

        cvCircle(iplRgbImage, new CvPoint(posX,posY), 3, CvScalar.GREEN, -1, 8, 0);

source = http://aishack.in/tutorials/tracking-colored-objects-in-opencv/

答案 1 :(得分:2)

如果圆圈已完成并且已填充但未被其他形状遮挡,则可以使用 findContours(),然后找到轮廓的中心。

答案 2 :(得分:1)

答案 3 :(得分:0)

关于霍夫变换,它可以通过识别属于圆周边的像素来检测圆。更确切地说,给定包含沿循环路径的白色像素的二进制(阈值)图像,霍夫圆变换将检测圆。因此,提供算法的图像应该是二进制和阈值,但在您的示例中必须是边缘滤波器(ex Sobel)的阈值示例,而不是实心填充圆。

我无法在上面的图像上找到一个“拟合”圆圈的正确方法,但是用连接组件提取的blob的质心是一个很好的快速方法。