使用OpenCV實(shí)現(xiàn)仿射變換—旋轉(zhuǎn)功能
在前面實(shí)現(xiàn)了平移和縮放,還有一種常用的坐標(biāo)變換,那就是旋轉(zhuǎn)。比如拍攝的照片上傳到電腦里,再打開時(shí)發(fā)現(xiàn)人的頭在下面腳在上,這樣肯定看不了,那么就需要把這個(gè)照片旋轉(zhuǎn)180度才可以接受。由于旋轉(zhuǎn)變換,都是繞著點(diǎn)進(jìn)行運(yùn)動(dòng)的,首先要找到軸的位置,默認(rèn)是原點(diǎn)(0,0),如果要指定點(diǎn)進(jìn)行,那么要采用前面的平移操作,即是把圖片移到這一點(diǎn)上,然后進(jìn)行旋轉(zhuǎn),再把它平移回來,這樣才可以完成。所以在這個(gè)操作過程里,就要多個(gè)矩陣進(jìn)行操作了,先要進(jìn)行平移矩陣相乘,再與旋轉(zhuǎn)矩陣相乘,最后與反向平移矩陣相乘。旋轉(zhuǎn)的操作都是使用角度方式來計(jì)算,因此要使用中學(xué)的知識(shí)—三角函數(shù)sin和cos等,如果對(duì)這些知識(shí)忘記了,可以回去復(fù)習(xí)一下中學(xué)知識(shí),到這里就會(huì)發(fā)現(xiàn)數(shù)學(xué)的知識(shí)是非常有用的,特別是中學(xué)的知識(shí)。一般會(huì)解出方案如下:

再加上齊次化,齊次化的目標(biāo)主要為了把平移操作統(tǒng)一到一個(gè)公式里,就可以把公式寫成這樣:

這個(gè)矩陣變換就是純旋轉(zhuǎn)的公式。一般情況下,會(huì)有平移和縮放一起操作,這樣單獨(dú)地去構(gòu)造這些矩陣就有些麻煩了,為了簡(jiǎn)單起見,OpenCV提供了一個(gè)函數(shù)cv2.getRotationMatrix2D來完成這些操作,這個(gè)函數(shù)調(diào)用參數(shù)如下:
retval = cv.getRotationMatrix2D( center, angle, scale )
center是元組表示的旋轉(zhuǎn)中心點(diǎn)。
angle是用度表示的旋轉(zhuǎn)角度。
scale是縮放系數(shù)。
其實(shí)這個(gè)函數(shù)是計(jì)算這樣的矩陣:

所以在OpenCV里基本不需要自己去單獨(dú)計(jì)算縮放和旋轉(zhuǎn)的矩陣,調(diào)用此函數(shù)最簡(jiǎn)單了。下面通過例子來演示旋轉(zhuǎn)的功能:
#python 3.7.4,opencv4.1
#蔡軍生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#圖片的路徑
imgname = "img1.jpg"
#讀取圖片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
#圖片的高度和寬度
h,w = image.shape[:2]
#構(gòu)造縮放并旋轉(zhuǎn)的2X3的矩陣,然后調(diào)用warpAffine執(zhí)行
A1 = cv2.getRotationMatrix2D((w/2.0, h/2.0), 30, 0.5)
d1 = cv2.warpAffine(image, A1, (w, h), borderValue = 125)
#顯示操作之后的圖片
cv2.imshow("d1",d1)
#顯示圖像
cv2.imshow("image", image)
#等待用戶輸入,然后刪除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結(jié)果如下:

左邊是旋轉(zhuǎn)并縮放的圖片,右邊是原圖。
上面的例子主要調(diào)用函數(shù)getRotationMatrix2D來構(gòu)造矩陣,然后調(diào)用函數(shù)warpAffine來執(zhí)行仿射變換操作。
總結(jié)
以上所述是小編給大家介紹的使用OpenCV實(shí)現(xiàn)仿射變換—旋轉(zhuǎn)功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06
Python使用scrapy抓取網(wǎng)站sitemap信息的方法
這篇文章主要介紹了Python使用scrapy抓取網(wǎng)站sitemap信息的方法,涉及Python框架scrapy的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
如何利用Python統(tǒng)計(jì)正數(shù)和負(fù)數(shù)的個(gè)數(shù)
Python檢查數(shù)據(jù)中的正/負(fù)數(shù)是一種常見的數(shù)據(jù)處理操作,可以通過編寫代碼來實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于如何利用Python統(tǒng)計(jì)正數(shù)和負(fù)數(shù)的個(gè)數(shù)的相關(guān)資料,需要的朋友可以參考下2024-05-05
Python3中使用urllib的方法詳解(header,代理,超時(shí),認(rèn)證,異常處理)
這篇文章整理了一些關(guān)于urllib使用中的一些關(guān)于header,代理,超時(shí),認(rèn)證,異常處理處理方法,對(duì)大家學(xué)習(xí)python具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。2016-09-09
python導(dǎo)入導(dǎo)出redis數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了python導(dǎo)入導(dǎo)出redis數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Python中的np.vstack()和np.hstack()詳解
這篇文章主要介紹了np.vstack()和np.hstack(),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
如何實(shí)現(xiàn)Python調(diào)用Golang代碼詳解
這篇文章主要介紹了如何實(shí)現(xiàn)Python調(diào)用Golang代碼,Python和Golang都是當(dāng)下非常流行的編程語言,在實(shí)際開發(fā)中,我們可能會(huì)遇到需要將Python和Golang進(jìn)行組合使用的場(chǎng)景,感興趣想要詳細(xì)了解可以參考下文2023-05-05

