[英]Calculate 3D rotation of a plane given 3 points and their relative position
[英]Calculate degree of rotation of an image given two corner points?
我正在嘗試編寫一個C#控制台應用程序,該應用程序將在其中包含文本的圖像並將其旋轉,以使文本盡可能接近水平,以使OCR更准確。
使用AWS Rekognition,我可以獲得帶有角點的邊界框,該邊界框提供了所需旋轉的指南,但是我沒有數學能力來確定哪種算法最合適。
例如,AWS將提供以下相對坐標:
"X": 0.6669167280197144, "Y": 0.6940382719039917
"X": 0.759939968585968, "Y": 0.681664764881134
"X": 0.7622751593589783, "Y": 0.7211361527442932
"X": 0.6692519187927246, "Y": 0.7335096001625061
到目前為止,我已經嘗試使用頂部或底部的“ Y”坐標來創建比率,然后將其乘以6或-6。
這是我嘗試過的代碼。
var rotationAngle = (int)Math.Round(coordRatio * 6 * rotationDirection);
要么
var rotationAngle = Math.Sin(Math.Cos(coordRatio * Math.PI)) * 10 * rotationDirection;
這似乎應該是相當簡單的觸發。
給定一個點的x
和y
坐標,我們可以使用Math.Atan2
方法從“向上”向量( {x:0, y:1}
)順時針以弧度為單位獲取該點的角度:
double x = 1;
double y = 1;
double radians = Math.Atan2(x, y);
radians
設置為0.7853981...
(或45度)。
我們可以使用它來找到兩點之間的角度,方法是找出兩點之間的差異並按上述方法計算角度:
Point p1 = new Point(0.6669167280197144d, 0.6940382719039917d);
Point p2 = new Point(0.759939968585968d, 0.681664764881134);
Point difference = p2 - p1;
double radians = Math.Atan2(difference.X, difference.Y);
(使用一個非常簡單的Point
類,我將它們放在一起。)
結果為1.70303529...
弧度( 97.5767...
度)。 走點列表給我們...一些奇怪的結果:
Radians Degrees
-------------------------------
p1 - p0 1.7030353 97.576734
p2 - p1 0.0590928 3.3857640
p3 - p2 -1.4385580 -82.423302
p0 - p3 -3.0824998 -176.61423
遺憾的是,看起來這畢竟不是一個簡單的問題。 我們可以算出任意兩點之間的角度,但是看起來我們在這里沒有定義一個合適的矩形。 看起來可能是平行四邊形。 我們有兩對大致平行的線,但是這兩對線不成直角。 內角約為94.2度和85.8度。
為了修復此圖像,您可能需要先旋轉圖像,以使最長的邊( [p0,p1]
和[p3,p0]
)是水平的。 這將是( 90 - 97.576734 = -7.576734
度,或1.5707963 - 1.7030353 = -0.1322383
弧度)的1.5707963 - 1.7030353 = -0.1322383
,最好是圍繞點的中心旋轉( {X: 0.7145959, Y: 0.7075872}
)。 然后,您可以計算出偏斜值並將平行四邊形固定回矩形。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.