2014-02-19 82 views
7

在OpenCV中繪製單個輪廓的最佳方式是什麼?據我所見drawContours只能處理多個輪廓。在OpenCV中繪製單個輪廓在圖像上

背景:我想將我的代碼更改爲每個循環。舊代碼:

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

有畫單輪廓(矢量<點>對象)一個更清潔的方式?

回答

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

打開Optimization後,編譯後應該是相同的機器碼。我沒有更好的辦法,也許用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); 
    } 
}