




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
計算機視覺技術及應用圖像拼接項目七
01 圖像金字塔02 特征檢測與匹配03 項目實施——風景圖像全景拼接04 項目實訓目錄項目目標知識目標了解高斯金字塔和拉普拉斯金字塔的概念及構建方法。掌握常用的特征檢測算法及其優(yōu)缺點。掌握常用的特征匹配算法及其優(yōu)缺點。了解圖像透視變換的原理。技能目標能夠使用OpenCV構建高斯金字塔和拉普拉斯金字塔。能夠使用OpenCV進行圖像的特征檢測。能夠使用OpenCV進行圖像的特征匹配。能夠使用OpenCV進行圖像的透視變換。素養(yǎng)目標培養(yǎng)團隊協(xié)作的意識和一專多能的職業(yè)素養(yǎng)。養(yǎng)成腳踏實地、好學上進、拼搏創(chuàng)新、科學嚴謹?shù)墓ぷ髯黠L。圖像拼接是指將拍攝到的具有重疊區(qū)域的若干幅圖像(可能是不同時間、不同視角或者不同傳感器獲得的)拼接成一幅無縫全景圖。小旌了解到,要實現(xiàn)圖像拼接,首先需要進行圖像特征點的檢測和匹配,然后進行透視變換得到無縫全景圖,他決定嘗試一下。小旌打算對拍攝的兩幅不同角度的風景圖像進行圖像拼接。首先,他使用SIFT特征檢測算法找到每幅圖像中的特征點,然后使用KNN算法進行特征匹配,以便快速地在兩幅圖像之間建立對應關系,最后,利用透視變換矩陣進行透視變換,完成圖像拼接。項目描述項目準備全班學生以
3~5
人為一組進行分組,各組選出組長。組長組織組員掃碼觀看“圖像特征檢測與匹配的應用”視頻,討論并回答下列問題。問題1:什么是圖像特征檢測與匹配。問題2:簡述圖像特征檢測與匹配的應用領域。01圖像金字塔圖像金字塔圖像金字塔是由一幅圖像的多個不同分辨率的圖像所構成的圖像集合。該組圖像是由單個圖像通過不斷采樣產(chǎn)生的。在圖像金字塔中,通常將分辨率最高的圖像放在底部,分辨率最低的圖像放在頂部,將一層層的圖像堆積在一起比喻成金字塔。圖像金字塔圖像金字塔>1.高斯金字塔直方圖高斯金字塔是通過不斷地進行高斯濾波和下采樣操作構建的金字塔。金字塔的層級越高,圖像越小。為了獲得第i+1層的金字塔圖像,首先需要對第i層圖像進行高斯濾波,得到圖像的近似圖像,然后刪除所有的偶數(shù)行和列,重復以上過程,即可構成高斯金字塔。高斯金字塔圖像金字塔>1.高斯金字塔什么是下采樣和上采樣呢?下采樣是由高分辨率的圖像(大尺寸)產(chǎn)生低分辨率的近似圖像(小尺寸)。上采樣則相反,是由低分辨率的圖像(小尺寸)產(chǎn)生高分辨率的近似圖像(大尺寸)。格式:dst=cv2.pyrDown(src[,dstsize[,borderType]])cv2.pyrDown()函數(shù)
圖像金字塔>1.高斯金字塔dst
表示輸出圖像;src
表示原始圖像;dstsize
表示輸出圖像大小,為可選參數(shù),默認情況下,輸出圖像的行和列會變?yōu)樵紙D像行和列的
1/2,輸出圖像會變成原圖像的
1/4;borderType表示邊界樣式,即以何種方式處理邊界,為可選參數(shù),默認為cv2.BORDER_DEFAULT。OpenCV
提供的cv2.pyrDown()函數(shù)用于實現(xiàn)高斯金字塔中的下采樣操作。格式:dst=cv2.pyrUp(src[,dstsize[,borderType]])cv2.pyrDown()函數(shù)
圖像金字塔>1.高斯金字塔dst
表示輸出圖像;src
表示原始圖像;dstsize
表示輸出圖像大小,為可選參數(shù),默認情況下,輸出圖像的行和列會變?yōu)樵紙D像行和列的
2倍,輸出圖像會變成原圖像的
4
倍;borderType表示邊界樣式,即以何種方式處理邊界,為可選參數(shù),默認為cv2.BORDER_DEFAULT。OpenCV
提供的cv2.pyrUp()函數(shù)用于實現(xiàn)高斯金字塔中的上采樣操作?!纠?-1】
編寫程序,使用
OpenCV
將圖像“build.png”(見本書配套素材“例題圖像/build.png”)先進行3次下采樣操作,再進行3次上采樣操作,然后顯示原圖像和采樣后的圖像。【參考代碼】importcv2 #導入OpenCV庫img=cv2.imread("build.png")
#讀取原圖像cv2.imshow('org_image',img)
#顯示原圖像img1=img.copy()foriinrange(3):
#循環(huán),進行3次下采樣 img1=cv2.pyrDown(img1)
#下采樣 cv2.imshow('pyrDown_image'+str(i),img1)
#顯示采樣后的圖像img2=img1.copy()
#基于下采樣結(jié)果圖像進行上采樣foriinrange(3):
#循環(huán),進行3次上采樣 img2=cv2.pyrUp(img2)
#上采樣 cv2.imshow('pyrUp_image'+str(i),img2) #顯示采樣后的圖像cv2.waitKey()
#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()
#釋放所有窗口圖像金字塔>1.高斯金字塔【運行結(jié)果】程序運行結(jié)果如下圖所示。從結(jié)果中可以看出,上采樣并不是下采樣的逆運算,下采樣的圖像經(jīng)過上采樣后,不能恢復圖像的清晰度。圖像金字塔>1.高斯金字塔(a)原圖像
(b)第1次下采樣
(c)第2次下采樣
(d)第3次下采樣(e)第1次上采樣(f)第2次上采樣(g)第3次上采樣圖像金字塔>2.拉普拉斯金字塔直方圖拉普拉斯金字塔拉普拉斯金字塔的第i層圖像是用高斯金字塔的第i層圖像減去第i+1層圖像的上采樣圖像,得到的差值圖像,其公式如下。其中,
和
分別表示高斯金字塔的第i層和第i+1層圖像;pyrUp()表示上采樣函數(shù);
表示拉普拉斯金字塔的第i層圖像?!纠?-2】編寫程序,使用OpenCV為圖像“build.png”(見本書配套素材“例題圖像/build.png”)構建兩層拉普拉斯金字塔,然后使用拉普拉斯圖像恢復原圖像,并顯示原圖像、拉普拉斯圖像和恢復的圖像?!緟⒖即a】importcv2 #導入OpenCV庫image=cv2.imread("build.png") #讀取原圖像cv2.imshow('Input',image)
#顯示原圖像G1=cv2.pyrDown(image)
#第1次下采樣G2=cv2.pyrDown(G1)
#第2次下采樣L0=cv2.subtract(image,cv2.pyrUp(G1))
#構建拉普拉斯金字塔L1=cv2.subtract(G1,cv2.pyrUp(G2))cv2.imshow('Lap_image0',L0) #顯示第0層拉普拉斯圖像cv2.imshow('Lap_image1',L1) #顯示第1層拉普拉斯圖像G00=L0+cv2.pyrUp(G1) #恢復原圖像cv2.imshow('Restore',G00) #顯示恢復的圖像cv2.waitKey() #窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows() #釋放所有窗口圖像金字塔>2.拉普拉斯金字塔【運行結(jié)果】程序運行結(jié)果如下圖所示。圖像金字塔>2.拉普拉斯金字塔(a)原圖像
(b)第0層拉普拉斯金字塔圖像
(c)第1層拉普拉斯金字塔圖像
(d)使用拉普拉斯金字塔恢復的圖像02特征檢測與匹配圖像特征是指圖像中具有獨特性和易于識別性的區(qū)域或?qū)傩?。例如,角點、斑點及高密度區(qū)域均屬于較好的特征,而低密度區(qū)域(如圖像中的藍色天空)則不屬于好的特征。圖像特征檢測與匹配是計算機視覺中重要的研究方向,它在目標識別與定位、圖像拼接、運動跟蹤、圖像檢索等領域有著廣泛的應用。特征檢測與匹配特征檢測與匹配>特征檢測>1.SIFT算法直方圖尺度不變特征轉(zhuǎn)換(scale-invariantfeaturetransform,SIFT)算法用于檢測和描述圖像中的局部性特征。SIFT算法對圖像的大小和旋轉(zhuǎn)不敏感,對光照和噪聲等影響的抗擊能力也很強,因此,其具有廣泛的應用。在OpenCV中,使用SIFT算法檢測、計算并繪制輸入圖像中特征點的一般操作步驟如下。(1)讀取輸入圖像,并使用cv2.cvtColor()函數(shù)將輸入圖像轉(zhuǎn)換為灰度圖像。(2)調(diào)用cv2.SIFT_create()方法創(chuàng)建SIFT對象。格式:sift=cv2.SIFT_create([,nfeatures=0[,nOctaveLayers=3[,contrastThreshold=0.04[,
edgeThreshold=10[,sigma=1.6]]]]])cv2.SIFT_create()函數(shù)
特征檢測與匹配>特征檢測>1.SIFT算法sift表示創(chuàng)建的SIFT對象;nfeatures表示特征點數(shù)量,即算法對檢測出的特征點進行排名,返回最好的特征點數(shù)量,為可選參數(shù),默認為0;nOctaveLayers表示高斯差分金字塔中每組的層數(shù),為可選參數(shù),默認為
3;contrastThreshold表示過濾掉較差特征點的閾值,其值越大,返回的特征點越少,為可選參數(shù),默認為
0.04;edgeThreshold表示過濾掉邊緣特征的閾值,其值越大,過濾掉的特征點越少,保留的特征點越多,為可選參數(shù),默認為10;sigma表示高斯差分金字塔第0層圖像高斯濾波系數(shù),為可選參數(shù),默認為1.6。特征檢測與匹配>特征檢測>1.SIFT算法直方圖(3)調(diào)用detect()方法檢測圖像中的特征點,在灰度圖像中檢測并返回特征點kp。detect()方法的格式如下(假設已經(jīng)創(chuàng)建了SIFT的對象sift)。格式:kp=sift.detect(image[,mask=None])detect()方法
kp表示檢測到的特征點;image表示待檢測圖像,通常為灰度圖像;mask表示掩模圖像,為可選參數(shù),默認為None,即不使用掩模圖像。特征檢測與匹配>特征檢測>1.SIFT算法直方圖(4)調(diào)用cv2.drawKeypoints()函數(shù)在圖像上繪制檢測到的特征點kp。cv2.drawKeypoints()函數(shù)的格式如下。格式:cv2.drawKeypoints(image,keypoints[,outImage[,color[,flags]]])cv2.drawKeypoints()方法
image
表示輸入圖像;keypoints
表示特征點信息的列表,通常為特征檢測算法(如SIFT算法、ORB算法等)檢測得到;outImage表示繪制特征點后的畫布圖像,為可選參數(shù),默認情況下,函數(shù)會直接在輸入圖像上繪制特征點;color
表示繪制特征點的顏色,為可選參數(shù),默認情況下,特征點以隨機顏色繪制;flags
表示繪制特征點的模式,為可選參數(shù)。特征檢測與匹配>特征檢測>1.SIFT算法直方圖(5)調(diào)用compute()方法,計算特征點對應的SIFT特征向量。compute()方法的格式如下(假設已經(jīng)創(chuàng)建了SIFT的對象sift)。格式:kp,des=pute(image,keypoints)compute()方法
kp表示檢測到的特征點;des表示計算出的特征向量;image
表示待檢測圖像,通常為灰度圖像;keypoints
表示特征點信息的列表,通常為特征檢測算法(如SIFT算法、ORB算法等)檢測得到?!纠?/p>
7-3】編寫程序,使用SIFT算法檢測、計算并繪制圖像“build.png”(見本書配套素材“例題圖像/build.png”)的特征點。特征檢測與匹配>特征檢測>1.SIFT算法【參考代碼】importcv2 #導入OpenCV庫importnumpyasnp #導入NumPy庫img=cv2.imread("build.png") #讀取原圖像cv2.imshow('Input',img)
#顯示原圖像gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)sift=cv2.SIFT_create() #創(chuàng)建SIFT對象kp=sift.detect(gray) #檢測特征點img=cv2.drawKeypoints(gray,kp,img)
#繪制特征點cv2.imshow('drawKeypoints',img)
#顯示繪制特征點的圖像kp,des=pute(gray,kp) #計算特征點的特征向量print("kp.shape:",np.shape(kp))
#顯示特征點數(shù)量print("des.shape:",np.shape(des))
#顯示特征向量形狀cv2.waitKey()
#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()
#釋放所有窗口【運行結(jié)果】程序運行結(jié)果如下圖所示。從結(jié)果中可以看出,在圖像中檢測到3
788個SIFT特征點,每個特征的維度為128。特征檢測與匹配>特征檢測>1.SIFT算法(a)原圖像
(b)繪制特征點后的圖像
(c)圖像SIFT特征向量的形狀特征檢測與匹配>特征檢測>2.ORB算法ORB(orientedFASTandrotatedBRIEF)算法是一種對圖像中特征點進行檢測并計算特征向量的算法。該算法繼承了FAST算法和BRIEF算法的優(yōu)點,即計算效率高、占用空間小、適用于實時場景等。FAST算法和BRIEF算法是什么呢?FAST算法是一種角點檢測算法,它通過比較像素點的亮度來檢測圖像中的角點。BRIEF算法是一種二進制特征向量創(chuàng)建算法,它通過比較圖像中的像素對來生成二元特征向量。特征檢測與匹配>特征檢測>2.ORB算法ORB算法首先構建高斯金字塔,然后使用FAST算法從每個層級不同大小的圖像中檢測出特征點。通過確定每個層級圖像的特征點,ORB算法能夠有效地檢測出不同尺寸的對象的特征點,以實現(xiàn)部分縮放不變性。尺度不變性特征點的旋轉(zhuǎn)不變性ORB算法ORB算法在FAST算法和BRIEF算法的計算中都引入了方向的概念。特征檢測與匹配>特征檢測>2.ORB算法直方圖OpenCV提供的cv2.ORB_create()方法用于創(chuàng)建ORB對象。格式:orb=cv2.ORB_create([nfeatures=500[,scaleFactor=1.2[,
nlevels=8[,edgeThreshold=31[,firstLevel=0]]]]])cv2.ORB_create()方法
orb表示創(chuàng)建的ORB對象;nfeatures表示需要檢測的最大特征點數(shù),為可選參數(shù),默認為500;scaleFactor表示金字塔中相鄰層之間的縮放因子,為可選參數(shù),其值必須大于1,默認為1.2;nlevels表示金字塔層數(shù),為可選參數(shù),默認為8;edgeThreshold表示邊緣閾值,為可選參數(shù),默認為31;firstLevel表示原圖像所在的金字塔級數(shù),為可選參數(shù),默認為0。【例
7-4】編寫程序,使用
ORB
算法檢測、計算并繪制圖像“build.png”(見本書配套素材“例題圖像/build.png”)的特征點,要求特征點數(shù)量為2000。特征檢測與匹配>特征檢測>2.ORB算法【參考代碼】importcv2 #導入OpenCV庫importnumpyasnp #導入NumPy庫img=cv2.imread("build.png") #讀取原圖像cv2.imshow('Input',img) #顯示原圖像gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)orb=cv2.ORB_create(nfeatures=2000)
#創(chuàng)建ORB對象kp,des=orb.detectAndCompute(gray,None)
#檢測并計算特征點img=cv2.drawKeypoints(gray,kp,img)
#繪制特征點cv2.imshow('drawKeypoints',img)
#顯示繪制特征點的圖像print("kp.shape:",np.shape(kp))
#顯示特征點數(shù)量#顯示特征向量形狀print("des.shape:",np.shape(des)) cv2.waitKey()
#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()
#釋放所有窗口【運行結(jié)果】程序運行結(jié)果如圖所示。從結(jié)果中可以看出,在圖像中檢測到2000個ORB特征點,每個特征的維度為32。特征檢測與匹配>特征檢測>2.ORB算法(a)原圖像
(b)繪制特征點后的圖像
(c)圖像ORB特征向量的形狀
為了尋找兩幅圖像中相互匹配的特征點,需要對兩幅圖像的特征向量進行比對,特征向量的差別越小,就認為對應的兩個特征點的匹配程度越高。暴力匹配算法1KNN算法2FLANN算法3特征檢測與匹配>特征匹配特征檢測與匹配>特征匹配>1.暴力匹配算法直方圖暴力匹配(Brute-Force,BF)算法的基本原理:在第一幅圖像(查詢圖像)中選取一個特征點的特征向量,依次與第二幅圖像(訓練圖像)的每個特征點的特征向量進行距離計算,返回與其距離最近的特征點,組成一個匹配對象(DMatch對象),第一幅圖像中所有的特征點遍歷完成后,即可得到所有匹配。暴力匹配屬性一屬性二屬性三屬性四查詢圖像與訓練圖像之間的距離,該距離越小,表明匹配質(zhì)量越好。DMatch.distance查詢圖像描述符的索引值,即當前描述符在查詢圖像特征向量中的索引值。DMatch.queryIdx訓練圖像描述符的索引值,即當前描述符在訓練圖像特征向量中的索引值。DMatch.trainIdx訓練圖像的索引值。DMatch.imgId特征檢測與匹配>特征匹配>1.暴力匹配算法每個DMatch對象包含每個匹配成功特征點對的4個屬性如下:特征檢測與匹配>特征匹配>1.暴力匹配算法讀取輸入圖像,并調(diào)用cv2.cvtColor()函數(shù)將輸入圖像轉(zhuǎn)換為灰度圖像。步驟
1在OpenCV中,使用暴力匹配算法進行特征匹配的一般操作步驟如下。創(chuàng)建特征檢測對象(如SIFT對象或ORB對象)。步驟
2檢測并計算特征點。步驟
3特征檢測與匹配>特征匹配>1.暴力匹配算法調(diào)用cv2.BFMatcher()方法創(chuàng)建BFMatcher對象。cv2.BFMatcher()方法格式如下:matcher=cv2.BFMatcher([,normType=cv2.NORM_L2[,crossCheck=False]])步驟
4matcher表示創(chuàng)建的BFMatcher對象;normType表示要使用的距離測量方式,為可選參數(shù),默認為cv2.NORM_L2,適用于SIFT算法,NORM_HAMMING適用于ORB算法;crossCheck表示是否啟用交叉檢查,為可選參數(shù),默認為False。特征檢測與匹配>特征匹配>1.暴力匹配算法調(diào)用match()方法在兩個特征向量之間進行特征匹配,match()方法的格式如下(假設已經(jīng)創(chuàng)建了BFMatcher的對象matcher)。matches=matcher.match(queryDescriptors,trainDescriptors[,mask=None])步驟
5matches表示最佳匹配結(jié)果,為DMatch對象列表;queryDescriptors表示查詢圖像的特征向量;trainDescriptors表示訓練圖像的特征向量;mask表示掩模圖像,為可選參數(shù),默認為None,即不使用掩模圖像。特征檢測與匹配>特征匹配>1.暴力匹配算法調(diào)用cv2.drawMatches()函數(shù)繪制圖像中匹配的特征點,cv2.drawMatches()函數(shù)的格式如下。cv2.drawMatches(img1,keypoints1,img2,keypoints2,matches1to2,outImg[,matchColor[,singlePointColor[,matchesMask[,flags]]]])步驟
6img1表示查詢圖像;keypoints1表示img1的特征點;img2表示訓練圖像;keypoints2表示img2的特征點;matches1to2表示img1與img2的匹配結(jié)果;outImg表示結(jié)果圖像;特征檢測與匹配>特征匹配>1.暴力匹配算法調(diào)用cv2.drawMatches()函數(shù)繪制圖像中匹配的特征點,cv2.drawMatches()函數(shù)的格式如下。cv2.drawMatches(img1,keypoints1,img2,keypoints2,matches1to2,outImg[,matchColor[,singlePointColor[,matchesMask[,flags]]]])步驟
6matchColor表示特征點和連接線的顏色,為可選參數(shù),默認情況下,使用隨機顏色繪制;singlePointColor表示單個特征點的顏色,為可選參數(shù),默認情況下,使用隨機顏色繪制;matchesMask表示掩模圖像,為可選參數(shù),默認情況下,繪制所有匹配結(jié)果;flags表示繪制圖像特征點的標志,為可選參數(shù),默認為cv2.DrawMatchesFlags_DEFAULT?!纠?/p>
7-5】編寫程序,首先使用SIFT算法檢測和計算圖像“l(fā)eft_01.jpg”和“right_01.jpg”(見本書配套素材“例題圖像/left_01.jpg”和“例題圖像/right_01.jpg”)的特征點,然后使用暴力匹配算法進行特征匹配,并顯示匹配結(jié)果圖像。特征檢測與匹配>特征匹配>1.暴力匹配算法【參考代碼】importcv2 #導入OpenCV庫defdetectAndDescribe(image):
#定義函數(shù),檢測和計算特征點 gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) sift=cv2.SIFT_create() #創(chuàng)建SIFT對象 kp,des=sift.detectAndCompute(gray,None) #檢測并計算特征點 returnimage,kp,desimgA=cv2.imread("left_01.jpg") #讀取原圖像imgB=cv2.imread("right_01.jpg")#調(diào)用函數(shù),檢測和計算特征點imgA,kpA,desA=detectAndDescribe(imgA)imgB,kpB,desB=detectAndDescribe(imgB)特征檢測與匹配>特征匹配>1.暴力匹配算法【參考代碼】matcher=cv2.BFMatcher(cv2.NORM_L2) #創(chuàng)建BFMatcher對象rawMatches=matcher.match(desA,desB) #特征匹配#對DMatch對象的distance屬性進行排序rawMatches=sorted(rawMatches,key=lambdax:x.distance)#繪制圖像中匹配的特征點out=cv2.drawMatches(imgA,kpA,imgB,kpB,rawMatches[:30],None)#顯示匹配結(jié)果圖像cv2.imshow('drawMatches',out) cv2.waitKey()
#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()
#釋放所有窗口【運行結(jié)果】程序運行結(jié)果如下圖所示。特征檢測與匹配>特征匹配>1.暴力匹配算法
例7-5程序運行結(jié)果特征檢測與匹配>特征匹配>2.KNN算法格式:matches=matcher.knnMatch(queryDescriptors,trainDescriptors,k[,mask])knnMatch()
函數(shù)k表示返回匹配特征點的數(shù)量;其余參數(shù)與match()函數(shù)中的參數(shù)一致。KNN算法的大致流程和暴力匹配相同,唯一區(qū)別在于對于每個特征點的特征向量,都會返回前k(k
>
1)個距離最近的特征點。OpenCV提供的
knnMatch()方法用于進行KNN特征匹配,返回k個(k值是由用戶設定的)最佳匹配點。特征檢測與匹配>特征匹配>2.KNN算法簡述使用knnMatch()方法進行特征匹配時的步驟。使用knnMatch()方法進行特征匹配時,須先創(chuàng)建
BFMatcher
對象,然后使用BFMatcher對象調(diào)用該方法。FLANN(fastlibraryforapproximatenearestneighbors)是目前較完整的快速近似最近鄰開源庫。它可以在高維空間中快速搜索近似最近鄰點,使得它在特征匹配任務中具有較高的性能。在面對大數(shù)據(jù)集時,F(xiàn)LANN算法的效果要好于BF算法,但由于它使用的是近似鄰近值,所以匹配精度較差。創(chuàng)建FLANN匹配器對象1調(diào)用match()方法或
knnMatch()方法進行特征匹配2使用
cv2.drawMatches()函數(shù)或cv2.drawMatchesKnn()函數(shù)繪制匹配的特征點3特征檢測與匹配>特征匹配>3.FLANN算法具體步驟:特征檢測與匹配>特征匹配>3.FLANN算法格式:matcher=cv2.FlannBasedMatcher(index_params,search_params)cv2.FlannBasedMatcher()函數(shù)matcher表示創(chuàng)建的FLANN匹配器對象;index_params
和
search_params
均為字典類型,其鍵值根據(jù)用戶指定的具體算法而變化。OpenCV提供的cv2.FlannBasedMatcher()方法用于創(chuàng)建FLANN匹配器。特征檢測與匹配>特征匹配>3.FLANN算法格式:index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)algorithm表示匹配算法為FLANN_INDEX_KDTREE(又稱隨機KDTREE);trees表示隨機KDTREE的層數(shù)。index_params
用于指定索引樹的算法類型和數(shù)量。SIFT
算法可以使用下列代碼對index_params進行設置。特征檢測與匹配>特征匹配>3.FLANN算法ORB算法可以使用下列代碼對index_params進行設置。格式:index_params=dict(algorithm=FLANN_INDEX_LSH,table_number=6,
key_size=12,multi_probe_level=1)algorithm表示匹配算法為FLANN_INDEX_LSH(局部敏感哈希算法);table_number表示哈希表的數(shù)量;key_size表示哈希表鍵的位數(shù);multi_probe_level表示多路探測的級別。特征檢測與匹配>特征匹配>3.FLANN算法search_params用于指定索引樹的遍歷次數(shù),遍歷次數(shù)越多,匹配結(jié)果精度越高,但需要的時間也會更多,通常設置為50即可。格式:
search_params=dict(checks=50)【例
7-6】編寫程序,首先使用SIFT算法檢測和計算圖像“l(fā)eft_01.jpg”和“right_01.jpg”(見本書配套素材“例題圖像/left_01.jpg”和“例題圖像/right_01.jpg”)的特征點,然后使用FLANN算法進行特征匹配,并顯示匹配結(jié)果圖像。特征檢測與匹配>特征匹配>3.FLANN算法【參考代碼】importcv2
#導入OpenCV庫defdetectAndDescribe(image):
#定義函數(shù),檢測和計算特征點 gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) sift=cv2.SIFT_create()
#創(chuàng)建SIFT對象 kp,des=sift.detectAndCompute(gray,None)
#檢測并計算特征點 returnimage,kp,desimgA=cv2.imread("left_01.jpg")
#讀取原圖像imgB=cv2.imread("right_01.jpg")#調(diào)用函數(shù),檢測和計算特征點imgA,kpA,desA=detectAndDescribe(imgA)imgB,kpB,desB=detectAndDescribe(imgB)特征檢測與匹配>特征匹配>3.FLANN算法【參考代碼】index_params=dict(algorithm=1,trees=5) #定義FLANN參數(shù)search_params=dict(checks=50)#創(chuàng)建FLANN匹配器對象flann=cv2.FlannBasedMatcher(index_params,search_params)rawMatches=flann.knnMatch(desA,desB,k=2)
#使用KNN算法進行特征匹配ratio=0.7#當最近距離與次近距離的比值小于ratio時,保留此匹配對matches=[[m]form,ninrawMatchesifm.distance<ratio*n.distance]#繪制匹配的特征點out=cv2.drawMatchesKnn(imgA,kpA,imgB,kpB,matches[:50],None)#顯示匹配圖像cv2.imshow('drawMatches',out) cv2.waitKey()
#窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows()
#釋放所有窗口【運行結(jié)果】程序運行結(jié)果如下圖所示。特征檢測與匹配>特征匹配>3.FLANN算法
例7-6程序運行結(jié)果邊緣檢測>Canny邊緣檢測北京航空航天大學的張寶昌教授主要致力于低功耗前端視覺感知技術的研究,連續(xù)4年入選愛思唯爾(Elsevier)中國高被引學者。為了設計能夠高效利用有限資源的智能感知系統(tǒng),他的團隊提出了可控視覺表征模型和調(diào)制卷積神經(jīng)網(wǎng)絡,提升了深度學習模型的端側(cè)可用性和魯棒性。在不懈的努力下,張寶昌教授及其研究團隊改進了可學習Gabor調(diào)制核,提出了一系列單比特神經(jīng)網(wǎng)絡構建方法,成功證明了單比特神經(jīng)網(wǎng)絡的可行性,并順利地將單比特神經(jīng)網(wǎng)絡嵌入到了華為Bolt系統(tǒng)中。素養(yǎng)之窗03透視變換透視變換OpenCV提供的cv2.getPerspectiveTransform()函數(shù)用于獲取透視變換矩陣。格式:M=cv2.getPerspectiveTransform(src_pts,dst_pts)cv2.getPerspectiveTransform()
函數(shù)M表示3×3的透視變換矩陣,該矩陣應用于原圖像,以實現(xiàn)從原四邊形到目標四邊形的透視變換;src_pts表示原四邊形的4個頂點坐標,為4×2的NumPy數(shù)組,每一列代表一個頂點的(x,y)坐標;dst_pts表示目標四邊形的4個頂點坐標,也是4×2的NumPy數(shù)組,格式與src_pts相同。
透視變換是將圖像投影到一個新的視平面的幾何變換方法,又稱投影映射。它能夠?qū)⒍S的圖像投影到一個三維的視平面上,經(jīng)過處理后,再轉(zhuǎn)移到二維坐標中。透視變換格式:dst=cv2.warpPerspective(src,M,dsize[,flags=INTER_LINEAR[,
borderMode=BORDER_CONSTANT[,borderValue=(0,0,0)]]])cv2.warpPerspective()函數(shù)dst表示輸出圖像,即透視變換后的圖像;src表示原圖像;M表示3×3的透視變換矩陣;dsize表示輸出圖像的大??;flags表示插值方式,為可選參數(shù),其值可以為cv2.INTER_LINEAR、cv2.INTER_NEAREST、cv2.INTER_AREAcv2.INTER_CUBIC和cv2.INTER_LANCZOS4等,默認為cv2.INTER_LINEAR;
有了透視變換矩陣后,可使用OpenCV的cv2.warpPerspective()函數(shù)實現(xiàn)圖像的透視變換。格式:dst=cv2.warpPerspective(src,M,dsize[,flags=INTER_LINEAR[,
borderMode=BORDER_CONSTANT[,borderValue=(0,0,0)]]])cv2.warpPerspective()函數(shù)
borderMode表示邊界像素模式,為可選參數(shù),其值可以為cv2.BORDER_CONSTANT(常量邊界)、cv2.BORDER_REPLICATE(邊界像素值復制)、cv2.BORDER_REFLECT(邊界像素值反射)和cv2.BORDER_WRAP(邊界像素值環(huán)繞)等,默認為cv2.BORDER_CONSTANT;
borderValue表示當邊界模式為cv2.BORDER_CONSTANT時,設置的邊界顏色,為可選參數(shù),默認為(0,0,0),即黑色。透視變換【例
7-7】編寫程序,使用OpenCV的cv2.warpPerspective()函數(shù)對圖像“book.png”(見本書配套素材“例題圖像/book.png”)進行透視變換,并顯示原圖像和透視變換后的圖像。透視變換【參考代碼】importcv2 #導入OpenCV庫importnumpyasnp #導入NumPy庫image=cv2.imread('book.png')
#讀取原圖像src_pts=np.float32([[120,27],[352,37],[46,350],[315,370]])
#定義原四邊形的頂點坐標dst_pts=np.float32([[50,50],[350,50],[50,350],[350,350]])
#定義目標四邊形的頂點坐標M=cv2.getPerspectiveTransform(src_pts,dst_pts)
#獲取透視變換矩陣warped_image=cv2.warpPerspective(image,M,(400,400))
#對圖像進行透視變換cv2.imshow('Input',image)
#顯示原圖像cv2.imshow('Perspective',warped_image)
#顯示透視變換后的圖像cv2.waitKey() #窗口等待,按任意鍵繼續(xù)cv2.destroyAllWindows() #釋放所有窗口【運行結(jié)果】程序運行結(jié)果如下圖所示。特征匹配>1.暴力匹配算法(a)原圖像
(b)透視變換后的圖像04項目實施項目實施——風景圖像全景拼接>項目分析步驟1步驟2圖像特征檢測圖像特征匹配風景圖像全景拼接步驟3圖像透視變換與拼接項目實施——風景圖像全景拼接>項目分析>1.圖像特征檢測步驟1導入本項目所需的模塊與包。步驟2定義函數(shù)detectAndDescribe(),函數(shù)參數(shù)為圖像image。該函數(shù)可檢測、計算并繪制圖像image的特征點。在函數(shù)體中,首先調(diào)用cv2.cvtColor()函數(shù)將圖像的色彩空間從BGR轉(zhuǎn)換為GRAY;然后創(chuàng)建SIFT對象,檢測并計算圖像的特征點;最后繪制圖像的特征點,并返回繪制了特征點的圖像、圖像的特征點及特征點的特征向量。步驟3讀取進行圖像拼接的兩幅圖像文件“l(fā)eft_02.png”和“right_02.png”,并對兩幅圖像進行備份。步驟4調(diào)用函數(shù)detectAndDescribe(),檢測、計算并繪制兩幅圖像的特征點。步驟5調(diào)用NumPy庫的函數(shù)hstack()對已繪制特征點的兩幅圖像進行水平堆疊,并顯示堆疊后的圖像。項目實施——風景圖像全景拼接>項目分析>2.圖像特征匹配步驟1步驟2創(chuàng)建BFMatcher對象,然后使用BFMatcher對象調(diào)用方法knnMatch()進行特征匹配,且每個特征點保留兩個匹配結(jié)果。篩選匹配結(jié)果,當最近距離與次近距離的比值小于ratio(值為0.7)時,保留此匹配對。步驟3繪制匹配的特征點,并顯示匹配結(jié)果圖像。項目實施——風景圖像全景拼接>項目分析>3.圖像透視變換與拼接第一步第二步定義函數(shù)get_homo()獲得透視變換矩陣,函數(shù)參數(shù)為進行圖像拼接的兩幅圖像的特征點kpA和kpB及其特征匹配結(jié)果matches。首先將圖像特征點kpA和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際結(jié)算試題及答案
- 達標焦慮面試題目及答案
- 類似分解式的試題及答案
- 常見專業(yè)面試題目及答案
- 引導設計靈感的國際商業(yè)美術設計師考試課程與試題及答案
- 安康英語面試題目及答案
- 實驗操作考試試題及答案
- 2024紡織纖維特性考察試題及答案
- 2025西南某縣城市文旅宣傳營銷方案
- 實踐中廣告效果的關鍵指標與研究方向試題及答案
- 江蘇省常州市2024-2025學年高一下學期4月期中考試英語試題(含答案)
- DB11-T 1444-2025 城市軌道交通隧道工程注漿技術規(guī)程
- 建筑設計中的重點難點及相應控制措施
- 游艇消防安全培訓課件
- 智能化開發(fā)工具研究-全面剖析
- 220kV、110kV架空輸電線路施工方案
- 2025-2030中國鈦礦開采行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 麻醉科氣道管理護理
- 失眠障礙的健康宣教
- 土地房屋測繪項目投標方案技術標
- T-CAQI 387-2024 測量不確定度在分析化學領域質(zhì)量控制中的應用指南
評論
0/150
提交評論