Я занимаюсь отслеживанием головы и пытаюсь оценить ангела рулона, используя openCV, чтобы подогнать эллипс к контуру головы. Это все работает нормально, и cvFitEllipse2 возвращает CvBox2D. Я хотел бы использовать угол рамки для вычисления угла крена, то есть угла между осью Y изображения и длинной осью эллипса.
Они говорят, что угол коробки — это угол между горизонтальной осью и первой стороной (то есть длиной), но результаты, которые я получаю, несколько странны.
Вот короткое видео этого:
угол cvBox2D
Есть идеи, что происходит и как я могу рассчитать угол крена?
И вот мой код:
CvBox2D box;
CvPoint center;
CvSize size;
int count = largest_contour->total;
CvMat* points_f = cvCreateMat( 1, count, CV_32FC2 );
CvMat points_i = cvMat( 1, count, CV_32SC2, points_f->data.ptr );
cvCvtSeqToArray(largest_contour, points_f->data.ptr, CV_WHOLE_SEQ );
cvConvert( &points_i, points_f );
box = cvFitEllipse2(points_f);
center = cvPointFrom32f(box.center);
size.width = cvRound(box.size.width*0.5);
size.height = cvRound(box.size.height*0.5);
cvEllipse(dst,center,size,box.angle,0,360,cvScalar(0,255,0),2,8,0);
float newAngle = (box.angle > 90 ? 180 - box.angle : -1*(box.angle));
Итак, я нашел ответ на свою проблему.
Если вы посмотрите на исходный код функции cvFitEllipse2, который находится в … \ modules \ imgproc \ src file: «shapedescr.cpp», вы увидите, что есть два разных алгоритма для подбора эллипса. По умолчанию используется только одна версия openCV231, которую я использую.
icvFitEllipse_F — это функция, которая вызвала мою проблему, но есть также часть алгоритма, которая не используется, потому что в коде функции cvFitEllipse2 содержится следующее утверждение:
#if 1
icvFitEllipse_F( ptseq, &box );
#else
/*
* New fitellipse algorithm, contributed by Dr. Daniel Weiss
*/
поэтому новый алгоритм fitellipse не компилируется.
Изменяя #if 1 на #if 0, другой алгоритм компилируется и используется вместо icvFitEllipse_F, и теперь все работает нормально.
Я использовал отслеживание CAMShift в нескольких приложениях отслеживания головы с приведенным ниже расчетом после простой модификации демоверсии CAMShift из OpenCV:
float newAngle = (trackBox.angle> 90? 180 — trackBox.angle: -1 * (trackBox.angle));
Если это не работает, пожалуйста, опубликуйте свой код для извлечения угла крена, чтобы мы могли взглянуть на цифры.