max_cnt = max(contours, key=lambda cnt: contours_area(cnt)) # 创建空白画布 mask = np.zeros_like(img_bin) # 获取面积最大的 contours mask = cv.drawContours(mask, [max_cnt], 0, 255, -1)
时间: 2023-06-06 22:06:11 浏览: 64
这行代码的作用是从一个轮廓列表(contours)中,利用关键字参数(key)将每个轮廓(cnt)的面积(contours_area(cnt))计算出来,然后找出面积最大(max)的轮廓(max_cnt)。
相关问题
用c++ opencv实现python的sorted_cnt = sorted(contours, key=cv2.contourArea, reverse = True)
在C++中,可以使用以下代码实现与Python中sorted函数中的key参数类似的功能:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace cv;
using namespace std;
bool compareContourAreas(vector<Point> contour1, vector<Point> contour2) {
double i = fabs(contourArea(Mat(contour1)));
double j = fabs(contourArea(Mat(contour2)));
return (i > j);
}
int main() {
vector<vector<Point>> contours; // 存储轮廓
vector<Vec4i> hierarchy; // 存储轮廓的拓扑结构
Mat image = imread("test.jpg", IMREAD_GRAYSCALE);
findContours(image, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
sort(contours.begin(), contours.end(), compareContourAreas); // 排序
return 0;
}
```
在这个例子中,我们定义了一个名为compareContourAreas的函数,该函数接受两个轮廓作为参数,并返回一个布尔值。在该函数中,我们使用cv::contourArea函数计算每个轮廓的面积,并将它们的绝对值作为比较的依据。
最后,我们使用sort函数对轮廓进行排序,并传递compareContourAreas函数作为参数,以确保按面积大小的倒序排列。
需要注意的是,在C++中,没有直接的reverse参数,我们需要自己实现compareContourAreas函数来实现类似的功能。
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找到面积最大的连通域的标签 # largest_label = np.argmax(areas[1:]) + 1 # areas第一元素是背景的面积,所以要从除开背景之外的元素中找 areas_cont = np.array([cv2.contourArea(cnt) for cnt in contours]) largest_label = np.argmax(areas_cont) # 提取连通域的坐标点 max_area_contour = contours[largest_label] # 创建一个与掩模大小相同的零矩阵 max_area_mask = np.zeros_like(mask) # 将最大连通域的像素设置为1 cv2.drawContours(max_area_mask, [max_area_contour], -1, 1, thickness=cv2.FILLED) # 获取最大连通域的像素坐标 max_area_coords = np.argwhere(max_area_mask == 1) print(max_area_coords.shape)ada
这段代码的作用是找到给定掩模(mask)中面积最大的连通域,并获取该连通域的像素坐标。
首先,使用cv2.findContours()函数找到掩模中的所有连通域,并存储在contours列表中。
然后,通过遍历contours列表计算每个连通域的面积,将结果存储在areas_cont数组中。
接下来,使用np.argmax()函数找到areas_cont中面积最大的连通域的索引,该索引即为largest_label。
通过largest_label索引获取最大连通域的轮廓坐标点,存储在max_area_contour中。
创建一个与掩模大小相同的全零矩阵max_area_mask。
使用cv2.drawContours()函数将最大连通域的像素设置为1,并填充为实心。
最后,通过np.argwhere()函数获取max_area_mask中值为1的像素坐标,存储在max_area_coords中。
代码最后打印出max_area_coords的形状,即最大连通域的像素坐标数量和维度。