Использование cvApproxPoly () для результатов cvConvexHull2 () в OpenCV - PullRequest
3 голосов
/ 08 февраля 2012

Я пишу код C ( not C ++) для запуска выпуклой оболочки по контурам прямоугольников. Код (очень упрощенный) для этого выглядит следующим образом:

CvSeq* contours;
CvSeq* hull;

cvFindContours( img, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, CvPoint(0,0) );
hull = cvConvexHull2( contours, storage, CV_CLOCKWISE, 0 );

Где img и contours оба действительны. Между этими строками намного больше, но часть FindContours была протестирована на работу.

Этот код выдает исключение: Ошибка: неверный аргумент (неподдерживаемый тип последовательности) в cvApproxPoly .

Я сказал , что проблема в том, что флаг, который идентифицирует последовательность как ломаную линию, не установлен, и я попробовал предложение hull->flags = hull->flags | 512, но предположительно флаги изменились где-то между 2008 и теперь, так как это не работает.

Таким образом, вопрос заключается в следующем: как использовать cvApproxPoly () для результатов cvConvexHull2 ()? Какой тип данных мне следует использовать, и каковы надлежащие аргументы для cvApproxPoly ()?

1 Ответ

3 голосов
/ 21 декабря 2012

Я думаю, что вам не хватает параметра хранения:

cvFindContours(<CvArr *image>, <CvMemStorage *storage>, <CvSeq **first_contour>, <int header_size>, <int mode>, <int method>, <CvPoint offset>)

Тест с использованием

CvMemStorage *storage = cvCreateMemStorage(0);
cvFindContours( img, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, CvPoint(0,0) );
hull = cvConvexHull2( contours, storage, CV_CLOCKWISE, 0 );
...