2016-09-27 245 views
0

我需要从这个图像(左上角,右上角,左下角和最后右下角)查找圆的半径和极坐标点(Hough Circle Transform)

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

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); 


} 

这是演示代码,但我 从

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

努力理解有关 circles.size()
Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1])); 

我会,如果感激你可以用更简单的方式向我解释这一点,因为我仍然在学习过程中,只是我开始的一个起点而已。 谢谢!

+0

不完全是对您问题的回答,但可能是所有圈子的凸包是您最初想要的解决方案吗? http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html – Micka

+0

@Micka是的!这正是我所需要的,除非我只需要大纲。我是否能够改变它的颜色,以便我能够将它设为阈值而仅获得没有内部轮廓的轮廓?我不太确定rng.uniform(0,255)是怎么做的,为什么它需要3个:l – Lyber

+0

尝试'for(int i = 0; i (),0,Point()); } '只能以全红色绘制船体。 rng代码是一个随机数生成器,所以教程代码将以随机颜色绘制! – Micka

回答

0

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

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

除非我误解你的问题circles.size()是圆的是一个数量,而不是圆(size())的半径函数返回在载体

vector<int>似乎存储[0]的x位置和在[1]

y位置和r个元素的数量在圆的adius [2]

+0

谢谢!管理了解更好一点:) – Lyber

0

如果看一下上圈霍夫OpenCV的文档变换http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghcircles#houghcircles

可变圆圈下你可以看到,它是为每个圆圈的向量是一个3元组值(X,Y,半径)

所以你的情况以获得圆的数据I:

x坐标=圆圈[I] [0]

y坐标=圆圈[I] [1]

半径=圆圈[I] [2]

circles.size():是被发现圆圈的数量。

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

+0

谢谢!我设法得到了x和y坐标,但是您说“y坐标最低的6个点”是什么意思? – Lyber

+0

为圆圈的所有y坐标创建一个向量。比对它进行排序(并获取索引)并采用y坐标最低的6个圆圈的值。对于那些圆圈找到具有最低x坐标的圆圈。 –

+0

对不起,我真的是一个缓慢的学习者,但现在我第一次创建一个向量,然后将x和y坐标添加到圆圈内的列表中.size for loop vector data; data.push_back(Point(circles [i] [0],circles [i] [1])); – Lyber

相关问题