Java+Opencv4 计算图像的面积

环境配置移步: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

图片展示: 

部分参数说明:

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:每个轮廓点的可选偏移量。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wonder-King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值