查找圆的半径和极坐标点(霍夫圆变换)

时间:2016-09-27 09:51:59

标签: c++ opencv computer-vision hough-transform

我需要从这张图片中找到圆圈的极点(左上角,右上角,左下角,最后是右下角)

图像通过阈值,然后在重叠回原始图像之前进行边缘检测。

enter image description here 例如(通过油漆画)

enter image description here

并将它们连接在一起(通过绘画绘制)

enter image description here

enter image description here

但是我怎么想首先从中心得到半径和x和y坐标然后画线?

for (int i = 0; i < circles.size(); i++)
{
    //icout << i<<"\n"<<endl;
    Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1]));
    stringstream ss;
    ss << i + 1;
    putText(dst, ss.str(), center, 1, 1, Scalar(255, 0, 225 ), 2, 0);
    int radius = cvRound(circles[i][2]);
    // circle center
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
    //for original image overlap
    circle(dst, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(dst, center, radius, Scalar(0, 255, 255), 3, 8, 0);


}

这是演示代码,但我很难理解  circles.size() 从

for (int i = 0; i < circles.size(); i++)

Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1]));
如果你能以更简单的方式向我解释,我仍然感谢它,因为我还在学习过程中,这只是我开始的起点。 谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您需要显示圈子的定义,即圈子是什么类型

看起来可能是vector<vector<int>>(或某种形式的tuple<int>

除非我误解了你的问题,circles.size()是圆圈的数量而不是圆的半径(size())是一个返回向量中元素数量的函数

内部vector<int>似乎存储了[0]中的x位置和[1]中的y位置

和[2]中圆的半径

答案 1 :(得分:0)

如果你看一下Circle hough transform http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghcircles#houghcircles

上的opencv文档

在变量圆圈下,您可以看到它是一个向量,每个圆是一个带有值(x,y,半径)的3元组

所以在你的情况下获取圈子i的数据:

xCoordinate = circles [i] [0]

yCoordinate = circles [i] [1]

radius = circles [i] [2]

circles.size():是找到的圈数。

之后为了找到左下角的点,例如只查找具有最低y坐标的6个点,并从该组中查找具有最小x坐标的点。