我正在做一些头部跟踪,我试图通过使用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));发布于 2013-12-02 08:35:24
因此,我找到了我的问题的答案。
如果您查看cvFitEllipse2函数的源代码(您可以在...\modules\imgproc\src文件中找到:"shapedescr.cpp“),您将看到有两种不同的椭圆拟合算法。默认情况下,在我使用的openCV231版本中只使用一个。
icvFitEllipse_F是引起我的问题的函数,但是算法中也有一部分没有使用,因为下面的语句在cvFitEllipse2函数的代码中:
#if 1
icvFitEllipse_F( ptseq, &box );
#else
/*
* New fitellipse algorithm, contributed by Dr. Daniel Weiss
*/因此,新的not椭圆算法是不编译的。
通过将#if 1改为#if 0,另一个算法被编译并使用,而不是icvFitEllipse_F,现在一切都很好。
发布于 2013-11-26 02:08:44
我在几个头部跟踪应用程序上使用了CAMShift跟踪,计算如下,简单地修改了来自OpenCV的CAMShift演示:
newAngle = (trackBox.angle > 90 ?180-trackBox.angle:-1*( trackBox.angle ));
如果这不起作用,请张贴您的代码,以提取滚角,以便我们可以看看数字。
https://stackoverflow.com/questions/20206541
复制相似问题