訂閱
糾錯(cuò)
加入自媒體

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ù)有很大收益。

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)