【问题标题】:Finding the radius and extreme coordinate points of the circles(Hough Circle Transform)求圆的半径和极坐标点(霍夫圆变换)
【发布时间】:2017-02-04 21:38:18
【问题描述】:

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

图像经过阈值,然后经过精明的边缘检测,然后再叠加回原始图像。

例如(通过油漆绘制)

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

但我想如何先从中心获取半径和 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++)

Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1]));

如果您能以更简单的方式向我解释,我将不胜感激,因为我仍在学习过程中,只是我开始的起点就可以了。 谢谢!

【问题讨论】:

  • 不完全是您问题的答案,但所有圆圈的凸包是否可以解决您最初想要的问题? docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/…
  • @Micka 是的!这正是我正在寻找的,除了我只需要大纲。我是否能够更改它的颜色,以便我能够对其进行阈值处理以仅获得没有内部轮廓的轮廓?我不太确定 rng.uniform(0,255) 做了什么以及为什么需要其中的 3 个:l
  • 尝试for( int i = 0; i&lt; contours.size(); i++ ) { Scalar color = Scalar( 0, 0, 255 ); drawContours( drawing, hull, i, color, 1, 8, vector&lt;Vec4i&gt;(), 0, Point() ); } 仅绘制全红色的船体。 rng代码是一个随机数生成器,所以教程代码会随机绘制颜色!
  • 重要的代码是 `convexHull( Mat(contours[i]), hull[i], false );` 这将计算轮廓。但以前您必须将所有圆形轮廓组合成一个轮廓。
  • 非常感谢。我会尝试将我的圆圈结果组合成一个轮廓,然后再次使用 convexHull 方法!

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


【解决方案1】:

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

看起来可能是vector&lt;vector&lt;int&gt;&gt;(或某种形式的tuple&lt;int&gt;

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

内部vector&lt;int&gt; 似乎将x 位置存储在[0] 中,将y 位置存储在[1]

和[2]中圆的半径

【讨论】:

  • 谢谢!设法更好地理解了:)
【解决方案2】:

如果您查看有关 Circle hough 变换 http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghcircles#houghcircles 的 opencv 文档

在变量 circles 下,你可以看到它是一个向量,每个圆都是一个 3 元组,其值为 (x,y,radius)

所以在你的情况下得到圈 i 的数据:

xCoordinate = circles[i][0]

yCoordinate = circles[i][1]

半径 = 圆[i][2]

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

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

【讨论】:

  • 谢谢!我设法获得了 x 和 y 坐标,但是“y 坐标最低的 6 个点”是什么意思?
  • 为圆的所有 y 坐标创建一个向量。然后对其进行排序(并获取索引)并获取 y 坐标最低的 6 个圆圈的值。对于这些圆圈,找到具有最低 x 坐标的圆圈。
  • 对不起,我真的学得很慢,但现在我首先创建了一个向量,然后将 x 和 y 坐标添加到 circles.size 内的列表中,用于循环向量 数据; data.push_back(Point(circles[i][0], circles[i][1]));
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多