首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV: CvBox2D角

OpenCV: CvBox2D角
EN

Stack Overflow用户
提问于 2013-11-26 00:51:04
回答 2查看 2K关注 0票数 0

我正在做一些头部跟踪,我试图通过使用openCV来拟合头部轮廓的椭圆来估计滚动角。这一切都很好,cvFitEllipse2返回一个CvBox2D。我想用盒子的角度来计算滚动角,也就是图像的y轴和椭圆的长轴之间的角度。

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

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

这是一个简短的视频:cvBox2D角

你知道怎么回事吗?我怎么能算出滚角?

这是我的密码:

代码语言:javascript
复制
  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));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-02 08:35:24

因此,我找到了我的问题的答案。

如果您查看cvFitEllipse2函数的源代码(您可以在...\modules\imgproc\src文件中找到:"shapedescr.cpp“),您将看到有两种不同的椭圆拟合算法。默认情况下,在我使用的openCV231版本中只使用一个。

icvFitEllipse_F是引起我的问题的函数,但是算法中也有一部分没有使用,因为下面的语句在cvFitEllipse2函数的代码中:

代码语言:javascript
复制
#if 1
    icvFitEllipse_F( ptseq, &box );
#else
/*
 *  New fitellipse algorithm, contributed by Dr. Daniel Weiss
 */

因此,新的not椭圆算法是不编译的。

通过将#if 1改为#if 0,另一个算法被编译并使用,而不是icvFitEllipse_F,现在一切都很好。

票数 1
EN

Stack Overflow用户

发布于 2013-11-26 02:08:44

我在几个头部跟踪应用程序上使用了CAMShift跟踪,计算如下,简单地修改了来自OpenCV的CAMShift演示:

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

如果这不起作用,请张贴您的代码,以提取滚角,以便我们可以看看数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20206541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档