<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenCV4.5.1來了,修改一行代碼,即可圖像匹配效果提升14%

          共 5016字,需瀏覽 11分鐘

           ·

          2021-02-21 03:41

          ↑ 點(diǎn)擊藍(lán)字?關(guān)注極市平臺


          極市導(dǎo)讀

          ?

          OpenCV發(fā)布了4.5.1,包含了BEBLID算子,一個新的局部特征描述符,超越ORB。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿

          OpenCV 4.5.1中最令人興奮的特性之一是BEBLID (Boosted Efficient Binary Local Image Descriptor),一個新的描述符能夠提高圖像匹配精度,同時減少執(zhí)行時間!這篇文章將向你展示這個魔法是如何實(shí)現(xiàn)的。所有的源代碼都在這個GitHub庫中:https://github.com/iago-suarez/beblid-opencv-demo/blob/main/demo.ipynb

          在這個例子中,我們將匹配這兩個視角不一樣的圖像:

          首先,確保安裝了正確的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中加載這兩個圖像所需的代碼是:
          import cv2 as cv
          # Load grayscale imagesimg1 = 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)行正確的(即ground truth)幾何變換。它是一個稱為單應(yīng)性的3x3矩陣,當(dāng)我們從第一個圖像中乘以一個點(diǎn)(在齊次坐標(biāo)中)時,它返回第二個圖像中這個點(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:\n{homography}")

          下一步是檢測圖像中容易在其他圖像中找到的部分:Local image features。在本例中,我們將使用ORB,一個快速可靠的檢測器來檢測角點(diǎn)。ORB檢測到強(qiáng)角,在不同的尺度上比較它們,并使用FAST或Harris響應(yīng)來挑選最好的。它還使用局部patch的一階矩來尋找每個角點(diǎn)的方向。我們檢測每個圖像中最多10000個角點(diǎn):

          detector = cv.ORB_create(10000)kpts1 = detector.detect(img1, None)kpts2 = detector.detect(img2, None)

          在下面的圖片中,你可以看到500個用綠點(diǎn)標(biāo)記的檢測響應(yīng)最強(qiáng)的角點(diǎn)特征:

          很好,現(xiàn)在是時候以一種我們可以在另一張圖中找到它們的方式來表示這些關(guān)鍵點(diǎn)了。這個步驟被稱為description,因?yàn)?/span>每個角點(diǎn)的局部patch中的紋理表示 為圖像上不同操作得到的數(shù)字的向量。有很多的描述符可以用,但如果我們想要一些精確的東西,即使在移動電話或低功耗設(shè)備上也能實(shí)時運(yùn)行,OpenCV有兩個重要的方法:

          • ORB(導(dǎo)向快速和旋轉(zhuǎn)簡短):一個經(jīng)典的方法,有10年的歷史,工作相當(dāng)好。
          • BEBLID (Boosted Efficient Binary Local Image Descriptor):2020年引入的一個新的描述符,已被證明在幾個任務(wù)中改善了ORB。由于BEBLID適用于多種檢測方法,所以必須將ORB關(guān)鍵點(diǎn)的比例設(shè)置為0.75~1。
          # Comment or uncomment to use ORB or BEBLIDdescriptor = cv.xfeatures2d.BEBLID_create(0.75)# descriptor = cv.ORB_create()kpts1, desc1 = descriptor.compute(img1, kpts1)kpts2, desc2 = descriptor.compute(img2, kpts2)

          現(xiàn)在可以匹配這兩個圖像的描述符來建立對應(yīng)關(guān)系了。讓我們使用暴力求解算法,它基本上比較了第一張圖像中的每個描述符和第二張圖像中的所有描述符。當(dāng)我們處理二進(jìn)制描述符時,使用漢明距離進(jìn)行比較,即計(jì)算每對描述符之間不同的比特?cái)?shù)。這里還使用了一個叫做比率檢驗(yàn)的小技巧。它不僅確保描述符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 ratiofor m, n in nn_matches:    if m.distance < nn_match_ratio * n.distance:        matched1.append(kpts1[m.queryIdx])????????matched2.append(kpts2[m.trainIdx])

          因?yàn)槲覀冎勒_的幾何變換,讓我們檢查有多少匹配是正確的(inliners)。如果圖像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 checkfor 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.append(cv.DMatch(len(inliers1), len(inliers2), 0))        inliers1.append(matched1[i])        inliers2.append(matched2[i])

          現(xiàn)在我們在inliers1和inliers2變量中有了正確的匹配,我們可以使用cv.drawMatches定性地評估結(jié)果。每一個對應(yīng)點(diǎn)可以在更高級別的任務(wù)上對我們有幫助,比如homography estimation, Perspective-n-Point, plane tracking, real-time pose estimation 以及 images stitching。

          由于很難定性地比較這種結(jié)果,讓我們繪制一些定量的評價(jià)指標(biāo)。最能反映描述符可靠程度的指標(biāo)是inlier的百分比:

          Matching Results (BEBLID)*******************************# Keypoints 1:                          9105# Keypoints 2:                          9927# Matches:                              660# Inliers:                              512# Percentage of Inliers:                77.57%

          使用BEBLID描述符獲得77.57%的inliers。如果我們在描述符部分注釋掉BEBLID并取消注釋ORB描述符,結(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%

          總之,只需更改一行代碼,將ORB描述符替換為BEBLID ,就可以將這兩個圖像的匹配結(jié)果提高14%。這在需要局部特征匹配的高級任務(wù)中會產(chǎn)生很大影響,所以不要猶豫,試試BEBLID。

          英文原文:https://towardsdatascience.com/improving-your-image-matching-results-by-14-with-one-line-of-code-b72ae9ca2b73


          推薦閱讀


          基于深度學(xué)習(xí)的圖像匹配技術(shù)一覽

          2021-02-14

          用Pytorch輕松實(shí)現(xiàn)28個視覺Transformer,開源庫 timm 了解一下?。ǜ酱a解讀)

          2021-02-19

          用OpenCV實(shí)現(xiàn)超輕量的NanoDet目標(biāo)檢測模型!

          2021-02-18



          #CV技術(shù)社群邀請函#

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart2)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~


          △點(diǎn)擊卡片關(guān)注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 77
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99视频网站 | 天天干91 | 中国一级免费毛片 | 亚欧在线免费 | 亚洲精品夜色 |