举例:获取以下图片中的火车的最小外接矩形
完成钱确认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