日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05

發(fā)布時(shí)間:2024/9/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

圖像特征-harris角點(diǎn)檢測(cè)

基本原理







R>0 角點(diǎn)
R≈0 平坦區(qū)域
R<0 邊界

總結(jié)一下Harris算法流程

獲取點(diǎn)數(shù)據(jù)后,計(jì)算Ix 和 Iy
整合矩陣,求特征值
比較特征值大小
非極大值抑制NMS,過(guò)濾掉不是那么角的

OpenCV中怎么檢測(cè)Harris

cv2.cornerHarris()
img: 數(shù)據(jù)類(lèi)型為 ?oat32 的入圖像
blockSize: 角點(diǎn)檢測(cè)中指定區(qū)域的大小,前面提到的w(u,v),可能是個(gè)高斯函數(shù)
ksize: 就像Sobel求導(dǎo)中使用的窗口大小
k: 取值參數(shù)為 [0,04,0.06]. 默認(rèn)0.04
返回dst:輸出圖像

import cv2 import numpy as npimg = cv2.imread('chessboard.jpg') #讀取圖片 print ('img.shape:',img.shape) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 轉(zhuǎn)換成灰度圖 # gray = np.float32(gray) dst = cv2.cornerHarris(gray, 2, 3, 0.04) # 執(zhí)行檢測(cè) print ('dst.shape:',dst.shape)

# dst.max是最大值,一定是角點(diǎn) # 只要dst中滿(mǎn)足0.01倍的最大值,就判定為角點(diǎn),要求較高的也可以設(shè)置為其他倍數(shù) img[dst>0.01*dst.max()]=[0,0,255] cv2.imshow('dst',img) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imwrite('test_1_dst.jpg',img)

Scale Invariant Feature Transform(SIFT)

圖像尺度空間

在一定的范圍內(nèi),無(wú)論物體是大還是小,人眼都可以分辨出來(lái),然而計(jì)算機(jī)要有相同的能力卻很難,所以要讓機(jī)器能夠?qū)ξ矬w在不同尺度下有一個(gè)統(tǒng)一的認(rèn)知,就需要考慮圖像在不同的尺度下都存在的特點(diǎn)。

尺度空間的獲取通常使用高斯模糊來(lái)實(shí)現(xiàn)


不同σ的高斯函數(shù)決定了對(duì)圖像的平滑程度,越大的σ值對(duì)應(yīng)的圖像越模糊。

高斯差分金字塔(DOG)


DoG空間極值檢測(cè)

為了尋找尺度空間的極值點(diǎn),每個(gè)像素點(diǎn)要和其圖像域(同一尺度空間)和尺度域(相鄰的尺度空間)的所有相鄰點(diǎn)進(jìn)行比較,當(dāng)其大于(或者小于)所有相鄰點(diǎn)時(shí),該點(diǎn)就是極值點(diǎn)。如下圖所示,中間的檢測(cè)點(diǎn)要和其所在圖像的3×3鄰域8個(gè)像素點(diǎn),以及其相鄰的上下兩層的3×3領(lǐng)域18個(gè)像素點(diǎn),共26個(gè)像素點(diǎn)進(jìn)行比較。

關(guān)鍵點(diǎn)的精確定位

這些候選關(guān)鍵點(diǎn)是DOG空間的局部極值點(diǎn),而且這些極值點(diǎn)均為離散的點(diǎn),精確定位極值點(diǎn)的一種方法是,對(duì)尺度空間DoG函數(shù)進(jìn)行曲線(xiàn)擬合,計(jì)算其極值點(diǎn),從而實(shí)現(xiàn)關(guān)鍵點(diǎn)的精確定位。


消除邊界響應(yīng)

特征點(diǎn)的主方向

每個(gè)特征點(diǎn)可以得到三個(gè)信息(x,y,σ,θ),即位置、尺度和方向。具有多個(gè)方向的關(guān)鍵點(diǎn)可以被復(fù)制成多份,然后將方向值分別賦給復(fù)制后的特征點(diǎn),一個(gè)特征點(diǎn)就產(chǎn)生了多個(gè)坐標(biāo)、尺度相等,但是方向不同的特征點(diǎn)。

生成特征描述

在完成關(guān)鍵點(diǎn)的梯度計(jì)算后,使用直方圖統(tǒng)計(jì)鄰域內(nèi)像素的梯度和方向。

