Я делаю отслеживание головы, и я пытаюсь оценить ангела, используя 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 файле: "shapeescr.cpp", вы увидите, что для выполнения эллипса есть два разных алгоритма. По умолчанию только один используется в версии openCV231, которую я использую.
icvFitEllipse_F - это функция, которая вызвала мою проблему, но есть также часть алгоритма, которая не используется, потому что следующий код находится в коде функции cvFitEllipse2:
#if 1
icvFitEllipse_F( ptseq, &box );
#else
/*
* New fitellipse algorithm, contributed by Dr. Daniel Weiss
*/
поэтому новый алгоритм фитильпеля не компилируется.
Изменяя #if 1 на #if 0, другой алгоритм компилируется и используется вместо icvFitEllipse_F, и теперь все работает отлично.
Я использую отслеживание CAMShift в нескольких приложениях отслеживания заголовков с приведенным ниже вычислением после простого изменения демо-версии CAMShift от OpenCV:
float newAngle = (trackBox.angle> 90? 180 - trackBox.angle: -1 * (trackBox.angle));
Если это не сработает, отправьте свой код для извлечения угла поворота, чтобы мы могли посмотреть на цифры.