首页 > 编程语言 >java+opencv4来获取图像中轮廓的最小外接矩形

java+opencv4来获取图像中轮廓的最小外接矩形

时间:2024-09-12 15:23:33浏览次数:10  
标签:Imgproc java 外接 new opencv opencv4 org import Mat

 举例:获取以下图片中的火车的最小外接矩形

完成钱确认opencv的环境配置完整。

要想查找图片中的轮廓信息,首先要获取图片的二制图,因为二制图的查找效率更高,具体原因自行百度。

为了提高转换二制图的效率可以现将图片转换为灰度图。示例代码如下:

// 将彩色图像转换为灰度图像
Mat grayImage = new Mat();
Imgproc.cvtColor(sourceImage, grayImage, Imgproc.COLOR_BGR2GRAY);

// 对灰度图像进行二值化处理
Mat binaryImage = new Mat();
Imgproc.threshold(grayImage, binaryImage, 127, 255, Imgproc.THRESH_BINARY);

接下来就是查找轮廓,进行筛选,绘制最小外接矩形,完整示例代码如下:

import org.opencv.core.Core;
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.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.List;

public class AllContoursRectangles {
    public static void main(String[] args) {
        // 加载 OpenCV 库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // 读取图像
        Mat sourceImage = Imgcodecs.imread("F:\\project\\JavaProject\\java_interface\\src\\main\\resources\\test_media\\a.jpeg");
        if (sourceImage.empty()) {
            System.out.println("Could not open or find the image");
            return;
        }

        // 将彩色图像转换为灰度图像
        Mat grayImage = new Mat();
        Imgproc.cvtColor(sourceImage, grayImage, Imgproc.COLOR_BGR2GRAY);

        // 对灰度图像进行二值化处理
        Mat binaryImage = new Mat();
        Imgproc.threshold(grayImage, binaryImage, 127, 255, Imgproc.THRESH_BINARY);
//        HighGui.imshow("binary", binaryImage);

        // 用于存储找到的轮廓
        List<MatOfPoint> contours = new ArrayList<>();
        // 存储轮廓的层次结构信息
        Mat hierarchy = new Mat();
        // 查找图像中的轮廓
        Imgproc.findContours(binaryImage, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

        // 找到面积最大的轮廓
        double maxArea = 0;
        MatOfPoint largestContour = null;
        for (MatOfPoint contour : contours) {
            double area = Imgproc.contourArea(contour);
            if (area > maxArea) {
                maxArea = area;
                largestContour = contour;
            }
        }
        System.out.println("最大面积"+maxArea);

        // 遍历所有轮廓
        for (MatOfPoint contour : contours) {
            double area = Imgproc.contourArea(contour);
            if (area > maxArea * 0.3 && area != maxArea) {
                MatOfPoint2f contour2f = new MatOfPoint2f(contour.toArray());
                // 计算最小外接矩形(旋转矩形)
                org.opencv.core.RotatedRect rotatedRect = Imgproc.minAreaRect(contour2f);

                // 获取旋转矩形的四个顶点
                Point[] vertices = new Point[4];
                rotatedRect.points(vertices);

                // 绘制旋转矩形
                for (int i = 0; i < 4; i++) {
                    // sourceImage 选择想要绘制的图像  第二个和第三个参数分别是直线的起点和终点
                    // 第三个参数是直线的颜色  第四个参数是直线的粗细程度(以像素为单位)
                    Imgproc.line(sourceImage, vertices[i], vertices[(i + 1) % 4], new Scalar(0, 255, 0), 2);
                }
            }
        }

        // 显示处理后的图像
        HighGui.imshow("Result", sourceImage);
        HighGui.waitKey(0);
        HighGui.destroyAllWindows();
    }
}

标签:Imgproc,java,外接,new,opencv,opencv4,org,import,Mat
From: https://blog.csdn.net/weixin_64069407/article/details/142176576

相关文章

  • JAVA——方法
    publicstatic返回值类型方法名(参数){        //方法体        return数据;}一、定义与调用publicclassdemo9_12{publicstaticvoidmain(String[]args){//调用myName();}//定义publicstaticvoidmyN......
  • 力扣238 移动零 Java版本 时间复杂度为O(0)
    文章目录题目描述代码题目描述给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出......
  • Java学习路线:从零基础到高级开发者的完整指南
    初学者入门指南1.环境搭建安装JDK:下载并安装最新版本的JDK(JavaDevelopmentKit)。配置环境:设置JAVA_HOME环境变量,并将bin目录添加到PATH中。选择IDE:使用Eclipse、IntelliJIDEA或其他任何你喜欢的Java集成开发环境。2.Java基础知识HelloWorld:编写你的第一个Java......
  • Java开发者无痛丝滑入门Python
    哈喽各位道友,经过两周的更新,凡人编程传的第一个“系列”学习笔记《Python基础》已经全部上线啦,现在免费分享给大家,学习路线在下面,点击链接即可跳转对应笔记。这套笔记有什么不一样的地方呢?这套笔记适合有一定Java编程基础的道友,因为笔记语言比较简练,大多只讲重点,避免了啰嗦......
  • Java之UDP端到端通讯基础
    一,发送器代码packagenet.ittimeline.java.network.socket.udp.talk;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetSocketAddress;/......
  • 基于java的ssm框架应急资源管理系统
     博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、爬虫、web开发,已经做了六年的程序开发,开发过上千套大学生实战程序,可以定制、也可成品项目,博客中有上百套程序可供参考,欢迎共同交流学习。......
  • Java小白一文讲清Java中集合相关的知识点(九)
    Map和Set常用的APIMap常用APIput(Kkey,Vvalue):将指定的键值对插入到映射中。get(Objectkey):返回与指定键关联的值,如果键不存在则返回null。remove(Objectkey):移除指定键及其对应的值。containsKey(Objectkey):判断是否包含指定的键。containsValue(Object......
  • JAVA面试官问你:CPU狂飙900%,该怎么处理?【转】
    首先,说明一下问题:CPU飙升200%以上是生产容易发生的场景场景:1:MySQL进程飙升900%大家在使用MySQL过程,想必都有遇到过CPU突然过高,或者达到200%以上的情况。数据库执行查询或数据修改操作时,系统需要消耗大量的CPU资源维护从存储系统、内存数据中的一致性。并发量大并且大量SQL性能低......
  • 基于java+SpringBoot+Vue的小徐影城管理系统设计与实现
    开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis工具:IDEA/Ecilpse、Navicat、Maven系统简介小徐影城管理系统是一款基于Java、SpringBoot和Vue.js技术开发的影院管理系统,旨在为用户提供一个便捷、高效的在线购票和影院管理平台。系统通过B/S架构,实现了管理员和用......
  • 【java逆向】3分钟理清Java对象头里面的那些杂事
    原创龙虾编程对象头是一个对象用于保存自身状态的区域,在HotSpot虚拟机中,对象在堆内存中存储的布局可以划分为三个部分:对象头(Header)、实例数据(InstanceData)、对齐填充(Padding),如下如所示:在Java中普通对象和数组对象的对象在布局上存在一定的差异,数组对象相比普通对象多了数......