我正在进行一些头部跟踪,我正在尝试通过使用openCV将椭圆拟合到头部轮廓来估计滚动角度。一切正常,cvFitEllipse2返回一个CvBox2D。我想用盒子的角度来计算滚动角度,即图像的y轴和椭圆的长轴之间的角度。
他们说箱角是水平轴和第一侧之间的角度(即长度),但我得到的结果有些奇怪。
以下是此视频的简短视频: cvBox2D angle
知道发生了什么以及如何计算侧倾角?
这是我的代码:
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 :(得分:1)
所以,我找到了问题的答案。
如果你看一下你可以在... \ modules \ imgproc \ src文件中找到的cvFitEllipse2函数的源代码:" 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 :(得分:0)
在简单地修改OpenCV的CAMShift演示之后,我一直在几个头部跟踪应用程序上使用CAMShift跟踪计算:
float newAngle =(trackBox.angle> 90?180 - trackBox.angle:-1 *(trackBox.angle));
如果这不起作用,请发布您的代码以提取滚动角度,以便我们查看数字。