java opencv,一张图片中,存在多个某种图案的图像,如何寻找到这几个图案的坐标信息,并划框框出匹配到的图像
时间: 2024-10-09 15:10:10 浏览: 39
在Java中,使用OpenCV库进行图案检测并获取坐标信息通常涉及到模板匹配(Template Matching)。以下是基本步骤:
1. **安装与导入库**:
首先,确保已安装了OpenCV for Java,可以通过Maven或Gradle将其作为依赖引入项目。
2. **读取图片和模板**:
使用` Imgcodecs.imread()`读取源图像和你要查找的模板图片。
3. **模板匹配**:
- `MatchTemplate()`: 这个函数将模板遍历整个源图像,计算每个位置处模板和源图像的小差异,得到一个响应图。
- 或者 `goodFeaturesToTrack()` 和 `minMaxLoc()`: 对响应图进行非极大值抑制,找到最大响应值的位置,即疑似匹配区域。
4. **定位边界并框选**:
- 获取匹配点的坐标,然后可以使用`Rect`类创建一个矩形框,其左上角是匹配点,宽度和高度由模板确定。
- 可以使用`MatOfPoint`存储所有匹配点,再通过它们画出矩形框。
5. **显示结果**:
使用`imshow()`显示原始图像和标记的矩形框。
6. **迭代处理**:
如果有多个相同的图案需要检测,可以在每次循环中应用上述步骤,直到所有图案都被找到。
```java
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class TemplateMatching {
// ... (其他初始化代码)
public static void main(String[] args) {
// ... (加载图片和模板)
Mat src = Imgcodecs.imread("source.jpg");
Mat template = Imgcodecs.imread("template.jpg");
// 模板匹配
Mat result = new Mat(src.size(), CvType.CV_32FC1);
Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF_NORMED);
// 寻找最大响应值位置
MatOfPoint corners = new MatOfPoint();
Core.minMaxLoc(result, null, result, corners);
// 根据最高响应点创建矩形
Point matchCenter = corners.toArray()[0];
Rect rect = new Rect(matchCenter.x - template.cols() / 2, matchCenter.y - template.rows() / 2,
template.cols(), template.rows());
// 绘制矩形
Imgproc.rectangle(src, rect.tl(), rect.br(), new Scalar(0, 0, 255), 2);
// 显示结果
Imgcodecs.imwrite("result.jpg", src);
// ... (如果还有更多图案,重复以上过程)
}
}
```
阅读全文