BEBLID:減少執(zhí)行時(shí)間的同時(shí)提高圖像匹配精度!
OpenCV發(fā)行版4.5.1包含了BEBLID,這是一個(gè)新的本地特性描述符。opencv4.5.1中最令人興奮的特性之一是BEBLID(Boosted effective Binary Local Image Descriptor),它是一種新的描述符,能夠在減少執(zhí)行時(shí)間的同時(shí)提高圖像匹配精度!本文將向你展示一個(gè)具體的例子,所有源代碼都存儲在此GitHub存儲庫中:https://github.com/iago-suarez/beblid-opencv-demo/blob/main/demo.ipynb在這個(gè)例子中,我們將通過一個(gè)視角的改變來匹配這兩個(gè)圖像:
首先,確保安裝了正確版本的OpenCV。
在你喜愛的環(huán)境中,你可以使用以下工具安裝和檢查OpenCV Contrib版本:pip install "opencv-contrib-python>=4.5.1"
python
>>> import cv2 as cv
>>> print(f"OpenCV Version: {cv.__version__}")
OpenCV Version: 4.5.1
在Python中加載這兩個(gè)圖像所需的代碼是:import cv2 as cv
# Load grayscale images
img1 = cv.imread("graf1.png", cv.IMREAD_GRAYSCALE)
img2 = cv.imread("graf3.png", cv.IMREAD_GRAYSCALE)
if img1 is None or img2 is None:
print('Could not open or find the images。В
exit(0)
為了評估我們的圖像匹配程序,我們需要在兩幅圖像之間進(jìn)行正確的幾何變換。這是一個(gè)稱為單應(yīng)性的3x3矩陣,當(dāng)我們將第一個(gè)圖像中的一個(gè)點(diǎn)(在齊次坐標(biāo)中)相乘時(shí),它將返回第二個(gè)圖像中該點(diǎn)的坐標(biāo)。讓我們加載它:# Load homography (geometric transformation between image)
fs = cv.FileStorage("H1to3p.xml", cv.FILE_STORAGE_READ)
homography = fs.getFirstTopLevelNode().mat()
print(f"Homography from img1 to img2:{homography}")
下一步是檢測圖像中容易在其他圖像中找到的部分:局部圖像特征。在這個(gè)例子中,我們將用一個(gè)快速可靠的探測器ORB來檢測角點(diǎn)。ORB通過比較不同尺度下的角點(diǎn)來檢測強(qiáng)角點(diǎn),并利用FAST或Harris響應(yīng)來選擇最佳的角點(diǎn),同時(shí)它還使用局部分塊的一階矩來確定每個(gè)角點(diǎn)的方向。允許在每個(gè)圖像中檢測最多10000個(gè)角點(diǎn):detector = cv.ORB_create(10000)
kpts1 = detector.detect(img1, None)
kpts2 = detector.detect(img2, None)
在下圖中,你可以看到用綠點(diǎn)標(biāo)記的檢測響應(yīng)最強(qiáng)的500個(gè)角點(diǎn)特征:
現(xiàn)在使用該方式來表示這些關(guān)鍵點(diǎn),我們可以在另一幅圖中找到它們,這一步稱為描述,因?yàn)槊總(gè)角點(diǎn)附近的局部分塊中的紋理由來自圖像上不同操作的數(shù)字向量表示(即描述)。有很多描述符,但如果我們想要一些準(zhǔn)確的東西,即使在移動(dòng)電話或低功耗設(shè)備上也能實(shí)時(shí)運(yùn)行,OpenCV有兩種重要的方法:ORB(Oriented FAST and Rotated BRIEF):一個(gè)經(jīng)典的替代品,已經(jīng)有10年的歷史了,效果相當(dāng)不錯(cuò)。BEBLID(Boosted effective Binary Local Image Descriptor):2020年推出的一種新的描述符,在多個(gè)任務(wù)中被證明可以提高ORB。由于BEBLID適用于多種檢測方法,因此必須將ORB關(guān)鍵點(diǎn)的比例設(shè)置為0.75~1。# Comment or uncomment to use ORB or BEBLID
descriptor = cv.xfeatures2d.BEBLID_create(0.75)
# descriptor = cv.ORB_create()
kpts1, desc1 = descriptor.compute(img1, kpts1)
kpts2, desc2 = descriptor.compute(img2, kpts2)
現(xiàn)在是時(shí)候匹配兩幅圖像的描述符來建立對應(yīng)關(guān)系了。讓我們使用暴力算法,基本上比較第一個(gè)圖像中的每個(gè)描述符與第二個(gè)圖像中的所有描述符。當(dāng)我們處理二進(jìn)制描述符時(shí),比較是用漢明距離來完成的,也就是說,計(jì)算每對描述符之間不同的位數(shù)。這里還使用了一個(gè)稱為比率測試的小技巧,它不僅確保描述符1和2彼此相似,而且沒有其他描述符像2那樣接近1。matcher = cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE_HAMMING)
nn_matches = matcher.knnMatch(desc1, desc2, 2)
matched1 = []
matched2 = []
nn_match_ratio = 0.8 # Nearest neighbor matching ratio
for m, n in nn_matches:
if m.distance < nn_match_ratio * n.distance:
matched1.a(chǎn)ppend(kpts1[m.queryIdx])
matched2.a(chǎn)ppend(kpts2[m.trainIdx])
因?yàn)槲覀冎勒_的幾何變換,所以讓我們檢查有多少匹配是正確的(inliers)。如果圖2中的點(diǎn)和從圖1投射到圖2的點(diǎn)距離小于2.5像素,我們將認(rèn)為它是有效的。inliers1 = []
inliers2 = []
good_matches = []
inlier_threshold = 2.5 # Distance threshold to identify inliers with homography check
for i, m in enumerate(matched1):
# Create the homogeneous point
col = np.ones((3, 1), dtype=np.float64)
col[0:2, 0] = m.pt
# Project from image 1 to image 2
col = np.dot(homography, col)
col /= col[2, 0]
# Calculate euclidean distance
dist = sqrt(pow(col[0, 0] - matched2[i].pt[0], 2) + pow(col[1, 0] - matched2[i].pt[1], 2))
if dist < inlier_threshold:
good_matches.a(chǎn)ppend(cv.DMatch(len(inliers1), len(inliers2), 0))
inliers1.a(chǎn)ppend(matched1[i])
inliers2.a(chǎn)ppend(matched2[i])
現(xiàn)在我們在inliers1和inliers2變量中具有正確的匹配項(xiàng),我們可以使用cv.drawMatches對結(jié)果進(jìn)行定性評估。每個(gè)對應(yīng)點(diǎn)都可以幫助我們完成更高層次的任務(wù),例如單應(yīng)性估計(jì),透視n點(diǎn),平面跟蹤,實(shí)時(shí)姿態(tài)估計(jì)或圖像拼接。單應(yīng)性估計(jì):https://docs.opencv.org/4.5.1/d9/d0c/group__calib3d.html#ga4abc2ece9fab9398f2e560d53c8c9780透視n點(diǎn):https://docs.opencv.org/4.5.1/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d平面跟蹤:https://docs.opencv.org/4.5.1/dc/d16/tutorial_akaze_tracking.html實(shí)時(shí)姿態(tài)估計(jì):https://docs.opencv.org/4.5.1/dc/d2c/tutorial_real_time_pose.html圖像拼接:https://docs.opencv.org/4.5.1/df/d8c/group__stitching__match.htmlres = np.empty((max(img1.shape[0], img2.shape[0]), img1.shape[1] + img2.shape[1], 3), dtype=np.uint8)
cv.drawMatches(img1, inliers1, img2, inliers2, good_matches, res)
plt.figure(figsize=(15, 5))
plt.imshow(res)
由于很難比較這種定性的結(jié)果,所以我們需要一些定量的評價(jià)指標(biāo),最能反映描述符可靠性的指標(biāo)是inliers的百分比:
Matching Results (BEBLID)
*******************************
# Keypoints 1: 9105
# Keypoints 2: 9927
# Matches: 660
# Inliers: 512
# Percentage of Inliers: 77.57%
使用BEBLID描述符可以獲得77.57%的inliers。如果我們在description單元格中注釋BEBLID并取消注釋ORB descriptor,結(jié)果將下降到63.20%:# Comment or uncomment to use ORB or BEBLID
# descriptor = cv.xfeatures2d.BEBLID_create(0.75)
descriptor = cv.ORB_create()
kpts1, desc1 = descriptor.compute(img1, kpts1)
kpts2, desc2 = descriptor.compute(img2, kpts2)
Matching Results (ORB)
*******************************
# Keypoints 1: 9105
# Keypoints 2: 9927
# Matches: 780
# Inliers: 493
# Percentage of Inliers: 63.20%
總之,用BEBLID替換ORB描述符只需一行代碼,就可以將兩幅圖像的匹配結(jié)果提高14%,這對需要局部特征匹配才能工作的更高級別任務(wù)有很大收益。

