2015-10-30 189 views
2

我使用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

您是否问过如何绘制一个线段给定其终点,长度和倾斜角? –

+0

我想绘制椭圆的点中心,半径长度和角度的椭圆的旋转轴,因为图像中的椭圆是旋转的,所以我想在椭圆内绘制新的轴。 – user3704922

+1

看起来你需要几何帮助而不是编程。 –

回答

2

您可以使用minEllipse[element].points来获取旋转的边界矩形的四个角,如here所述。

然后你只需要计算在矩形的每一侧的两个点的平均值,以获得轴终点......

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)); 
+0

这是另一种方法,而不是使用一点点数学。尼斯。你能提供一个代码片段吗? – Miki

+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; 

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

,可以通过所提供的角度thetarotate轴线(以上为分),围绕椭圆的中心。

有了上述内容并知道如何构建一条线,您可以在任何给定角度建立两个轴theta