opencv實現座標旋轉(教你框住小姐姐)

2021-09-20 01:50:03 字數 3395 閱讀 8352

url上

post

上去,之後接收檢測結果就好了。

left - 人臉區域離左邊界的距離

top -

人臉區域離上邊界的距離

width -

人臉區域的寬度

height -

人臉區域的高度

ratation

人臉框相對於豎直方向的順時針旋轉角

[-180, 180].

如果我想把人臉框出來,很容易想到的是以(left, top)為左上頂點,以

width

為寬,height

為高,畫乙個矩形就好了。但其實這樣是不合理的,如果人頭是倒著的,這樣畫出來是不合理的。就像下面這樣:

所以必須考慮把旋轉角加上去。於是我想的策略是先把框畫出來,再逆時針旋轉ratation 就可以了。

大致策略就是:先算出四個點的左標,再以左上角的點為原點,逆時針旋轉ratation 就

ok了。四個點的左標比較容易確定,利用起點左標加寬高就能算出來。

這裡主要講解如何算旋轉後的左標,如下圖:

已知x1,x2,

y1,y2和∠a,求

x』,和y』。這時候就需要用到高中的三角函式的知識了。

假設,(x1, y1) 到

(x2, y2)

的長度為

r,再畫乙個∠b。

x』 = x1 + r * cos(a + b);

x』 = x1 + r * cos(a) * cos(b) - r * sin(a) * sin(b);

又因為:

r * cos(b) = x2 - x1;

r * sin(b) = (y2 - y1);

最終可以求出:

x』 = x1 + cos(a) * (x2 - x1) - sin(a) * (y2 - y1);

同理求出:

y』 = y1 + sin(a) * (x2 - x1) - cos(a) * (y2 - y1);

啊,這真是用了我畢生所學的數學知識,真沒想到工作後還會用到三角函式的知識。還是要多學點數學知識才好啊。

下面就是真正畫圖的東西了,為了測試這個公式是否可行,我用opencv畫了乙個四根線(其實就是乙個方形),然後以左上角為頂點旋轉。

下面的具體的**,比較簡單,主要是那個公式,所以也沒什麼注釋。需要包含opencv標頭檔案,以及鏈結

opencv

的庫。

/*

* @author:xcywt

* @date:2018-08-10

* @contact me:

*/#include

#include

"opencv2/highgui/highgui.hpp

"using

namespace

cv;#define pi 3.14159265

#define rotate_count 180

introtatetest2()

int x1 = 200, y1 = 200

;

int x2 = 300, y2 = 200

;

int x3 = 300, y3 = 300

;

int x4 = 200, y4 = 300

;

intarrx1[rotate_count], arry1[rotate_count];

intarrx2[rotate_count], arry2[rotate_count];

intarrx3[rotate_count], arry3[rotate_count];

intarrx4[rotate_count], arry4[rotate_count];

int nagree = 0

;

for (int i = 0; i < rotate_count; i++)

mat im(

800, 480

, cv_8uc3);

line(im, point(x1, y1), point(x2, y2), scalar(

89, 90, 90), 3

); line(im, point(x1, y1), point(x4, y4), scalar(

89, 90, 90), 3

); line(im, point(x3, y3), point(x2, y2), scalar(

89, 90, 90), 3

); line(im, point(x4, y4), point(x3, y3), scalar(

89, 90, 90), 3

);

for (int i = 1; i < rotate_count; i++)

imshow(

"is ok

", im);

cvwaitkey(0);

return0;

}int

rotatetest()

intmain()

其中rotatetest2()實現了在乙個

mat上,畫出了旋轉各個角度的樣子,具體把

360分成rotate_count這麼多份。可以看到效果還是很好看的。

rotate_count為

10時:

rotate_count為

60時:

rotate_count為

180時:

rotate_count為

360時:

旋轉之後的神仙姐姐就框的比較準確了。這樣就能正確的框住小姐姐了。

數學還是很有用的。人工智慧、深度學習還是需要具備數學知識的。

opencv實現旋轉 傾斜

include cv.h include highgui.h int main if y max y max y y min flag 1 for int x 0 ximagedata imgdst2 widthstep y x 3 if old ptr 0 0 old ptr 1 0 old pt...

旋轉框四點座標轉成roLabelImg的角度格式

甲方發過來的標籤是四點座標格式的,我們需要用rolabelimg檢查一遍和標籤,這就需要轉成角度格式,rolabelimg跟別的表示方法不一樣,是逆時針為正的,範圍是0 指令碼裡用到了opencv的最小外接矩形函式cv2.minarearect,以及根據長短邊來判斷角度在哪個象限。具體 和詳細注釋如...

python實現三維座標旋轉計算

計算空間三維座標系變換一般都是利用旋轉矩陣或者尤拉公式。python有個scipy庫可以直接用於計算空間三維座標變換。pip install scipyaxis是旋轉軸,radian旋轉角度 弧度 rot matrix linalg.expm np.cross np.eye 3 axis linal...