圖1.兩種形式的旋轉矩陣
你可能知道,這就是順時針旋轉跟逆時針旋轉(或旋轉矩陣及逆矩陣)的差別而已阿!
但是...是 誰的 順時針旋轉跟逆時針旋轉呢?
如果你只是想寫作業的話,稍微調換一下,看哪個成果正確就好。
如果你跟我一樣想知道 為什麼 的話,且聽我娓娓道來...
以下說明
1.旋轉矩陣:先講結論,然後簡單證明兩者
2.OpenCV實作:實作的時候要用哪個公式計算
3.三維座標旋轉:y軸 就你最特別 為什麼跟別人不一樣
先講結論,如圖
以下簡單證明,我主要用逆時針轉的角度來寫
(因為我不會背公式,記得證明有助於聯想,但是這邊就不詳細說明摟)
聰明的你可以直接跳過 :)
圖3.旋轉矩陣證明
進入到opencv實作環節
在OpenCV的網站(來源見[註1])上可以看到這種範例
圖4.OpenCV的網站的寫法
excuse me...兩個不一樣耶?!
第一行是影像逆時針旋轉沒錯
阿第二行是cv2.getRotationMatrix2D()的計算方式(同註2)
sin跟-sin相反捏,不解釋嗎?
其實原因也很簡單
opencv讀入影像時,影像座標如左圖
圖5.OpenCV的座標軸
是不是和我們一般看到的y軸相反了呢!
這個時候如果要實作旋轉矩陣(自己寫matrix,不使用getRotationMatrix2D())做逆時針旋轉
那計算方式會跟前面影像旋轉方向相反喔!
因此必須用剛剛 圖2.左邊 影像順時鐘轉公式唷!
備註:
使用內建的cv2.getRotationMatrix2D()
除了做影像逆時針旋轉之外,還包含縮放及中心點平移到(0,0)位置,這個就可以放心直接用拉!
前面提到的都是二維(x-y)座標旋轉
三維座標旋轉則變成3X3的旋轉矩陣(這邊一律用座標軸逆時針旋轉的公式)
圖6.三維座標旋轉
學到這部分的時候應該會提到
座標軸的旋轉定義是以"該軸正向面對自己時,逆時針方向的旋轉"
所以二維(x-y)座標旋轉,相當於z軸朝向自己、逆時針方向旋轉,計算方式如圖6左側
那為什麼對y軸旋轉時sin跟-sin的位置跟其他相反呢?
簡單想,可以說是要旋轉y軸,所以把選轉矩陣的四個元素放在右下角
因為會超過3X3矩陣,所以右邊超過的部分移到左邊、下面移到上面
圖7.y軸旋轉矩陣
或者是用[y,z,x]這個順序的座標來解釋
都沒錯!
但是這邊我想提醒的一點
就是三維座標系或笛卡兒座標系,三軸方向是維持右手定則
右手定則由右手的 1.食指 -> 2.中指 -> 3.拇指 定義三個軸的方向(->一定是在逆時針方向)
對應座標軸 1.x軸 -> 2.y軸 -> 3.z軸 (或 y-z-x 或 z-x-y)
所以圖6右圖,y軸朝上時,平面一定是z軸 -> x軸、而不是x軸 -> z軸
旋轉矩陣一定要依z軸 -> x軸的順序套用
以上分享希望有幫助到大家
跟我一樣被困擾好幾年一直記不住,歡迎+1
也歡迎討論喔!
參考文件:
註1.OpenCV2 旋轉矩陣範例
https://docs.opencv.org/4.x/dd/d52/tutorial_js_geometric_transformations.html
註2.cv2.getRotationMatrix2D()說明
https://docs.opencv.org/4.x/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326