OpenCV:CvBox2D角度

时间:2013-11-26 00:51:05

标签: c++ c opencv angle ellipse

我正在进行一些头部跟踪,我正在尝试通过使用openCV将椭圆拟合到头部轮廓来估计滚动角度。一切正常,cvFitEllipse2返回一个CvBox2D。我想用盒子的角度来计算滚动角度,即图像的y轴和椭圆的长轴之间的角度。

他们说箱角是水平轴和第一侧之间的角度(即长度),但我得到的结果有些奇怪。

  • 如果我的头向上,天使是180°。
  • 当我向右倾斜时,角度正常减小到135°左右,然后突然跳到315°左右。
  • 当我向左倾斜时,角度上升到260°左右,没有任何奇怪的变化。

以下是此视频的简短视频: 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));

2 个答案:

答案 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));

如果这不起作用,请发布您的代码以提取滚动角度,以便我们查看数字。