使用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)動的,首先要找到軸的位置,默認(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ù)sin和cos等,如果對這些知識忘記了,可以回去復(fù)習(xí)一下中學(xué)知識,到這里就會發(fā)現(xiàn)數(shù)學(xué)的知識是非常有用的,特別是中學(xué)的知識。一般會解出方案如下:
再加上齊次化,齊次化的目標(biāo)主要為了把平移操作統(tǒng)一到一個(gè)公式里,就可以把公式寫成這樣:
這個(gè)矩陣變換就是純旋轉(zhuǎn)的公式。一般情況下,會有平移和縮放一起操作,這樣單獨(dú)地去構(gòu)造這些矩陣就有些麻煩了,為了簡單起見,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ù)最簡單了。下面通過例子來演示旋轉(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)功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06Python使用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-05Python3中使用urllib的方法詳解(header,代理,超時(shí),認(rèn)證,異常處理)
這篇文章整理了一些關(guān)于urllib使用中的一些關(guān)于header,代理,超時(shí),認(rèn)證,異常處理處理方法,對大家學(xué)習(xí)python具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。2016-09-09python導(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-02Python中的np.vstack()和np.hstack()詳解
這篇文章主要介紹了np.vstack()和np.hstack(),本文給大家介紹的非常詳細(xì),對大家的學(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ā)中,我們可能會遇到需要將Python和Golang進(jìn)行組合使用的場景,感興趣想要詳細(xì)了解可以參考下文2023-05-05