0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV中圖像旋轉(zhuǎn)函數(shù)操作原理及基本技巧

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 2023-11-14 09:40 ? 次閱讀

01

引言

初學(xué)圖像處理,很多人遇到的第一關(guān)就是圖像旋轉(zhuǎn),圖像旋轉(zhuǎn)是圖像幾何變換中最具代表性的操作,包含了插值、背景處理、三角函數(shù)等相關(guān)知識,一個變換矩陣跟計算圖像旋轉(zhuǎn)之后的大小公式就讓很多開發(fā)者最后直接調(diào)用函數(shù)了事,但是其實(shí)這個東西并沒有這么難懂,可以說主要是之前別人寫的公式太嚇人,小編很久以前第一次接觸的也是被嚇暈了!所以決定從程序員可以接受的角度從新介紹一下圖像旋轉(zhuǎn)基本原理與OpenCV中圖像旋轉(zhuǎn)函數(shù)操作的基本技巧。

圖像旋轉(zhuǎn)基本原理

旋轉(zhuǎn)涉及到兩個問題,一個是圖像旋轉(zhuǎn)之后的大小會發(fā)生改變,會產(chǎn)生背景,通過背景填充方式都是填充黑色,此外旋轉(zhuǎn)還是產(chǎn)生像素的位置遷移,新的位置像素需要通過插值計算獲得,常見的插值方式有最近鄰、線性插值、立方插值等。

首先看旋轉(zhuǎn)之后的圖像寬高變化,如下圖所示:

c04e2600-828a-11ee-939d-92fbcf53809c.png

c05ca4f0-828a-11ee-939d-92fbcf53809c.png

這個是正常的平面坐標(biāo)系中的旋轉(zhuǎn)矩陣,可以簡寫為:

c06ca1a2-828a-11ee-939d-92fbcf53809c.png

是一個2x3的矩陣,但是在圖像中左上角是原點(diǎn),要實(shí)現(xiàn)圍繞圖像的中心位置旋轉(zhuǎn),M就要重新計算,所以O(shè)penCV中的圖像旋轉(zhuǎn)矩陣為:

c079f762-828a-11ee-939d-92fbcf53809c.png

其中scale是表示矩陣支持旋轉(zhuǎn)+放縮,這里可以把Scale=1。第三列是圖像旋轉(zhuǎn)之后中心位置平移量。

函數(shù)支持

OpenCV中支持圖像旋轉(zhuǎn)的函數(shù)有兩個,一個是直接支持旋轉(zhuǎn)的函數(shù),但是它支持的是90,180,270這樣的特殊角度旋轉(zhuǎn)。

void cv::rotate   (
    InputArray    src,
    OutputArray dst,
    int rotateCode
)

其中rotateCode參數(shù)必須為:

ROTATE_180,
ROTATE_90_CLOCKWISE
ROTATE_90_COUNTERCLOCKWISE

函數(shù)warpAffine支持任意角度的旋轉(zhuǎn),通過定義M矩陣實(shí)現(xiàn)

void cv::warpAffine(
         InputArray      src, // 輸入圖像
         OutputArray dst, // 輸出圖像
         InputArray      M, // 旋轉(zhuǎn)矩陣
         Size         dsize, // 輸出圖像大小
         int   flags = INTER_LINEAR, // 像素插值方式
         int   borderMode = BORDER_CONSTANT, // 背景填充默認(rèn)為常量
         const Scalar &        borderValue = Scalar() // 填充顏色默認(rèn)為黑色
)

但是M如何生成與獲取,OpenCV中提供了一個函數(shù)根據(jù)輸入的參數(shù)自動生成旋轉(zhuǎn)矩陣M,該函數(shù)為

Mat cv::getRotationMatrix2D(
         Point2f   center,
         double    angle,
         double    scale
)

代碼演示

使用自定義的M矩陣實(shí)現(xiàn)圖像旋轉(zhuǎn)


