2012-10-20 127 views
2

從下面的代碼中,我可以畫出最大的輪廓,質心標記爲小圓圈,船體爲黃色線。我如何繪製凸面缺陷?我應該使用circle()函數還是drawContours()函數?繪製凸起缺陷C++ OpenCV

Mat bw; 
Mat canny_output; 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 

findContours(bw, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
int s = getBiggestContour(contours); 

Mat drawing = Mat::zeros(src.size(), CV_8UC3); //UC1 

Point2f mc = getCentroidPoint(contours[s]); 
drawContours(drawing, contours, s, Scalar(255,255,255), -1, 8, hierarchy, 0, Point()); 
circle(drawing, mc, 4, Scalar(0,0,255), 1, 8, 0); 

vector<vector<Point> >hull(contours[s].size()); 
convexHull(Mat(contours[s]), hull[s], false); 
drawContours(drawing, hull, s, Scalar(0,255,255), 1, 8, vector<Vec4i>(), 0, Point()); 

上述工程的代碼,但只有一個輪廓要使用這是最大的輪廓,所以我認爲使用矢量>船體實在是太多了。我如何簡化?

下面的代碼是來自另一個stackoverflow的問題,但它並沒有顯示如何使用缺陷變量繪製到MAT圖像的凸性缺陷。這怎麼能實現?

vector<vector<int> > hullsI(contours.size()); 
vector<vector<Point> > hullsP(contours.size()); 
vector<vector<Vec4i> > defects(contours.size()); 

for(int i = 0; i <contours.size(); ++i){ 
    //find the hulls 
    convexHull(contours[i], hullsI[i], false, false); 
    convexHull(contours[i], hullsP[i], false, true); 
    //find the defects 
    if (contours[i].size() >3){ 
     convexityDefects(contours[i], hullsI[i], defects[i]); 
    } 
} 

我不想使用IplImage。我更喜歡馬特。

+0

最好的答案,我發現是在這裏:HTTP://計算器。 com/a/14137154/616644 –

回答

1

您可以使用'cvDrawContours()'繪製凸包操作的結果,但是您需要設置正確的參數以使其可行。我有一個例子,但它使用「cvConvexHull2()」和IplImages但它應該工作方式相同的墊子和其他凸形輪廓操作:

IplImage* src; //the image where the contours are detected on 
IplImage frm; //the image you want the results to be drawn on 

CvMemStorage* storage = cvCreateMemStorage(0); 
CvSeq* contours = NULL; 
cvFindContours(src, storage, &contours, sizeof (CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 
for (CvSeq* c = contours; c != NULL; c = c->h_next) { 
      CvSeq* dest = NULL; 
      CvMemStorage* hullStorage = cvCreateMemStorage(0); 
      dest = cvConvexHull2(c, hullStorage, CV_CLOCKWISE, 1); 
      cvDrawContours(frm, dest, cvScalarAll(255), cvScalarAll(255), 0, 2, 8); 
      cvReleaseMemStorage(&hullStorage); 
     } 
cvReleaseMemStorage(&storage); 
+0

你有使用Mat的示例代碼嗎?我不是很熟悉IplImage和CvSeq。 –

+0

無論如何你必須使用CvSeq,但我稍後會檢查它如何使用Mat,同時你可以將Mat轉換爲IplImage *: 'cv :: Mat myMatrice';' 'IplImage myImage = myMatrice;' 回到墊子: 'cv :: Mat img(iplimg);' –