【发布时间】: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< contours.size(); i++ ) { Scalar color = Scalar( 0, 0, 255 ); drawContours( drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point() ); }仅绘制全红色的船体。 rng代码是一个随机数生成器,所以教程代码会随机绘制颜色! -
重要的代码是 `convexHull( Mat(contours[i]), hull[i], false );` 这将计算轮廓。但以前您必须将所有圆形轮廓组合成一个轮廓。
-
非常感谢。我会尝试将我的圆圈结果组合成一个轮廓,然后再次使用 convexHull 方法!
标签: c++ opencv computer-vision hough-transform