如何绘制椭圆的轴?

3

我正在使用Opencv和C++的fitellipse函数,得到以下数值:

/// Find the rotated rectangles and ellipses for each contour
vector<RotatedRect> minRect( contours.size() );
vector<RotatedRect> minEllipse( contours.size() );

for( int i = 0; i < contours.size(); i++ )
{
   minRect[i] = minAreaRect( Mat(contours[i]) );

   if( contours[i].size() > 5 )
      minEllipse[i] = fitEllipse( Mat(contours[i]) );

   // ...
}

float xc    = minEllipse[element].center.x;
float yc    = minEllipse[element].center.y;
float a     = minEllipse[element].size.width  / 2;   
float b     = minEllipse[element].size.height / 2;
float theta = minEllipse[element].angle; 

但是,有了这些值,我如何绘制一个椭圆的坐标轴,例如下面的椭圆? enter image description here 注意:元素是存储在minEllipse中的椭圆。

1
你是在询问如何根据线段的端点、长度和斜率角来绘制一条直线吗? - n. m.
我想绘制旋转椭圆轴,其中包括椭圆中心点、半径长度和角度,因为图像中的椭圆是旋转的,所以我想在椭圆内部绘制新的轴。 - user3704922
1
看起来你需要的是几何学方面的帮助,而不是编程。 - n. m.
我认为这些值可能只能画出轴线,但我搜索了一下,没有找到,并且我使用的所有几何方法都没有给我好的结果。 - user3704922
1
如果你无法在纸上画出来,那么你可能错了地方。 - n. m.
3个回答

4
你可以使用 minEllipse[element].points 来获取旋转边界矩形的四个角落,就像 这里 描述的那样。
然后只需计算矩形每侧两点的平均值,即可得到轴的端点...
Point2f vertices[4];
minEllipse[element].points(vertices);
line(image, (vertices[0] + vertices[1])/2, (vertices[2] + vertices[3])/2, Scalar(0,255,0));
line(image, (vertices[1] + vertices[2])/2, (vertices[3] + vertices[0])/2, Scalar(0,255,0));

3
您可能正在寻找以下公式:
ct = cos(theta)
st = sin(theta)

LongAxix0.x = xc - a*ct
LongAxis0.y = yc - a*st
LongAxis1.x = xc + a*ct
LongAxix1.y = yc + a*st

ShortAxix0.x = xc - b*st
ShortAxix0.y = yc + b*ct
ShortAxis1.x = xc + b*st
ShortAxix2.y = yc - b*ct

0
但是有了这些值,我应该如何绘制椭圆的轴?椭圆的轴通过它的中心。
float xc = minEllipse[element].center.x;
float yc = minEllipse[element].center.y;

轴的起点和终点可以偏离由椭圆的宽度和高度定义的中心,即:

// horizontal axis start/ end point

// coordinates
int HxStart = xc - size.width  / 2;
int HyStart = yc;

int HxEnd = xc + size.width  / 2;
int HyEnd = yc;

// points
Point Hstart(HxStart, HyStart);
Point Hend(HxEnd, HyEnd);

// horizontal axis
Line horizontalAxis(Hstart, Hend);

// vertical axis start/ end point
int VxStart = xc;
int VyStart = yc - size.height  / 2;

int VxEnd = xc;
int VyEnd = yc + size.height  / 2;

// ----//----

现在,您可以通过提供的角度theta围绕椭圆中心旋转轴(上面的点)。
有了上述内容并知道如何构建一条线,您可以在任何给定角度theta下构建两个轴。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接