Из приведенного ниже кода я могу нарисовать самый большой контур с центроидом, отмеченным маленьким кружком, а корпус — желтой линией. Как нарисовать дефекты выпуклости? Должен ли я использовать функцию circle () или функцию drawContours ()?
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() );
Приведенный выше код работает, но нужно использовать только один контур, который является самым большим, поэтому я думаю, что использовать vector> для оболочки слишком много. Как мне это упростить?
Приведенный ниже код взят из другого вопроса 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. Я предпочитаю мат.
Вы можете нарисовать результат операции выпуклой оболочки с помощью ‘cvDrawContours ()’, но вам необходимо установить правильные параметры, чтобы это было возможно. У меня есть пример, но он использует ‘cvConvexHull2 ()’ и IplImages, но он должен работать одинаково для Mat и другой операции выпуклого:
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);
Других решений пока нет …