我正试图检测一个圆圈的中心。我尝试用cvHoughCircle做到这一点。但我似乎无法让它正常工作。
唯一可以改变的是圆的大小。
我尝试通过以下方式检测圆圈:
circle = cvHoughCircles(imgThreshold, storage, CV_HOUGH_GRADIENT, 1,
(double)imgThreshold.height()/20, 200, 20, 0, 0);
imgThreshold是您可以在此处看到的黑白图像。图像的分辨率实际上是1280 * 1024。
任何人都可以告诉我我做错了什么。
答案 0 :(得分:3)
不是使用cvHoughCircle,而是可以通过一些数学解决这个问题:
CvMoments moments = new CvMoments();
cvMoments(imgThreshold, moments, 1);
double moment10 = cvGetSpatialMoment(moments, 1, 0);
double moment01 = cvGetSpatialMoment(moments,0,1);
double area = cvGetCentralMoment(moments, 0, 0);
int posX = 0;
int posY = 0;
int lastX = posX;
int lastY = posY;
posX = (int) (moment10/area);
posY = (int) (moment01/area);
cvCircle(iplRgbImage, new CvPoint(posX,posY), 3, CvScalar.GREEN, -1, 8, 0);
source = http://aishack.in/tutorials/tracking-colored-objects-in-opencv/
答案 1 :(得分:2)
如果圆圈已完成并且已填充但未被其他形状遮挡,则可以使用 findContours(),然后找到轮廓的中心。
答案 2 :(得分:1)
使用cvBlob
答案 3 :(得分:0)
关于霍夫变换,它可以通过识别属于圆周边的像素来检测圆。更确切地说,给定包含沿循环路径的白色像素的二进制(阈值)图像,霍夫圆变换将检测圆。因此,提供算法的图像应该是二进制和阈值,但在您的示例中必须是边缘滤波器(ex Sobel)的阈值示例,而不是实心填充圆。
我无法在上面的图像上找到一个“拟合”圆圈的正确方法,但是用连接组件提取的blob的质心是一个很好的快速方法。