计算圆的中心坐标

时间:2014-06-11 10:05:31

标签: c++ opencv

我是openCV和图像处理的基本跑步者。现在使用openCV来计算白色像素区域的中心点坐标,就像链接文件一样。但这对我来说并不容易找到这个白圈的确切中心。我认为在找到中心点之前,有一些步骤可以提高它的中心坐标的准确性。你能与我分享你的想法或任何提示吗?谢谢,祝你有个愉快的一天

图片路径:http://blog.naver.com/colorring/220027355998(修改路径)

// --------------------------------------------- -------------------------------------------------- ----------------------------
// @@@源代码
// ------------------------------------------------ -------------------------------------------------- -------------------------

IplImage * cimgGray = cvCreateImage(cvSize(m_OneimageXresolution,m_OneimageYresolution),IPL_DEPTH_8U,1);

cvCvtColor(m_Leftimg,cimgGray,CV_RGB2GRAY);

cvEqualizeHist(cimgGray,cimgGray); cvShowImage( “cvEqualizeHist”,cimgGray);

double threshold1 = cvThreshold(cimgGray,pImgOutput,150,255,CV_THRESH_BINARY); cvShowImage( “cvThreshold”,pImgOutput);

// --------------------------------------------- -------------------------------------------------- -----------------------------

3 个答案:

答案 0 :(得分:1)

要在图像中以高精度查找圆或椭圆的中心,应使用圆边缘的所有像素。一个很好的方法是通过" Zhou运算符",它的工作原理如下:

  1. 为图像创建边缘贴图(Canny边缘检测器效果很好)

  2. 对于边缘图中像素的每一行(和一列),扫描最亮的像素(边缘响应最强的像素。您应该找到一个亮度峰进入您的圆圈,一个离开(进入峰值) ,退出高峰)。 要以亚像素精度估计圆的边缘,请将抛物线拟合到两个峰值周围的边缘图中的像素上。像素。在下图中,最高的红点是最亮的边缘像素。在拟合抛物线后,使用微积分找到零斜率的x值 - 这为您提供了当前像素行上的入口和出口点的子像素位置。 Fitting a parabola to edge-map pixels to estimate the location with maximal response with sub-pixel accuracy

  3. 接下来,平均您的(子像素)进入和退出点;这将为您提供一组点,用于描述穿过圆心的线条(如下图所示,边缘为绿色像素,中心交叉线为红色点)。

  4. Using edge pixels (green) to find lines passing through the center (red)

    1. 此时您可以使用回归来查找步骤3中描述的中线点的最佳拟合线。然而,使用RANSAC找到一个良好的共识线,然后只包括最小均方拟合的获胜候选人的选民将提高你的准确度大约一个数量级(因为只是放大圆圈的扫描线有很多比其他线更高的误差,并导致异常中点,由于其假设正常的误差分布,将导致直接高斯LMS拟合。
    2. 根据圆的大小和传感器的质量等,您可能会获得大约1/50到1/100像素的错误。

答案 1 :(得分:0)

有多种方法可以解决这个问题。如果您分享了有关问题域的更多详细信息,将会有所帮助。

解决问题的一种简单方法是在(已经几乎是二进制)图像的二值化版本上运行“距离变换”,然后搜索最大像素值。

仅供参考:我必须删除链接末尾的?type = w3才能看到图片。

答案 2 :(得分:0)

现在我可以看到你的测试图像,我建议采用第二种方法 - 我的另一个答案是假设一个圆圈由"黑色"或"白色"具有明确定义的边缘,没有真正的渐变。这意味着远离白/黑边界的像素不包含有关圆心的信息,但这与您的图像不同。

根据您想要定位图像中心的准确程度,您可能会考虑使用更多像素的信息的方法,也许是拟合度数为2的多项式(或样条,如果抛物线不是& #39; t相当好的模型)直接到强度贴图中像素的行和列,并使曲线的最大值指向穿过圆心的线(我的答案中的红色像素) 。因为每个抛物线/样条曲线都是从许多点构建的,所以你应该得到非常好的中心点(单个像素中的噪声很大程度上会被邻居消除)。

所有这些都说,首先尝试最简单的方法,看看准确性和稳定性是否足以满足您的应用。