欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python?OpenCV實(shí)現(xiàn)圖像特征匹配示例詳解

 更新時(shí)間:2023年04月25日 10:13:33   作者:uncle_ll  
這篇文章主要為大家介紹了python?OpenCV實(shí)現(xiàn)圖像特征匹配示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

目標(biāo)

在本章中,將學(xué)習(xí):

  • 如何將一個(gè)圖像中的特征與其他圖像進(jìn)行匹配
  • 在OpenCV中使用Brute-Force匹配器和FLANN匹配器

Brute-Force匹配器的基礎(chǔ)

暴力匹配器很簡(jiǎn)單。它使用第一組中一個(gè)特征的描述符,并使用一些距離計(jì)算將其與第二組中的所有其他特征匹配。并返回最接近的一個(gè)。 對(duì)于BF匹配器,首先必須使cv.BFMatcher() 創(chuàng)建BFMatcher對(duì)象。 它需要兩個(gè)可選參數(shù):

  • 第一個(gè)參數(shù)是normType,它指定要使用的距離測(cè)量。默認(rèn)情況下為 cv2.NORM_L2 。對(duì)于SIFT, SURF等(也有 cv2.NORM_L1)很有用。 對(duì)于基于二進(jìn)制字符串的描述符,例如ORB,BRIEF,BRISK等,應(yīng)使用cv2.NORM_HAMMING ,該函數(shù)使用漢明距離作為度量。如果ORB使用WTA_K == 3或 4,則應(yīng)使用 cv.NORM_HAMMING2。
  • 第二個(gè)參數(shù)是布爾變量,即crossCheck,默認(rèn)情況下為false。如果為true,則Matcher僅返回具有值(i,j)(i,j)(i,j)的那些匹配項(xiàng),以使集合A中的第i個(gè)描述符具有集合B中的第j個(gè)描述符為最佳匹配,反之亦然。即兩組中的兩個(gè)特征應(yīng)彼此匹配。它提供了一致的結(jié)果,并且是D.Lowe在SIFT論文中提出的比率測(cè)試的良好替代方案。 創(chuàng)建之后,兩個(gè)重要的方法是
  • BFMatcher.match(): 返回最佳匹配
  • BFMatcher.knnMatch() : 返回k個(gè)最佳匹配,其中k由用戶指定。 當(dāng)需要對(duì)此做其他工作時(shí),它可能會(huì)很有用。 就像使用cv.drawKeypoints()繪制關(guān)鍵點(diǎn)一樣,cv.drawMatches()可以幫助繪制出匹配項(xiàng)。它水平堆疊兩張圖像,并繪制從第一張圖像到第二張圖像的線,以顯示最佳匹配。還有

cv.drawMatchesKnn繪制所有k個(gè)最佳匹配。如果 k=2 ,它將為每個(gè)關(guān)鍵點(diǎn)繪制兩條匹配線。 因此,如果要選擇性地繪制,則必須通過掩碼。 下面來看一個(gè)SIFT和ORB的示例(兩者都使用不同的距離測(cè)量)。

使用ORB描述符進(jìn)行Brute-Force匹配

下面將看到一個(gè)有關(guān)如何在兩個(gè)圖像之間匹配特征的簡(jiǎn)單示例。在這種情況下,有一 個(gè)queryImage和trainImage。將嘗試使用特征匹配在trainImage中找到queryImage。(圖像 是/samples/data/box.png和/samples/data/box_in_scene.png) 圖像素材可以去github上找github.com/opencv/open…

使用ORB描述符來匹配特征。因此,從加載圖像,查找描述符等開始。之后創(chuàng)建一個(gè)距離測(cè)量值為cv2.NORM_HAMMING的BFMatcher對(duì)象(因?yàn)槭褂玫氖荗RB),并且啟用了CrossCheck以獲得更好的結(jié)果。然后,使用Matcher.match()方法來獲取兩個(gè)圖像中的最佳匹配。按照距離的升序?qū)λ鼈冞M(jìn)行排序,以使最佳匹配(低距離) 排在前面。然后我們只抽出前10的匹配(只是為了提高可見度。您可以根據(jù)需要增加它)

# create bfmatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# match descriptors
matches = bf.match(des1, des2)
# sort them in the order of their distance
matches = sorted(matches, key=lambda x: x.distance)
# draw first 10 matches
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.show()

結(jié)果如下:

什么是Matcher對(duì)象?

matchs = bf.match(des1,des2) 的結(jié)果DMatch對(duì)象的列表。該DMatch對(duì)象具有以下屬性:

  • DMatch.distance-描述符之間的距離,越低越好
  • DMatch.trainIdx-train描述符中的描述符索引
  • DMatch.queryIdx-query描述符中的描述符索引
  • DMatch.imgIdx-train 圖像的索引。

帶有SIFT描述符和比例測(cè)試的Brute-Force匹配

這次,將使用BFMatcher.knnMatch()獲得k個(gè)最佳匹配。在此示例中,將k = 2,以便可以應(yīng)用D.Lowe在他的論文中闡述的比例測(cè)試。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('box2.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE)
# initate sift detector
sift = cv2.xfeatures2d.SIFT_create()
# find teh keypoints and descriptors with sift
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# apply ratio test
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])
# cv.drawMatchsKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.show()

