opencv java 轮廓提取_opencv3/C++轮廓的提取与筛选方式
时间: 2023-11-04 07:54:25 浏览: 205
OpenCV是一个流行的计算机视觉库,提供了许多图像处理和计算机视觉算法。轮廓提取是OpenCV中的一个重要功能,它可以用于检测图像中的形状和物体。
在Java中使用OpenCV进行轮廓提取,可以使用OpenCV的Java接口。以下是基本的轮廓提取代码示例:
```
Mat src = Imgcodecs.imread("input.jpg");
Mat gray = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.Canny(gray, gray, 100, 200);
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(gray, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
```
这段代码读取输入图像,将其转换为灰度图像,使用Canny算子进行边缘检测,然后使用findContours函数提取轮廓。这个函数返回一个包含所有轮廓的MatOfPoint列表,以及一个包含层次结构信息的Mat。
在C++中,轮廓提取与Java非常相似。以下是一个简单的例子:
```
cv::Mat src = cv::imread("input.jpg");
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
cv::Canny(gray, gray, 100, 200);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(gray, contours, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
```
这段代码也读取输入图像,将其转换为灰度图像,使用Canny算子进行边缘检测,然后使用findContours函数提取轮廓。这个函数返回一个包含所有轮廓的vector<vector<Point>>列表。
在Java或C++中,提取轮廓后可能需要对它们进行筛选,以便只保留感兴趣的轮廓。例如,可以使用轮廓的面积、周长或形状等特征来筛选轮廓。以下是一个简单的示例,仅保留面积大于100的轮廓:
Java:
```
List<MatOfPoint> filteredContours = new ArrayList<>();
for (MatOfPoint contour : contours) {
double area = Imgproc.contourArea(contour);
if (area > 100) {
filteredContours.add(contour);
}
}
```
C++:
```
std::vector<std::vector<cv::Point>> filteredContours;
for (const auto& contour : contours) {
double area = cv::contourArea(contour);
if (area > 100) {
filteredContours.push_back(contour);
}
}
```
这个例子计算每个轮廓的面积,然后仅保留面积大于100的轮廓。可以根据需求使用不同的特征和阈值来筛选轮廓。
阅读全文