java+opencv4.5.0 实现获取图片红色区域,并且用线条连接每个区域
时间: 2024-04-30 17:21:12 浏览: 13
要实现这个功能,你需要使用 Java 的 OpenCV 库。下面是一个简单的步骤:
1. 导入 OpenCV 库
```java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
```
2. 加载图片
```java
Mat image = Imgcodecs.imread("path/to/image.jpg");
```
3. 将图像转换为 HSV 颜色空间
```java
Mat hsvImage = new Mat();
Imgproc.cvtColor(image, hsvImage, Imgproc.COLOR_BGR2HSV);
```
4. 用 inRange 函数获取红色区域的二值图像
```java
Mat redMask = new Mat();
Scalar lowerRed = new Scalar(0, 100, 100);
Scalar upperRed = new Scalar(10, 255, 255);
Core.inRange(hsvImage, lowerRed, upperRed, redMask);
```
5. 对二值图像进行形态学操作,去掉噪点
```java
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(5, 5));
Imgproc.morphologyEx(redMask, redMask, Imgproc.MORPH_OPEN, kernel);
Imgproc.morphologyEx(redMask, redMask, Imgproc.MORPH_CLOSE, kernel);
```
6. 用 findContours 函数获取红色区域的轮廓
```java
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(redMask, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
```
7. 用 drawContours 函数将轮廓连接起来
```java
Imgproc.drawContours(image, contours, -1, new Scalar(0, 0, 255), 2);
```
完整的代码示例:
```java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.MatOfPoint;
import java.util.ArrayList;
import java.util.List;
public class Main {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
Mat image = Imgcodecs.imread("path/to/image.jpg");
Mat hsvImage = new Mat();
Imgproc.cvtColor(image, hsvImage, Imgproc.COLOR_BGR2HSV);
Mat redMask = new Mat();
Scalar lowerRed = new Scalar(0, 100, 100);
Scalar upperRed = new Scalar(10, 255, 255);
Core.inRange(hsvImage, lowerRed, upperRed, redMask);
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(5, 5));
Imgproc.morphologyEx(redMask, redMask, Imgproc.MORPH_OPEN, kernel);
Imgproc.morphologyEx(redMask, redMask, Imgproc.MORPH_CLOSE, kernel);
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(redMask, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(image, contours, -1, new Scalar(0, 0, 255), 2);
Imgcodecs.imwrite("path/to/output.jpg", image);
}
}
```
这样就可以实现获取图片红色区域,并用线条连接每个区域的功能啦!