Рисование выпуклости дефектов C ++ OpenCV

Из приведенного ниже кода я могу нарисовать самый большой контур с центроидом, отмеченным маленьким кружком, а корпус — желтой линией. Как нарисовать дефекты выпуклости? Должен ли я использовать функцию 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. Я предпочитаю мат.

2

Решение

Вы можете нарисовать результат операции выпуклой оболочки с помощью ‘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);
1

Другие решения

Других решений пока нет …