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

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

完成钱确认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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值