h,w,c=src.shape
#定義矩陣
M=np.zeros((2,3),dtype=np.float32)
#定義角度
alpha=np.cos(np.pi/4.0)
beta=np.sin(np.pi/4.0)
print("alpha:",alpha)
#初始化矩陣
M[0,0]=alpha
M[1,1]=alpha
M[0,1]=beta
M[1,0]=-beta
cx=w/2
cy=h/2
tx=(1-alpha)*cx-beta*cy
ty=beta*cx+(1-alpha)*cy
M[0,2]=tx
M[1,2]=ty
#執(zhí)行旋轉(zhuǎn)
dst=cv.warpAffine(src,M,(w,h))
cv.imshow("rotate-center-demo",dst)

重新計算旋轉(zhuǎn)之后的圖像大小,實(shí)現(xiàn)無Crop版本的圖像旋轉(zhuǎn)

h,w,c=src.shape
M=np.zeros((2,3),dtype=np.float32)
alpha=np.cos(np.pi/4.0)
beta=np.sin(np.pi/4.0)
print("alpha:",alpha)

#初始旋轉(zhuǎn)矩陣
M[0,0]=alpha
M[1,1]=alpha
M[0,1]=beta
M[1,0]=-beta
cx=w/2
cy=h/2
tx=(1-alpha)*cx-beta*cy
ty=beta*cx+(1-alpha)*cy
M[0,2]=tx
M[1,2]=ty

#changewithfullsize
bound_w=int(h*np.abs(beta)+w*np.abs(alpha))
bound_h=int(h*np.abs(alpha)+w*np.abs(beta))

#添加中心位置遷移
M[0,2]+=bound_w/2-cx
M[1,2]+=bound_h/2-cy
dst=cv.warpAffine(src,M,(bound_w,bound_h))
cv.imshow("rotatewithoutcropping",dst)

背景隨便變化+無Crop版本的圖像旋轉(zhuǎn)動態(tài)演示

degree=1.0
d1=np.pi/180.0
whileTrue:
alpha=np.cos(d1*degree)
beta=np.sin(d1*degree)
M[0,0]=alpha
M[1,1]=alpha
M[0,1]=beta
M[1,0]=-beta
cx=w/2
cy=h/2
tx=(1-alpha)*cx-beta*cy
ty=beta*cx+(1-alpha)*cy
M[0,2]=tx
M[1,2]=ty

#changewithfullsize
bound_w=int(h*np.abs(beta)+w*np.abs(alpha))
bound_h=int(h*np.abs(alpha)+w*np.abs(beta))
M[0,2]+=bound_w/2-cx
M[1,2]+=bound_h/2-cy
red=np.random.randint(0,255)
green=np.random.randint(0,255)
blue=np.random.randint(0,255)
dst=cv.warpAffine(src,M,(bound_w,bound_h),borderMode=cv.BORDER_CONSTANT,borderValue=(blue,green,red))
cv.imshow("rotate+background",dst)
c=cv.waitKey(1000)
ifc==27:
break
degree+=1
print("degree",degree)
ifdegree>360:
degree=degree%360

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62622
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41352

