@[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()的参数是随便写的,所以最终的结果有些轮廓没有发现是正常的。
Java OpenCV-4.0.0 图像处理25 图像矩(Image Moments)

相关文章: