2015-10-30 254 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