同样是面向java的同学
使用霍夫圆识别图片中的圆,操作相对简单
核心代码:
Imgproc.HoughCircles(InputArray image,OutputArray circles,int method,double dp,double minDist,double param1=100,double param2=100,int minRadius=0,int maxRadius=0);
image为输入图像,要求是灰度图像
circles为输出圆向量,每个向量包括三个浮点型的元素——(x,y,radius)
method为使用霍夫变换圆检测的算法,它的参数是CV_HOUGH_GRADIENT
dp为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半
minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心
param1有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
param2也有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
minRadius和maxRadius为所检测到的圆半径的最小值和最大值甭废话,上代码:
-
/**
-
* 使用霍夫圆对图片的中的所有圆进行识别
-
* @author Administrator
-
*
-
*/
-
public
class TestCircle {
-
public static void main(String[] args) {
-
String relativelyPath = System.getProperty(
“user.dir”);
-
System.load(relativelyPath +
“\\lib\\opencv_java310.dll”);
-
Mat src = Imgcodecs.imread(
“E:\\zzz.bmp”);
-
Mat dst = src.clone();
-
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
-
-
Mat circles =
new Mat();
-
//核心代码
-
Imgproc.HoughCircles(dst, circles, Imgproc.HOUGH_GRADIENT,
1,
300,
400,
100,
0,
0);
-
System.out.println(circles.cols());
-
for (
int i =
0; i < circles.cols(); i++){
-
double[] vCircle = circles.get(
0, i);
-
-
Point center =
new Point(vCircle[
0], vCircle[
1]);
-
int radius = (
int) Math.round(vCircle[
2]);
-
-
// circle center
-
Imgproc.circle(src, center,
3,
new Scalar(
0,
255,
0), -
1,
8,
0);
-
// circle outline
-
Imgproc.circle(src, center, radius,
new Scalar(
0,
255,
255),
3,
8,
0);
-
}
-
-
Imgcodecs.imwrite(
“E:\\gray2.png”, src);
-
}
-
}
原图:
截取后:
希望可以对各位有帮助,如有问题请评论提出