当我将houghCircle
应用于我的图像时,它始终检测到内圈,我花了很多时间调整参数,但结果始终相同。
我的程序是将图片转换为HSV
颜色空间,然后将Threshold
转换为红色,以获得binary
图片,然后应用houghCircle
。
我的图片
霍夫圈后
代码
Mat hsv = new Mat();
Imgproc.cvtColor(bgr, hsv, Imgproc.COLOR_BGR2HSV); //BGR to HSV
Mat mask1 = new Mat();
Mat mask2 = new Mat();
Core.inRange(hsv, new Scalar(0, 100, 100), new Scalar(10, 255, 255), mask1);
Core.inRange(hsv, new Scalar(160, 100, 100), new Scalar(179, 255, 255), mask2);
Mat hsvThres = new Mat();
Core.bitwise_or(mask1, mask2, hsvThres);
//
Mat circles = new Mat();
int iCannyUpperThreshold = 1; //100
int iMinRadius = -1; //20 //90
int iMaxRadius = -1; //400 //150-1000
int iAccumulator = 1;//300
Imgproc.HoughCircles(hsvThres, circles, Imgproc.CV_HOUGH_GRADIENT, //2
1.0, hsvThres.rows() , iCannyUpperThreshold, iAccumulator, iMinRadius, iMaxRadius);
if (circles.cols() > 0)
for (int x = 0; x < circles.cols(); x++)
{
double vCircle[] = circles.get(0,x);
if (vCircle == null)
break;
Point pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
int radius = (int)Math.round(vCircle[2]);
Core.circle(bgr, pt, radius, new Scalar(0,255,0), 4, 8, 0);
}
注意
1)当我将minRadius
更改为90
时,它检测到外部而不是内部,但我想要的smth泛型可用于图像/符号,不仅适用于此测试图像
2)如果我将原始图片转换为Grey
空间而不是HSV
,它会检测到外部而不是内部,但也不是我的情况,因为我必须将我的图片转换为HSV
才能Thresholding
。