在Go Board上使用opencv改进循环检测

时间:2016-07-16 17:35:30

标签: java opencv geometry detect hough-transform

我必须检测电路板上的所有宝石,但我对HoughCircle算法有一些问题。如果我减少了太多的参数2,那么网格线之间的空间也会显示为圆圈,我不知道如何解决这个问题。

如何更精确地检测宝石? HoughCircle使用canny来检测圆圈,但是在棋盘的线条中没有圆圈,所以我不明白。 我不认为我可以按颜色使用滤镜,因为白色宝石和木板的颜色在某些地方相似。

这是我合作的图片。 https://i.imgur.com/XR7tOnt.jpg

我知道光线并不是很好,但我想知道它是否可能。

这就是我到现在为止所得到的。 https://i.imgur.com/bqUzlC1.png

这是我制作的代码:

        Mat circles = new Mat(undistorted.size(), CV_8UC3);

        Mat toGrayScaleForHough = undistorted.clone();

        Imgproc.cvtColor(toGrayScaleForHough, toGrayScaleForHough, Imgproc.COLOR_HSV2BGR);
        Imgproc.cvtColor(toGrayScaleForHough, toGrayScaleForHough, Imgproc.COLOR_BGR2GRAY, 0);

        Imgproc.dilate(toGrayScaleForHough, toGrayScaleForHough, Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3)));
        Imgproc.GaussianBlur(toGrayScaleForHough, toGrayScaleForHough, new Size(13, 13), 2, 2 );

        HoughCircles(toGrayScaleForHough, circles, CV_HOUGH_GRADIENT, 1, 45, 30, 20, 30, 50);

        stones = new ArrayList<Stone>();

        Imgproc.cvtColor(undistorted, undistorted, COLOR_HSV2BGR);
        for(int i = 0; i < circles.cols(); i++){
            Rect circleROI = new Rect((int)circles.get(0, i)[0]-6, (int)circles.get(0, i)[1]-6, 36, 36);

            Mat ROI = new Mat(undistorted, circleROI);

            Scalar color = mean(ROI);


            int x, y;
            x = (int)Math.round((circles.get(0, i)[0] - 40) / 100);
            y = (int)Math.round((circles.get(0, i)[1] - 50) / 100);

            if(color.val[0] < 90){
                stones.add(new Stone(new Point(x,y),new Scalar(0,0,0)));
                circle(undistorted, new Point(circles.get(0, i)[0], circles.get(0,i)[1]),(int)circles.get(0, i)[2], new Scalar(89, 255, 202),15);
            }else {
                stones.add(new Stone(new Point(x,y),new Scalar(255,255,255)));
                circle(undistorted, new Point(circles.get(0, i)[0], circles.get(0,i)[1]),(int)circles.get(0, i)[2], new Scalar(89, 255, 202),15);
            }
        }

0 个答案:

没有答案