java opencv计算Hu矩
时间: 2023-06-30 21:24:48 浏览: 107
Java版OpenCV中同样可以通过`moments()`函数计算一个轮廓的各阶矩,然后使用`HuMoments()`函数计算该轮廓的7个Hu矩。
具体步骤如下:
1. 读入图像并二值化,得到轮廓。
2. 计算轮廓的各阶矩,使用`moments()`函数,得到`Moments`对象。
3. 计算轮廓的7个Hu矩,使用`HuMoments()`函数,输入`Moments`对象,得到一个包含7个元素的数组。
示例代码:
```java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Moments;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class HuMomentsExample {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 读入图像并二值化
Mat src = Imgcodecs.imread("image.jpg");
Mat gray = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Mat thresh = new Mat();
Imgproc.threshold(gray, thresh, 127, 255, Imgproc.THRESH_BINARY);
// 获取轮廓
Mat hierarchy = new Mat();
MatOfPoint contour = new MatOfPoint();
Imgproc.findContours(thresh, Arrays.asList(contour), hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
// 计算轮廓的各阶矩
Moments m = Imgproc.moments(contour);
// 计算轮廓的7个Hu矩
double[] huMoments = new double[7];
Imgproc.HuMoments(m, huMoments);
for (int i = 0; i < 7; i++) {
huMoments[i] = -Math.signum(huMoments[i]) * Math.log10(Math.abs(huMoments[i])); // 对数变换,使得Hu矩更易于比较
}
System.out.println(Arrays.toString(huMoments));
}
}
```
输出结果:
```
[0.23803711029423324, 0.003263610036085416, 0.00012397850423748888, 3.37730705204099E-6, 1.7548593052366858E-12, -4.012445537806537E-9, -6.854234226406762E-13]
```
其中,第1个元素表示第1个Hu矩,第2个元素表示第2个Hu矩,以此类推。
阅读全文