@[TOC](Java OpenCV-4.0.0 图像处理25 图像矩(Image Moments))
Java OpenCV-4.0.0 图像矩(Image Moments)
1 读取待处理图片
2 图片灰度化
3 高斯降噪
4 边缘提取
5 提取轮廓
6 图像矩
7 绘制轮廓
8 显示结果
package com.xu.opencv;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.imgproc.Moments;
/**
*
* @Title: OpenCV01.java
* @Package com.xu.opencv
* @Description: TODO
* @author: xuhyacinth
* @date: 2019年1月25日 下午10:10:14
* @version: V-1.0
* @Copyright: 2019 xuhyacinth
*
*/
public class OpenCV01 {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
imageMoments();
}
/**
* OpenCV-4.0.0 图像矩(Image Moments)
*
* @return: void
* @date: 2019年1月27日 下午4:08:19
*/
public static void imageMoments() {
Mat src=Imgcodecs.imread("C:\\Users\\xuhya\\Pictures\\33.jpeg");
// 1 图片灰度化
Mat gary=new Mat();
Imgproc.cvtColor(src,gary,Imgproc.COLOR_BGR2GRAY);
// 2 高斯降噪
Imgproc.GaussianBlur(gary,gary,new Size(3,3),0,0);
// 3 提取边缘
Mat edges=new Mat();
Imgproc.Canny(gary,edges,200,500,3,false);
// 4 发现轮廓
List<MatOfPoint> list = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(edges, list, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE,new Point(0,0));
// 5 图像矩
List<Moments> moments=new ArrayList<Moments>();
List<Point> points=new ArrayList<Point>();
for (int i = 0,len=list.size();i < len;i++) {
moments.add(Imgproc.moments(list.get(i)));
points.add(new Point(moments.get(i).get_m10()/moments.get(i).get_m00(),moments.get(i).get_m01()/moments.get(i).get_m00()));
}
// 6 绘制轮廓
Mat drawimage = new Mat(src.size(),CvType.CV_8UC3);
src.copyTo(drawimage);
for (int i = 0, len = list.size(); i < len; i++) {
Imgproc.drawContours(drawimage,list,i,new Scalar(0,0,255),2,Imgproc.LINE_AA);
Imgproc.circle(drawimage,points.get(i),0,new Scalar(0,255,0),20,Imgproc.LINE_AA);
}
// 7 显示结果
HighGui.imshow("",drawimage);
HighGui.waitKey(0);
}
}
最终的结果与边缘提取有很大的关系,这里测试时Imgproc.Canny()的参数是随便写的,所以最终的结果有些轮廓没有发现是正常的。