Android opencv中取图像中一个不规则光斑的光斑中心
时间: 2023-12-07 10:05:04 浏览: 51
要取一个不规则光斑的光斑中心,可以使用OpenCV中的函数minEnclosingCircle()和moments()。首先,你需要将光斑图像转换为灰度图像,并使用阈值函数将其二值化。然后,你可以使用函数findContours()找到光斑的轮廓。接着,使用函数minEnclosingCircle()找到轮廓的最小外接圆,并计算圆心坐标。最后,使用函数moments()计算轮廓的矩,并计算中心坐标即可。
以下是一个例子代码:
```java
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;
Mat src = Imgcodecs.imread("spot.jpg"); // 读入图像
Mat gray = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY); // 转换为灰度图像
Mat binary = new Mat();
Imgproc.threshold(gray, binary, 127, 255, Imgproc.THRESH_BINARY); // 二值化
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(binary, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); // 找到轮廓
MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(0).toArray());
float[] radius = new float[1];
Point center = new Point();
Imgproc.minEnclosingCircle(contour2f, center, radius); // 计算最小外接圆
Moments moments = Imgproc.moments(contours.get(0));
Point centroid = new Point();
centroid.x = (int) (moments.get_m10() / moments.get_m00()); // 计算矩中心
centroid.y = (int) (moments.get_m01() / moments.get_m00());
// 显示结果
Imgproc.circle(src, center, Math.round(radius[0]), new Scalar(0, 0, 255), 2);
Imgproc.circle(src, centroid, 5, new Scalar(0, 255, 0), -1);
Imgcodecs.imwrite("result.jpg", src);
```
注意:此代码假定只有一个光斑。如果有多个光斑,则需要在找到轮廓时循环处理每个轮廓,并计算每个轮廓的中心坐标。
阅读全文