發(fā)表評論
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
8月5日立即報(bào)名>> 【在線會議】CAE優(yōu)化設(shè)計(jì):醫(yī)療器械設(shè)計(jì)的應(yīng)用案例與方案解析
-
8月14日立即報(bào)名>> 【在線研討會】解析安森美(onsemi)高精度與超低功耗CGM系統(tǒng)解決方案
-
精彩回顧立即查看>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 7月30日- 8月1日 2025全數(shù)會工業(yè)芯片與傳感儀表展
-
精彩回顧立即查看>> 全數(shù)會2025(第六屆)機(jī)器人及智能工廠展
-
精彩回顧立即查看>> OFweek 2025 具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會
推薦專題
- 1 AI產(chǎn)業(yè)的新高度!英偉達(dá)成為全球首家市值破4萬億美元的公司
- 2 傳魏建軍與賈躍亭合作,長城汽車出海美國
- 3 一文讀懂:到底什么是 “具身智能” ?
- 4 黃仁勛:與雷軍長期合作,共探AI智駕
- 5 具身智能泡沫爭議下,華映資本尋找「穿越周期者」
- 6 中國平安們欲靠AI守“陣地”
- 7 官宣:智元機(jī)器人借殼上市,A股人形機(jī)器人第一股!
- 8 華為讓渡“三界”銷售主導(dǎo)權(quán),智界高管:終于能全力奔跑了
- 9 借仿生手實(shí)現(xiàn)突圍,國產(chǎn)靈巧手破局“不可能三角”
- 10 DeepSeek R2加持,中國AI與芯片產(chǎn)業(yè)迎來新一輪協(xié)同進(jìn)化