使用霍夫圆变换检测外圆

时间:2018-05-02 14:56:35

标签: java opencv image-processing

当我将houghCircle应用于我的图像时,它始终检测到内圈,我花了很多时间调整参数,但结果始终相同。

我的程序是将图片转换为HSV颜色空间,然后将Threshold转换为红色,以获得binary图片,然后应用houghCircle

我的图片

Original

霍夫圈后

After Hough

代码

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

0 个答案:

没有答案