在OpenCV上绘制图像中的单个轮廓

14
什么是在OpenCV中绘制单个轮廓的最佳方法?据我所见,drawContours 只能处理多个轮廓。
背景:我想将我的代码更改为for each循环。旧的代码:
//vector<vector<Point> > contours = result of findContours(...)
for (int i = 0; i < contour.size; i++){
    if(iscorrect(contours[i])){
        drawContours(img, contours, i, color, 1, 8, hierarchy);
    }
 }

这个邮件列表中提供的方法相当丑陋:

for (vector<Point> contour : contours){
     if(iscorrect(contour)){
          vector<vector<Point> > con = vector<vector<Point> >(1, contour);
          drawContours(img, con, -1, color, 1, 8);
     }
}

有没有更简便的方法来绘制单个轮廓(vector< Point> Object)?

3个回答

13

我有同样的问题,到目前为止我发现更好的方法是:

for (vector<Point> contour : contours){
  if(iscorrect(contour)){
    drawContours(img, vector<vector<Point> >(1,contour), -1, color, 1, 8);
  }
}

这几乎与您的相同,但少了一行。

我最初的想法是使用Mat(contour),但它没有起作用。

如果您已经找到更好的方法,请在这里发布并分享智慧。


启用优化后,编译后的机器代码应该是完全相同的。我没有更好的办法,也许随着OpenCV更新,会有一些改进实现。 - Sebastian Schmitz

8

在OpenCV 3.0中,polylines()更加灵活,我们可以进行以下操作:

vector<Point> approx;
polylines(frame, approx, true, color, 1, 8);

在你的循环中,这将是:
for (vector<Point> contour : contours) {
    if (iscorrect(contour)) {
        polylines(frame, approx, true, color, 1, 8);
    }
}

2
使用绘制轮廓并不完美,但您不需要循环。
std::vector<cv::Point> contour;
std::vector<std::vector<cv::Point> > contourVec;
contourVec.push_back(contour);

cv::drawContours(img,contourVec,0,color,1,8,hierarchy); //Replace i with 0 for index. 

1
我只想绘制符合特定属性的轮廓。这就是迭代的原因。 - Sebastian Schmitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接