查看以下結(jié)果:

基于匹配器的FLANN

FLANN是近似最近鄰的快速庫(kù)。它包含一組算法,這些算法針對(duì)大型數(shù)據(jù)集中的快速最近鄰搜索和高維特征進(jìn)行了優(yōu)化。 對(duì)于大型數(shù)據(jù)集,它的運(yùn)行速度比BFMatcher快。我們將看到第二個(gè)基于FLANN的匹配器示例。 對(duì)于基于FLANN的匹配器,需要傳遞兩個(gè)字典,這些字典指定要使用的算法,其相關(guān)參數(shù)等。

  • 第一個(gè)是IndexParams。對(duì)于各種算法,要傳遞的信息在FLANN文檔中進(jìn)行了說明。概括來說,對(duì)于SIFT,SURF等算法,可以通過以下操作:
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)

當(dāng)使用ORB時(shí),可以參考下面。根據(jù)文檔建議使用帶注釋的值,但在某些情況下未提供必需的參數(shù)。其他值也可以正常工作。

 FLANN_INDEX_LSH = 6
 index_params = dict(
 	algorithm=FLANN_INDEX_LSH,
 	table_number=6,
 	key_size=12,
 	multi_probe_level=1)

第二個(gè)字典是SearchParams,它指定索引中的樹應(yīng)遞歸遍歷的次數(shù)。 較高的值可提供更好的精度,但也需要更多時(shí)間。如果要更改值,請(qǐng)傳遞 search_params = dict(checks = 100) 有了這些信息,就很容易。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('box2.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE)
# initiate sift detector
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with sift
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# FLANN params
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
# need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
# ratio test as per low's papre
for i, (m, n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        matchesMask[i] = [1, 0]
# draw
darw_params = dict(
    matchColor=(0, 255, 0),
    singlePointColor=(255, 0, 0),
    matchesMask=matchesMask,
    flags=cv2.DrawMatchesFlags_DEFAULT)
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **darw_params)
plt.imshow(img3)
plt.show()

查看以下結(jié)果

附加資源

以上就是python OpenCV實(shí)現(xiàn)圖像特征匹配示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python OpenCV圖像特征匹配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python爬取OPGG上英雄聯(lián)盟英雄勝率及選取率信息的操作

    Python爬取OPGG上英雄聯(lián)盟英雄勝率及選取率信息的操作

    這篇文章主要介紹了Python爬取OPGG上英雄聯(lián)盟英雄勝率及選取率信息的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python中ImportError錯(cuò)誤的詳細(xì)解決方法

    Python中ImportError錯(cuò)誤的詳細(xì)解決方法

    最近辛辛苦苦安裝完了python,最后再運(yùn)行的時(shí)候會(huì)出現(xiàn)錯(cuò)誤,所以這篇文章主要給大家介紹了關(guān)于Python中ImportError錯(cuò)誤的詳細(xì)解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 基于python的Paxos算法實(shí)現(xiàn)

    基于python的Paxos算法實(shí)現(xiàn)

    這篇文章主要介紹了基于python的Paxos算法實(shí)現(xiàn),理解一個(gè)算法最快,最深刻的做法,我覺著可能是自己手動(dòng)實(shí)現(xiàn),雖然項(xiàng)目中不用自己實(shí)現(xiàn),有已經(jīng)封裝好的算法庫(kù),供我們調(diào)用,我覺著還是有必要自己親自實(shí)踐一下,需要的朋友可以參考下
    2019-07-07
  • python3序列化與反序列化用法實(shí)例

    python3序列化與反序列化用法實(shí)例

    這篇文章主要介紹了python3序列化與反序列化用法,實(shí)例分析了Python3使用pickle模塊針對(duì)字符串進(jìn)行序列化操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • python3.6+selenium實(shí)現(xiàn)操作Frame中的頁(yè)面元素

    python3.6+selenium實(shí)現(xiàn)操作Frame中的頁(yè)面元素

    這篇文章主要為大家詳細(xì)介紹了python3.6+selenium實(shí)現(xiàn)操作Frame中的頁(yè)面元素,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 在Python程序和Flask框架中使用SQLAlchemy的教程

    在Python程序和Flask框架中使用SQLAlchemy的教程

    SQLAlchemy為Python程序與SQL語句之間建立了映射,是Python操作數(shù)據(jù)庫(kù)的利器,這里我們將來看在Python程序和Flask框架中使用SQLAlchemy的教程,需要的朋友可以參考下
    2016-06-06
  • python tkinter模塊的簡(jiǎn)單使用

    python tkinter模塊的簡(jiǎn)單使用

    這篇文章主要介紹了python tkinter模塊的簡(jiǎn)單使用,幫助大家更好的理解和學(xué)習(xí)使用python制作gui界面,感興趣的朋友可以了解下
    2021-04-04
  • python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例

    python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例

    這篇文章主要介紹了python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python多進(jìn)程間通信代碼實(shí)例

    python多進(jìn)程間通信代碼實(shí)例

    這篇文章主要介紹了python多進(jìn)程間通信代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python全面解析接口返回?cái)?shù)據(jù)

    python全面解析接口返回?cái)?shù)據(jù)

    這篇文章主要介紹了python接口返回?cái)?shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論