簡體   English   中英

在給定兩個角點的情況下計算圖像的旋轉度?

[英]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;

這似乎應該是相當簡單的觸發。

給定一個點的xy坐標,我們可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM