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è)具體的例子,所有源代碼都存儲(chǔ)在此GitHub存儲(chǔ)庫(kù)中:https://github.com/iago-suarez/beblid-opencv-demo/blob/main/demo.ipynb在這個(gè)例子中,我們將通過(guò)一個(gè)視角的改變來(lái)匹配這兩個(gè)圖像:
首先,確保安裝了正確版本的OpenCV。
在你喜愛(ài)的環(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)
為了評(píng)估我們的圖像匹配程序,我們需要在兩幅圖像之間進(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}")
下一步是檢測(cè)圖像中容易在其他圖像中找到的部分:局部圖像特征。在這個(gè)例子中,我們將用一個(gè)快速可靠的探測(cè)器ORB來(lái)檢測(cè)角點(diǎn)。ORB通過(guò)比較不同尺度下的角點(diǎn)來(lái)檢測(cè)強(qiáng)角點(diǎn),并利用FAST或Harris響應(yīng)來(lái)選擇最佳的角點(diǎn),同時(shí)它還使用局部分塊的一階矩來(lái)確定每個(gè)角點(diǎn)的方向。允許在每個(gè)圖像中檢測(cè)最多10000個(gè)角點(diǎn):detector = cv.ORB_create(10000)
kpts1 = detector.detect(img1, None)
kpts2 = detector.detect(img2, None)
在下圖中,你可以看到用綠點(diǎn)標(biāo)記的檢測(cè)響應(yīng)最強(qiáng)的500個(gè)角點(diǎn)特征:
現(xiàn)在使用該方式來(lái)表示這些關(guān)鍵點(diǎn),我們可以在另一幅圖中找到它們,這一步稱為描述,因?yàn)槊總(gè)角點(diǎn)附近的局部分塊中的紋理由來(lái)自圖像上不同操作的數(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適用于多種檢測(cè)方法,因此必須將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í)候匹配兩幅圖像的描述符來(lái)建立對(duì)應(yīng)關(guān)系了。讓我們使用暴力算法,基本上比較第一個(gè)圖像中的每個(gè)描述符與第二個(gè)圖像中的所有描述符。當(dāng)我們處理二進(jìn)制描述符時(shí),比較是用漢明距離來(lái)完成的,也就是說(shuō),計(jì)算每對(duì)描述符之間不同的位數(shù)。這里還使用了一個(gè)稱為比率測(cè)試的小技巧,它不僅確保描述符1和2彼此相似,而且沒(méi)有其他描述符像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)在我們?cè)趇nliers1和inliers2變量中具有正確的匹配項(xiàng),我們可以使用cv.drawMatches對(duì)結(jié)果進(jìn)行定性評(píng)估。每個(gè)對(duì)應(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é)果,所以我們需要一些定量的評(píng)價(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。如果我們?cè)赿escription單元格中注釋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%,這對(duì)需要局部特征匹配才能工作的更高級(jí)別任務(wù)有很大收益。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書(shū)】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬(wàn) APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語(yǔ)權(quán)
- 3 深度報(bào)告|中國(guó)AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 6 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 7 百億AI芯片訂單,瘋狂傾銷中東?
- 8 Robotaxi新消息密集釋放,量產(chǎn)元年誰(shuí)在領(lǐng)跑?
- 9 一文看懂視覺(jué)語(yǔ)言動(dòng)作模型(VLA)及其應(yīng)用
- 10 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過(guò)于簡(jiǎn)單