2014-02-19 7 views
7

Каков наилучший способ рисования одного контура в OpenCV? Насколько я вижу, drawContours может обрабатывать только несколько контуров.Рисование одного контура в OpenCV на изображении

Фон: Я хочу изменить свой код на a для каждого цикла. Старый код:

//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); 
    } 
} 

путь представлен in this mailing list довольно некрасиво:

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

Есть уборщик способ сделать одиночные контуры (вектор < Point> Object)?

ответ

1

Использование контуров контуров, это не совсем красиво, но вам не нужен цикл.

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

Я только хочу, чтобы нарисовать контуры, которые выполняют определенные свойства. В этом причина итерации. –

6

У меня был тот же вопрос, и лучший способ, что я не нашли до сих пор, это:

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

Это почти то же самое, что у вас есть, но одна строка меньше.

Моя первая мысль была использовать Mat(contour), но это не сработало.

Если вы нашли лучший способ сделать это, опубликуйте его здесь и разделите мудрость.

+0

С включенной оптимизацией он должен быть идентичным машинным кодом после компиляции. У меня нет лучшего способа, может быть, с обновлением openCV будет реализовано что-то. –

4

С OpenCV 3.0 полилинии() является более гибким, и мы можем сделать, например:

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); 
    } 
} 
Смежные вопросы