OpenCV: угол CvBox2D

Я занимаюсь отслеживанием головы и пытаюсь оценить ангела рулона, используя openCV, чтобы подогнать эллипс к контуру головы. Это все работает нормально, и cvFitEllipse2 возвращает CvBox2D. Я хотел бы использовать угол рамки для вычисления угла крена, то есть угла между осью Y изображения и длинной осью эллипса.

Они говорят, что угол коробки — это угол между горизонтальной осью и первой стороной (то есть длиной), но результаты, которые я получаю, несколько странны.

  • Ангел на 180 ° на случай, если моя голова направлена ​​вверх.
  • Когда я наклоняюсь вправо, угол обычно уменьшается примерно до 135 °, а затем внезапно скачет примерно до 315 °.
  • Когда я наклоняюсь влево, угол поднимается примерно до 260 ° без каких-либо странных изменений.

Вот короткое видео этого:
угол 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));

0

Решение

Итак, я нашел ответ на свою проблему.

Если вы посмотрите на исходный код функции 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, и теперь все работает нормально.

1

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

Я использовал отслеживание CAMShift в нескольких приложениях отслеживания головы с приведенным ниже расчетом после простой модификации демоверсии CAMShift из OpenCV:

float newAngle = (trackBox.angle> 90? 180 — trackBox.angle: -1 * (trackBox.angle));

Если это не работает, пожалуйста, опубликуйте свой код для извлечения угла крена, чтобы мы могли взглянуть на цифры.

0