我在 python 中编写了一个使用 max()方法的脚本,我试图用c ++重新创建一个类似的程序,但是我在获取值时遇到了麻烦对于面具中最大的轮廓。
我曾尝试在C ++中使用算法库中的 max_element()函数,但无济于事。我也尝试取消引用迭代器但收到一系列错误,这是我的代码:
if (contours.size() > 0)
{
c = *max_element(contours.begin(), contours.end());
//not compiling
}
这是错误:
no match for 'operator=' (operand types are 'std::vector<std::vector<cv::Point_<int> > >' and 'std::vector<cv::Point_<int> >')
以下是我在Python中的表现:
if len(contours) > 0;
#find largest contour in mask, use to compute minEnCircle
c = max(contours, key = cv2.contourArea)
(x,y), radius) = cv2.minEnclosingCircle(c)
M = cv2.moments(c)
答案 0 :(得分:7)
在Python示例中,您将比较器作为key
参数
c = max(contours, key = cv2.contourArea)
相当于将比较器传递给std::max_element
auto c = *std::max_element(contours.begin(),
contours.end(),
[](std::vector<cv::Point> const& lhs, std::vector<cv::Point> const& rhs)
{
return contourArea(lhs, false) < contourArea(rhs, false);
});
在这种情况下,c
将是std::vector<cv::Point>
类型,代表轮廓。
答案 1 :(得分:0)
我认为该集合是根据OpenCV所需的findContours
函数所需的点的嵌套向量。
在这种情况下,您可以看到解决方案的示例:Find Biggest Contour Using C++
基本上,您可以调用contourArea
来获取轮廓所采用的实际区域,或者boundingRect
或者minAreaRect
来确定可以包含轮廓的区域。取决于你实际需要的是什么。