我需要從它的4個角落定義一個旋轉的矩形。旋轉的矩形由中心點,尺寸對(寬度,高度)和角度定義。處理cv :: RotatedRect的寬度和高度
它是如何決定哪個尺寸是高度,哪個尺寸是寬度?
寬度不是最水平邊緣的長度,是嗎?例如。如果角度大於90°,是否交換?
我需要從它的4個角落定義一個旋轉的矩形。旋轉的矩形由中心點,尺寸對(寬度,高度)和角度定義。處理cv :: RotatedRect的寬度和高度
它是如何決定哪個尺寸是高度,哪個尺寸是寬度?
寬度不是最水平邊緣的長度,是嗎?例如。如果角度大於90°,是否交換?
height
應該是最大的一側,width
是另一個,angle
是順時針方向的旋轉角度(以度爲單位)。
否則,您可以得到一個與height
和width
交換的等效矩形,旋轉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;
}
好,與三木的幫助下,用一些測試,我得到了更清晰......
看來,旋轉矩形是一個直立的矩形(寬度和高度是明確定義的,然後)...這是旋轉!
在圖像座標系中,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);
並且這可以與被width
的dist(pt1,pt2)
和dist(pt3,pt4)
例如平均值得到改善。對於height
也是如此。
angle
也可以計算爲對於(pt3,pt4)的(pt1,pt2)和atan
的atan
的平均值。
感謝您使用minAreaRect的提示,我沒有想到它... – Grumot