我必须检测电路板上的所有宝石,但我对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);
}
}