為了保證特征矢量的旋轉(zhuǎn)不變性,要以特征點(diǎn)為中心,在附近鄰域內(nèi)將坐標(biāo)軸旋轉(zhuǎn)θ角度,即將坐標(biāo)軸旋轉(zhuǎn)為特征點(diǎn)的主方向。

旋轉(zhuǎn)之后的主方向?yàn)橹行娜?x8的窗口,求每個(gè)像素的梯度幅值和方向,箭頭方向代表梯度方向,長(zhǎng)度代表梯度幅值,然后利用高斯窗口對(duì)其進(jìn)行加權(quán)運(yùn)算,最后在每個(gè)4x4的小塊上繪制8個(gè)方向的梯度直方圖,計(jì)算每個(gè)梯度方向的累加值,即可形成一個(gè)種子點(diǎn),即每個(gè)特征的由4個(gè)種子點(diǎn)組成,每個(gè)種子點(diǎn)有8個(gè)方向的向量信息。

論文中建議對(duì)每個(gè)關(guān)鍵點(diǎn)使用4x4共16個(gè)種子點(diǎn)來(lái)描述,這樣一個(gè)關(guān)鍵點(diǎn)就會(huì)產(chǎn)生128維的SIFT特征向量。

使用open cv前最好先安裝anaconda.由于部分函數(shù)涉及專(zhuān)利問(wèn)題,如sift和surf,所以需要使用opencv-python 3.4.1.15版本的但是蛋疼的是python需要3.6的才能支持該版本,所以在此之前先要安裝python3.6的環(huán)境,也可以直接安裝低版本的anaconda,安裝環(huán)境方法如下:conda create --name py3.6 python=3.6 #創(chuàng)建python3.6環(huán)境 conda activate py3.6 #進(jìn)入該環(huán)境 pip install opencv-python==3.4.1.15 #安裝opencv pip install opencv-contrib-python==3.4.1.15 #安裝opencv的其他包

opencv SIFT函數(shù)

import cv2 import numpy as npimg = cv2.imread('test_1.jpg')# 讀取圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度圖 sift = cv2.xfeatures2d.SIFT_create() # 實(shí)例化一個(gè)sift kp = sift.detect(gray, None) # 傳進(jìn)去一個(gè)圖像

img = cv2.drawKeypoints(gray, kp, img) # 繪制關(guān)鍵點(diǎn)cv2.imshow('drawKeypoints', img) cv2.waitKey(0) cv2.destroyAllWindows()


計(jì)算特征

kp, des = sift.compute(gray, kp) print (np.array(kp).shape)

des.shape


特征匹配

### Brute-Force蠻力匹配

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img1 = cv2.imread('box.png', 0) img2 = cv2.imread('box_in_scene.png', 0) def cv_show(name,img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows() cv_show('img1',img1)

cv_show('img2',img2)

sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # crossCheck表示兩個(gè)特征點(diǎn)要互相匹,例如A中的第i個(gè)特征點(diǎn)與B中的第j個(gè)特征點(diǎn)最近的,并且B中的第j個(gè)特征點(diǎn)到A中的第i個(gè)特征點(diǎn)也是 #NORM_L2: 歸一化數(shù)組的(歐幾里德距離),如果其他特征計(jì)算方法需要考慮不同的匹配計(jì)算方式 bf = cv2.BFMatcher(crossCheck=True)

1對(duì)1的匹配

matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2) cv_show('img3',img3)

k對(duì)最佳匹配

bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) good = [] for m, n in matches:if m.distance < 0.75 * n.distance:good.append([m]) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2) cv_show('img3',img3)

如果需要更快速完成操作,可以嘗試使用cv2.FlannBasedMatcher

隨機(jī)抽樣一致算法(Random sample consensus,RANSAC)

選擇初始樣本點(diǎn)進(jìn)行擬合,給定一個(gè)容忍范圍,不斷進(jìn)行迭代

每一次擬合后,容差范圍內(nèi)都有對(duì)應(yīng)的數(shù)據(jù)點(diǎn)數(shù),找出數(shù)據(jù)點(diǎn)個(gè)數(shù)最多的情況,就是最終的擬合結(jié)果

單應(yīng)性矩陣

總結(jié)

以上是生活随笔為你收集整理的OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。