2017-01-27 70 views
4

我需要從它的4個角落定義一個旋轉的矩形。旋轉的矩形由中心點,尺寸對(寬度,高度)和角度定義。處理cv :: RotatedRect的寬度和高度

它是如何決定哪個尺寸是高度,哪個尺寸是寬度?

寬度不是最水平邊緣的長度,是嗎?例如。如果角度大於90°,​​是否交換?

回答

1

height應該是最大的一側,width是另一個,angle是順時針方向的旋轉角度(以度爲單位)。

否則,您可以得到一個與heightwidth交換的等效矩形,旋轉90度。


您可以使用minAreaRect找到一個RotatedRect

vector<Point> pts = {pt1, pt2, pt3, pt4} 

RotatedRect box = minAreaRect(pts); 

// Be sure that largest side is the height 
if (box.size.width > box.size.height) 
{ 
    swap(box.size.width, box.size.height); 
    box.angle += 90.f; 
} 
+0

感謝您使用minAreaRect的提示,我沒有想到它... – Grumot

0

好,與三木的幫助下,用一些測試,我得到了更清晰......

看來,旋轉矩形是一個直立的矩形(寬度和高度是明確定義的,然後)...這是旋轉!

在圖像座標系中,y指向底部,角度爲順時針方向。在通常的數學座標系(y到頂部)中,角度是逆時針的。然後,它適合於包含atan2(y,x)函數的C++ <math.h>,例如(除了返回弧度)。總而言之,如果我們考慮一個給定的矩形邊(兩個角),那麼如果我們通過其y差和x差檢索角度atan2,則其長度可以被認爲是寬度。類似:

Point pt1, pt2, pt3, pt4; 
RotatedRect rect; 

rect.center = (pt1 + pt2 + pt3 + pt4)/4; 

// assuming the points are already sorted 
rect.size.width = distance(pt1, pt2); // sqrt(...) 
rect.size.height = distance(pt2, pt3); 

rect.angle = atan2(pt2.y-pt1.y, pt2.x-pt1.x); 

並且這可以與被widthdist(pt1,pt2)dist(pt3,pt4)例如平均值得到改善。對於height也是如此。

angle也可以計算爲對於(pt3,pt4)的(pt1,pt2)和atanatan的平均值。