欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java+Opencv4 计算图像的面积

程序员文章站 2022-05-20 19:38:14
...

环境配置移步:Java+Opencv 入门(IDEA测试+环境配置+参数配置)

public static void main(String[] args) {
        // 1. 加载由libname参数指定的系统库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 2. 打开图片
        Mat src = Imgcodecs.imread("D:/1.jpg");
        if (src.dataAddr()==0){
            System.out.println("打开文件出错");
        }
        Mat mat = src;
        Imgcodecs.imwrite("D:/opencv/1-0.jpg", mat);
        //图片转换成灰度
        Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY,0);
        Imgcodecs.imwrite("D:/opencv/1-1.jpg", src);
        //高斯模糊
        Imgproc.GaussianBlur(src, src, new Size(15, 15), 0);
        Imgcodecs.imwrite("D:/opencv/1-2.jpg", src);
        //二值化操作
        Imgproc.threshold(src,src,0,255,THRESH_BINARY | THRESH_TRIANGLE);
        Imgcodecs.imwrite("D:/opencv/1-3.jpg", src);
        //轮廓发现--得到contours和hierarchy
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        Mat hierarchy = new Mat();
        Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_TREE,
                Imgproc.CHAIN_APPROX_SIMPLE, new Point(-1, -1));
        Imgcodecs.imwrite("D:/opencv/1-4.jpg", hierarchy);

        //相当于创建和原图尺寸相同一张黑色的图,用于后面画线作图
        Mat contoursImg = Mat.zeros(mat.size(), CV_8UC3);

        for(int i=0;i<contours.size();i++){
            Rect rect = boundingRect(contours.get(i));
//            if (rect.width < mat.cols() / 2)
//                continue;
            //在contoursImg上绘制最大的轮廓
            Imgproc.drawContours(contoursImg,contours,i, new Scalar(0,0,255),
                    2,8,hierarchy,0,new Point(0, 0));
            double area = contourArea(contours.get(i));
            System.out.println("第"+i+"个图像的面积是 "+area);
        }
        Imgcodecs.imwrite("D:/opencv/1-5.jpg", contoursImg);
    }

运行结果:

第0个图像的面积是 1761271.0
第1个图像的面积是 9820.5
第2个图像的面积是 8.5
第3个图像的面积是 3635.5
第4个图像的面积是 1003.0
第5个图像的面积是 1469.0
第6个图像的面积是 205.0
第7个图像的面积是 245100.0
第8个图像的面积是 11540.5
第9个图像的面积是 7646.0
第10个图像的面积是 7506.5
第11个图像的面积是 1651.0
第12个图像的面积是 2920.5
第13个图像的面积是 217.0
第14个图像的面积是 1307.5
第15个图像的面积是 963.0
第16个图像的面积是 591.0
第17个图像的面积是 4814.0
第18个图像的面积是 484.0
第19个图像的面积是 1216.5
第20个图像的面积是 60068.5
第21个图像的面积是 65.0
第22个图像的面积是 2154.5
第23个图像的面积是 323.0
第24个图像的面积是 7436.0
第25个图像的面积是 252.0
第26个图像的面积是 2632.0
第27个图像的面积是 614.0
第28个图像的面积是 343.0
第29个图像的面积是 168.0
第30个图像的面积是 10.0
第31个图像的面积是 7929.0
第32个图像的面积是 220.0
第33个图像的面积是 227.0
第34个图像的面积是 223.5

图片展示: 

Java+Opencv4 计算图像的面积

Java+Opencv4 计算图像的面积

Java+Opencv4 计算图像的面积

Java+Opencv4 计算图像的面积

Java+Opencv4 计算图像的面积

Java+Opencv4 计算图像的面积

部分参数说明:

Imgproc.findContours(Mat image, List contours, Mat hierarchy, int mode, int method, Point offset)

        参数说明:
        image:8位单通道图像。
        contours:存储检测到的轮廓的集合。
        hierarchy:可选的输出向量,包含了图像轮廓的拓扑信息。
        mode:轮廓检索模式。有如下几种模式:
        1、RETR_EXTERNAL只检测最外围的轮廓
        2、RETR_LIST提取所有的轮廓,不建立上下等级关系,只有兄弟等级关系
        3、RETR_CCOMP提取所有轮廓,建立为双层结构
        4、RETR_TREE提取所有轮廓,建立网状结构
        method:轮廓的近似方法。取值如下:
        1、CHAIN_APPROX_NONE获取轮廓的每一个像素,像素的最大间距不超过1
        2、CHAIN_APPROX_SIMPLE压缩水平垂直对角线的元素,只保留该方向的终点坐标(也就是说一条中垂线a-b,中间的点被忽略了)
        3、CHAIN_APPROX_TC89_LI使用TEH_CHAIN逼近算法中的LI算法
        4、CHAIN_APPROX_TC89_KCOS使用TEH_CHAIN逼近算法中的KCOS算法
        offset:每个轮廓点的可选偏移量。