原文標(biāo)題:經(jīng)驗(yàn) | OpenCV圖像旋轉(zhuǎn)的原理與技巧

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【Rayeager PX2分享】OpenCV入門之圖像顯示

    $@ -c $
    發(fā)表于 04-14 15:49

    Vivado HLS實(shí)現(xiàn)OpenCV圖像處理的設(shè)計流程與分析

    本文通過對OpenCV圖像類型和函數(shù)處理方法的介紹,通過設(shè)計實(shí)例描述在vivadoHLS調(diào)用Open
    發(fā)表于 07-08 08:30

    如何使用PythonOpenCV模塊檢測顏色

    numpy然后,導(dǎo)入模塊。讀取圖像并使用 OpenCV 模塊的 cvtColor() 函數(shù)將BGR圖像轉(zhuǎn)換為 HSV (色調(diào)、飽和度、值
    發(fā)表于 02-09 16:31

    OpenCV圖像處理編程研究

    OpenCV是一種用于數(shù)字圖像處理和計算機(jī)視覺的函數(shù)庫,由Intel微處理器研究實(shí)驗(yàn)室的視覺交互組開發(fā),采用的開發(fā)語言是C++。本文通過學(xué)習(xí)掌握在OpenCV下進(jìn)行數(shù)字
    發(fā)表于 06-25 17:52 ?0次下載

    基于OpenCV圖像特征智能識別系統(tǒng)設(shè)計

    ,通過OpenCV的相關(guān)函數(shù)進(jìn)行特征圖像的識別。針對食品藥品加工過程的特定問題進(jìn)行模擬,實(shí)驗(yàn)表明,該系統(tǒng)具有較好的識別速度和識別效率,具有一定的實(shí)用性。
    發(fā)表于 12-31 09:20 ?20次下載

    opencv如何實(shí)現(xiàn)圖像旋轉(zhuǎn)_原理是什么

    旋轉(zhuǎn)一般是指將圖像圍繞某一指定點(diǎn)旋轉(zhuǎn)一定的角度,圖像旋轉(zhuǎn)后會有一部分圖像轉(zhuǎn)出顯示區(qū)域,可以截圖那
    發(fā)表于 12-04 16:40 ?2.8w次閱讀
    <b class='flag-5'>opencv</b>如何實(shí)現(xiàn)<b class='flag-5'>圖像</b><b class='flag-5'>旋轉(zhuǎn)</b>_原理是什么

    OpenCV函數(shù)圖像處理目錄說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是OpenCV函數(shù)圖像處理目錄說明。
    發(fā)表于 10-29 15:55 ?12次下載
    <b class='flag-5'>OpenCV</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>圖像</b>處理目錄說明

    如何使用OpenCV訪問Mat圖像每個像素的值

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用OpenCV訪問Mat圖像每個像素的值
    發(fā)表于 11-26 16:13 ?4次下載

    OpenCV的基本操作

    今天這一篇文章主要記錄一下OpenCV中一些基本的操作,包括讀取圖片,視頻以及反轉(zhuǎn)圖像的幾種操作: 一:圖片的載入 圖片載入很常用,很實(shí)用。。。 二:讀取視頻 讀取視頻分為從攝像頭中讀
    的頭像 發(fā)表于 11-02 15:04 ?1934次閱讀
    <b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>

    OpenCV色彩空間的轉(zhuǎn)換函數(shù)

    在這一篇文章,我們將會學(xué)習(xí)使用一下OpenCV色彩空間的轉(zhuǎn)換函數(shù),我們這里說的色彩空間是說的使用多種顏色(通常指三種以上),來表示顏色的方法,像是我們平時所說的RGB,HSV,YU
    的頭像 發(fā)表于 11-02 15:23 ?2619次閱讀

    OpenCV圖像的計算

    今天我們一起學(xué)習(xí)的是OpenCV圖像的計算,在圖像計算,分為像素級運(yùn)算和代數(shù)運(yùn)算這兩大類,今天我們借助
    的頭像 發(fā)表于 11-03 17:45 ?2140次閱讀

    OpenCV實(shí)現(xiàn)了圖像形態(tài)學(xué)什么常見操作

    圖像形態(tài)學(xué)是圖像處理的分支學(xué)科,在二值圖像處理占有重要地位、OpenCV實(shí)現(xiàn)了
    的頭像 發(fā)表于 05-27 14:11 ?1461次閱讀
    <b class='flag-5'>OpenCV</b><b class='flag-5'>中</b>實(shí)現(xiàn)了<b class='flag-5'>圖像</b>形態(tài)學(xué)什么常見<b class='flag-5'>操作</b>?

    如何使用OpenCV和Python從圖像中提取感興趣區(qū)域

    今天我們將一起探究如何使用OpenCV和Python從圖像中提取感興趣區(qū)域(ROI)。 在之間的文章,我們完成了圖像邊緣提取,例如從臺球桌中提取桌邊。使用了簡單的
    的頭像 發(fā)表于 02-07 14:42 ?1847次閱讀

    OpenCV庫在圖像處理和深度學(xué)習(xí)的應(yīng)用

    本文深入淺出地探討了OpenCV庫在圖像處理和深度學(xué)習(xí)的應(yīng)用。從基本概念和操作,到復(fù)雜的圖像變換和深度學(xué)習(xí)模型的使用,文章以詳盡的代碼和解
    的頭像 發(fā)表于 08-18 11:33 ?893次閱讀

    OpenCV圖像識別C++代碼

    的頭文件 在您的C++代碼,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?2010次閱讀