衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三種最常用的特征檢測(cè)與匹配算法總結(jié)

新機(jī)器視覺(jué) ? 來(lái)源:計(jì)算機(jī)視覺(jué)工坊 ? 2023-06-19 11:27 ? 次閱讀

作者:計(jì)算機(jī)視覺(jué)@一杯紅茶|來(lái)源:計(jì)算機(jī)視覺(jué)工坊

我們都知道特征檢測(cè)和匹配是計(jì)算機(jī)視覺(jué)領(lǐng)域中的重要任務(wù),它們?cè)谠S多應(yīng)用中發(fā)揮著關(guān)鍵作用,比如SLAM、SFM、AR、VR等許多算法都需要穩(wěn)定精確的特征檢測(cè)和匹配。

特征檢測(cè)算法的意義在于從圖像或視頻中提取出具有獨(dú)特性質(zhì)的特征點(diǎn),這些特征點(diǎn)可以代表圖像中的關(guān)鍵信息。這些特征點(diǎn)通常具有旋轉(zhuǎn)、尺度和光照變化的不變性,使得它們?cè)趫D像的不同位置和角度下都能夠被準(zhǔn)確地檢測(cè)到。

特征匹配算法的意義在于將兩個(gè)或多個(gè)圖像中的特征點(diǎn)進(jìn)行對(duì)應(yīng),以實(shí)現(xiàn)圖像間的關(guān)聯(lián)和匹配。通過(guò)將特征點(diǎn)進(jìn)行匹配,可以進(jìn)行目標(biāo)跟蹤、圖像配準(zhǔn)、三維重建等任務(wù)。

目前個(gè)人認(rèn)為特征檢測(cè)和匹配的研究點(diǎn)包括但不限于以下幾個(gè)方面:

1.特征點(diǎn)檢測(cè)算法的設(shè)計(jì)和改進(jìn),提高特征點(diǎn)的魯棒性和準(zhǔn)確性。

2.特征描述子的設(shè)計(jì)和優(yōu)化,提高特征點(diǎn)的區(qū)分度和匹配性能。

3.多尺度和多模態(tài)特征檢測(cè)與匹配,適應(yīng)不同尺度、視角和傳感器條件下的圖像數(shù)據(jù)。

4.大規(guī)模特征點(diǎn)檢測(cè)和匹配算法,用于處理大規(guī)模圖像數(shù)據(jù)庫(kù)或視頻流。

5.深度學(xué)習(xí)在特征檢測(cè)和匹配中的應(yīng)用,如使用卷積神經(jīng)網(wǎng)絡(luò)提取圖像特征和進(jìn)行匹配。

特征檢測(cè)和匹配的應(yīng)用廣泛,包括但不限于以下幾個(gè)方面:

1.目標(biāo)識(shí)別和跟蹤:通過(guò)檢測(cè)和匹配圖像中的特征點(diǎn),可以實(shí)現(xiàn)目標(biāo)在視頻中的跟蹤和定位,如自動(dòng)駕駛中的目標(biāo)識(shí)別和跟蹤。

2.圖像配準(zhǔn)和拼接:通過(guò)匹配圖像中的特征點(diǎn),可以將多幅圖像進(jìn)行配準(zhǔn)和拼接,生成全景圖像或三維重建模型。

3.增強(qiáng)現(xiàn)實(shí)(AR)和虛擬現(xiàn)實(shí)(VR):特征檢測(cè)和匹配可用于將虛擬對(duì)象與真實(shí)世界進(jìn)行對(duì)齊和融合,實(shí)現(xiàn)更逼真的AR和VR體驗(yàn)。

4.圖像檢索和分類(lèi):通過(guò)匹配圖像中的特征點(diǎn),可以對(duì)圖像進(jìn)行相似性搜索和分類(lèi),用于圖像檢索和內(nèi)容識(shí)別。

5.三維重建和建模:通過(guò)匹配多個(gè)視角的圖像中的特征點(diǎn),可以進(jìn)行三維重建和場(chǎng)景建模,用于計(jì)算機(jī)輔助設(shè)計(jì)、虛擬現(xiàn)實(shí)等領(lǐng)域。

6.視頻處理和分析:特征檢測(cè)和匹配在視頻處理中可以用于運(yùn)動(dòng)估計(jì)、目標(biāo)跟蹤、動(dòng)作識(shí)別等任務(wù)。

所以,本篇文章針對(duì)不同的實(shí)際應(yīng)用需求,對(duì)三種特征檢測(cè)和匹配算法進(jìn)行總結(jié)并進(jìn)行代碼實(shí)踐:

1.最傳統(tǒng)的且應(yīng)用最為廣泛的SIFT特征檢測(cè)匹配算法。

2.速度和精度之間的平衡,注重實(shí)時(shí)性的SLAM中常用的ORB特征檢測(cè)和匹配算法。

3.最新且效果很好的基于深度學(xué)習(xí)的特征檢測(cè)和匹配算法SuperPoint+SuperGlue。

1.SIFT特征檢測(cè)和匹配算法

關(guān)于SIFT的算法原理及解釋網(wǎng)上有很多資料,如果想深入理解還可以找來(lái)原論文讀一讀,所以這里就簡(jiǎn)單介紹下SIFT特征檢測(cè)和匹配算法。

SIFT是找到圖像中的一些“穩(wěn)定點(diǎn)”,這些點(diǎn)是一些十分突出的點(diǎn),比如角點(diǎn)、邊緣點(diǎn)、暗區(qū)域的亮點(diǎn)以及亮區(qū)域的點(diǎn),其算法假設(shè)兩幅圖像中有相同的景物,那么使用某種方法分別提取各自的穩(wěn)定點(diǎn),這些點(diǎn)之間會(huì)有相互對(duì)應(yīng)的匹配點(diǎn)。

SIFT算法找穩(wěn)定點(diǎn)的方法是找灰度圖的局部最值,由于數(shù)字圖像是離散的,想求導(dǎo)和求最值這些操作都是使用濾波器,而濾波器是有尺寸大小的,使用同一尺寸的濾波器對(duì)兩幅包含有不同尺寸的同一物體的圖像求局部最值將有可能出現(xiàn)一方求得最值而另一方卻沒(méi)有的情況,SIFT的精妙之處在于采用圖像金字塔的方法解決這一問(wèn)題,我們可以把兩幅圖像想象成是連續(xù)的,分別以它們作為底面作四棱錐,就像金字塔,那么每一個(gè)截面與原圖像相似,那么兩個(gè)金字塔中必然會(huì)有包含大小一致的物體的無(wú)窮個(gè)截面,但應(yīng)用只能是離散的,所以我們只能構(gòu)造有限層,層數(shù)越多當(dāng)然越好,但處理時(shí)間會(huì)相應(yīng)增加,層數(shù)太少不行,因?yàn)橄蛳虏蓸拥慕孛嬷锌赡苷也坏匠叽绱笮∫恢碌膬蓚€(gè)物體的圖像。有了圖像金字塔就可以對(duì)每一層求出局部最值,但是這樣的穩(wěn)定點(diǎn)數(shù)目將會(huì)很多,所以需要使用某種方法抑制去除一部分點(diǎn),但又使得同一尺度下的穩(wěn)定點(diǎn)得以保存。

這里用C++Python各自實(shí)現(xiàn)一遍:

C++版本:

這里需要自己安裝配置opencv3哈,很簡(jiǎn)單。安裝鏈接:https://blog.csdn.net/qq_43193873/article/details/126144636

在ubuntu20.04LTS下編譯執(zhí)行,首先是CMakeLists.txt的編寫(xiě)

cmake_minimum_required(VERSION2.8)

set(CMAKE_BUILD_TYPEDebug)
set(DCMAKE_BUILD_TYPEDebug)

project(KeyPointsExtractionAndMatche)

find_package(OpenCV3REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

##CUDA(可選擇,SIFT可以進(jìn)行GPU加速)
#FIND_PACKAGE(CUDA)
#IF(CUDA_FOUND)
#set(EXTRA_INC_DIRS
#${CUDA_INCLUDE_DIRS}
#${CUDA_SDK_INCLUDE_DIR}
#)
#cuda_include_directories(${EXTRA_INC_DIRS}${CMAKE_CURRENT_BINARY_DIR})
#set(EXTRA_LIBRARIES
#${CUDA_LIBS}
#${CUDA_cublas_LIBRARY}
#)
#ENDIF(CUDA_FOUND)

add_executable(KeyPointsExtractionAndMatchemain.cpp)

target_link_libraries(KeyPointsExtractionAndMatche${OpenCV_LIBS})

代碼:

#include
#include
#include

#include
#include
#include


usingnamespacestd;

intmain()
{
//圖像名,自己實(shí)踐時(shí)替換成自己的路徑
stringimage_name1="/home/ccy/code_test/img1.jpg";
stringimage_name2="/home/ccy/code_test/img2.jpg";

//先讀一個(gè)彩色圖像用于后續(xù)繪制特征點(diǎn)匹配對(duì)
cv::Matcolor_img1=cv::imread(image_name1,1);
cv::Matcolor_img2=cv::imread(image_name2,1);

//將圖像轉(zhuǎn)換為灰度圖像,用于SIFT特征提取和匹配
cv::Matgray_img1=cv::imread(image_name1,0);
cv::Matgray_img2=cv::imread(image_name2,0);

//計(jì)算SIFT特征檢測(cè)和匹配的時(shí)間
doublestart=static_cast(cv::getTickCount());
//提取兩幅圖像的SIFT特征點(diǎn)并篩選出匹配的特征點(diǎn)
vectorkeypoints1,keypoints2;
cv::Matdescriptors1,descriptors2;
cv::Ptrdetector=cv::create();
cv::Ptrdescriptor=cv::create();
cv::Ptrmatcher=cv::create("BruteForce");

//----------------------------------------------------------------------------------------------------//
//opencv3里提供了兩種匹配算法,分別是BruteForce和FlannBased,BruteForce是暴力匹配,F(xiàn)lannBased是基于近似最近鄰的匹配。
//BruteForce:通過(guò)計(jì)算兩個(gè)特征描述子之間的歐氏距離或其他相似性度量來(lái)確定匹配程度。
//BruteForce_L1:這種匹配類(lèi)型使用L1范數(shù)(曼哈頓距離)作為特征描述子之間的距離度量方式。L1范數(shù)是將兩個(gè)向量各個(gè)對(duì)應(yīng)元素的差的絕對(duì)值求和作為距離的度量方式。
//BruteForce_Hamming:這種匹配類(lèi)型使用漢明距離作為特征描述子之間的距離度量方式。漢明距離是將兩個(gè)向量各個(gè)對(duì)應(yīng)元素的差的絕對(duì)值求和作為距離的度量方式。
//BruteForce_HammingLUT:這種匹配類(lèi)型使用漢明距離作為特征描述子之間的距離度量方式。漢明距離是將兩個(gè)向量各個(gè)對(duì)應(yīng)元素的差的絕對(duì)值求和作為距離的度量方式。這種匹配類(lèi)型使用了查找表(LUT)來(lái)加速漢明距離的計(jì)算。
//BruteForce_SL2:這種匹配類(lèi)型使用平方歐氏距離作為特征描述子之間的距離度量方式。平方歐氏距離是將兩個(gè)向量各個(gè)對(duì)應(yīng)元素的差的平方求和作為距離的度量方式。
//FlannBased:基于近似最近鄰的匹配,使用快速最近鄰搜索包(FLANN)來(lái)計(jì)算。
//----------------------------------------------------------------------------------------------------//

detector->detect(gray_img1,keypoints1);
detector->detect(gray_img2,keypoints2);

descriptor->compute(gray_img1,keypoints1,descriptors1);
descriptor->compute(gray_img2,keypoints2,descriptors2);

//匹配
vectormatches;
matcher->match(descriptors1,descriptors2,matches);
//篩選匹配點(diǎn)
doublemin_dist=10000,max_dist=0;
//找出所有匹配之間的最小距離和最大距離,即是最相似的和最不相似的兩組點(diǎn)之間的距離
for(inti=0;imax_dist)max_dist=dist;
}
cout<<"--?Max?dist?:?"<filteredMatches;
for(inti=0;i

結(jié)果:

689755a4-0c4b-11ee-962d-dac502259ad0.png

Python實(shí)現(xiàn):

importcv2

#讀取彩色圖像
image1_color=cv2.imread('/home/ccy/code_test/img1.jpg',1)
image2_color=cv2.imread('/home/ccy/code_test/img2.jpg',1)

#讀取灰度圖像
image1=cv2.imread('/home/ccy/code_test/img1.jpg',0)
image2=cv2.imread('/home/ccy/code_test/img2.jpg',0)

#計(jì)算SIFT特征檢測(cè)和匹配的時(shí)間
start=cv2.getTickCount()
#創(chuàng)建SIFT對(duì)象
sift=cv2.SIFT_create()

#檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述子
keypoints1,descriptors1=sift.detectAndCompute(image1,None)
keypoints2,descriptors2=sift.detectAndCompute(image2,None)

#創(chuàng)建FLANN匹配器
flann=cv2.FlannBasedMatcher()

#進(jìn)行特征匹配
matches=flann.knnMatch(descriptors1,descriptors2,k=2)

#篩選匹配結(jié)果
good_matches=[]
form,ninmatches:
ifm.distance

結(jié)果:

68af281e-0c4b-11ee-962d-dac502259ad0.png

可以看出FLANN匹配效果還是要比Brute-Force暴力匹配要好很多,速度也更快。

ORB特征檢測(cè)和匹配算法:

ORB(Oriented FAST and Rotated BRIEF)結(jié)合了FAST角點(diǎn)檢測(cè)和BRIEF特征描述子,具有快速、魯棒和旋轉(zhuǎn)不變性的特點(diǎn)。

其中FAST(Features from Accelerated Segment Test)角點(diǎn)檢測(cè)算法通過(guò)比較像素點(diǎn)與其周?chē)徲蛳袼攸c(diǎn)的灰度值來(lái)判斷該點(diǎn)是否為角點(diǎn)。通過(guò)FAST角點(diǎn)檢測(cè),ORB能夠快速而準(zhǔn)確地檢測(cè)出具有穩(wěn)定性和重復(fù)性的關(guān)鍵點(diǎn)。BRIEF(Binary Robust Independent Elementary Features)特征描述子來(lái)表示關(guān)鍵點(diǎn)的局部特征。BRIEF特征描述子將關(guān)鍵點(diǎn)周?chē)南袼貙?duì)進(jìn)行二進(jìn)制比較,并生成一個(gè)定長(zhǎng)的二進(jìn)制描述子,用于描述關(guān)鍵點(diǎn)的局部特征。這種二進(jìn)制描述子具有較小的存儲(chǔ)空間和快速的匹配速度。

ORB算法具有旋轉(zhuǎn)不變性,這意味著它能夠檢測(cè)和匹配旋轉(zhuǎn)變化后的關(guān)鍵點(diǎn)。為了實(shí)現(xiàn)旋轉(zhuǎn)不變性,ORB在角點(diǎn)檢測(cè)過(guò)程中計(jì)算關(guān)鍵點(diǎn)的方向,并在生成描述子時(shí)根據(jù)關(guān)鍵點(diǎn)的方向進(jìn)行旋轉(zhuǎn)。這樣,即使圖像發(fā)生旋轉(zhuǎn),ORB算法仍然能夠正確地匹配關(guān)鍵點(diǎn)。

ORB算法可以使用暴力匹配(Brute-Force)或近似最近鄰匹配(FLANN)進(jìn)行特征匹配。暴力匹配方法通過(guò)計(jì)算特征描述子之間的歐氏距離或漢明距離來(lái)確定匹配程度。近似最近鄰匹配方法使用FLANN(快速最近鄰搜索庫(kù))算法進(jìn)行近似的最近鄰搜索,以加速匹配過(guò)程。

C++實(shí)踐代碼:

#include
#include
#include

#include
#include
#include


usingnamespacestd;
intmain()
{
//讀取彩色圖像
cv::Matimage1_color=cv::imread("/home/ccy/code_test/img1.jpg",cv::IMREAD_COLOR);
cv::Matimage2_color=cv::imread("/home/ccy/code_test/img2.jpg",cv::IMREAD_COLOR);

//讀取灰度圖像
cv::Matimage1_gray=cv::imread("/home/ccy/code_test/img1.jpg",cv::IMREAD_GRAYSCALE);
cv::Matimage2_gray=cv::imread("/home/ccy/code_test/img2.jpg",cv::IMREAD_GRAYSCALE);

//計(jì)時(shí)
doublestart=static_cast(cv::getTickCount());

//創(chuàng)建ORB對(duì)象
cv::Ptrorb=cv::create();

//檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述子
std::vectorkeypoints1,keypoints2;
cv::Matdescriptors1,descriptors2;
orb->detectAndCompute(image1_gray,cv::noArray(),keypoints1,descriptors1);
orb->detectAndCompute(image2_gray,cv::noArray(),keypoints2,descriptors2);

//創(chuàng)建FLANN匹配器
//注意:BruteForce_HAMMING匹配類(lèi)型適用于二進(jìn)制特征描述子,如ORB(Oriented FAST and Rotated BRIEF)和Brief。
//這種匹配類(lèi)型使用漢明距離(Hamming distance)作為特征描述子之間的距離度量方式。漢明距離是計(jì)算兩個(gè)二進(jìn)制向量之間不同位的數(shù)量。
cv::Ptrmatcher=cv::BRUTEFORCE_HAMMING);

//進(jìn)行特征匹配
std::vectormatches;
matcher->match(descriptors1,descriptors2,matches);

//篩選匹配結(jié)果
std::vectorgoodMatches;
doubleminDist=100.0;
doublemaxDist=0.0;
for(inti=0;imaxDist)
maxDist=dist;
}
doublethresholdDist=0.6*maxDist;
for(inti=0;i

結(jié)果:68c4cbf6-0c4b-11ee-962d-dac502259ad0.png

python代碼實(shí)現(xiàn):

importcv2

#讀取彩色圖像
image1_color=cv2.imread('/home/ccy/code_test/img1.jpg',1)
image2_color=cv2.imread('/home/ccy/code_test/img2.jpg',1)

#讀取灰度圖像
image1_gray=cv2.imread('/home/ccy/code_test/img1.jpg',cv2.IMREAD_GRAYSCALE)
image2_gray=cv2.imread('/home/ccy/code_test/img2.jpg',cv2.IMREAD_GRAYSCALE)

#計(jì)時(shí)
start=cv2.getTickCount()

#創(chuàng)建ORB對(duì)象
orb=cv2.ORB_create()

#檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述子
keypoints1,descriptors1=orb.detectAndCompute(image1_gray,None)
keypoints2,descriptors2=orb.detectAndCompute(image2_gray,None)

#創(chuàng)建BFMatcher匹配器
bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True)

#進(jìn)行特征匹配
matches=bf.match(descriptors1,descriptors2)

#篩選匹配結(jié)果
matches=sorted(matches,key=lambdax:x.distance)#按距離升序排序
good_matches=matches[:50]#選擇前50個(gè)較好的匹配

end=cv2.getTickCount()
print('ORB匹配時(shí)間:',(end-start)/cv2.getTickFrequency(),'s')

#繪制匹配結(jié)果
result=cv2.drawMatches(image1_color,keypoints1,image2_color,keypoints2,good_matches,None,flags=2)

#保存結(jié)果
cv2.imwrite('ORB_Matches.jpg',result)

結(jié)果:

68dee554-0c4b-11ee-962d-dac502259ad0.png

從匹配質(zhì)量上看還是SIFT更好,這是沒(méi)有疑問(wèn)的,但是速度比SIFT快一個(gè)數(shù)量級(jí)要。

Super Point + Super Glue特征檢測(cè)和匹配算法:

Super Point論文:

D Detone, Malisiewicz T , Rabinovich A . SuperPoint: Self-Supervised Interest Point Detection and Description[C]// 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition Workshops (CVPRW). IEEE, 2018.

項(xiàng)目地址:https://github.com/magicleap/SuperPointPretrainedNetwork

Super Glue論文:

P. -E. Sarlin, D. DeTone, T. Malisiewicz and A. Rabinovich, "SuperGlue: Learning Feature Matching With Graph Neural Networks," 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), Seattle, WA, USA, 2020, pp. 4937-4946, doi: 10.1109/CVPR42600.2020.00499.

項(xiàng)目地址:https://github.com/magicleap/SuperGluePretrainedNetwork

簡(jiǎn)單介紹下這兩個(gè)算法,具體的網(wǎng)上有解釋?zhuān)€可以看原論文。

首先SuperPoint,采用了自監(jiān)督的方法提取特征點(diǎn),設(shè)計(jì)了一個(gè)由特征點(diǎn)檢測(cè)器生成的具有偽真值的數(shù)據(jù)集,而非大量的人工標(biāo)記。為了得到偽真值,首先在大量的虛擬數(shù)據(jù)集上訓(xùn)練了一個(gè)全卷積網(wǎng)絡(luò),這些虛擬數(shù)據(jù)集由一些基本圖形組成,例如線(xiàn)段、三角形、矩形和立方體等,這些基本圖形具有無(wú)爭(zhēng)議的特征點(diǎn)位置;這樣pre-trained得到的檢測(cè)網(wǎng)絡(luò)稱(chēng)之為MagicPoint,它在虛擬場(chǎng)景中檢測(cè)特征點(diǎn)的性能明顯優(yōu)于傳統(tǒng)方式,但是在真實(shí)的復(fù)雜場(chǎng)景中表現(xiàn)不佳,因此提出了一種多尺度多變換的方法Homographic Adaptation,通過(guò)對(duì)圖像進(jìn)行多次不同的尺度或角度變換來(lái)幫助網(wǎng)絡(luò)能夠在不同視角、不同尺度觀(guān)測(cè)到特征點(diǎn)。

68fa31a6-0c4b-11ee-962d-dac502259ad0.png

然后是SuperGlue,他是一種能夠同時(shí)進(jìn)行特征匹配以及濾除外點(diǎn)的網(wǎng)絡(luò),其中特征匹配是通過(guò)求解可微分最優(yōu)化轉(zhuǎn)移問(wèn)題( optimal transport problem)來(lái)解決,損失函數(shù)由GNN來(lái)構(gòu)建;基于注意力機(jī)制提出了一種靈活的內(nèi)容聚合機(jī)制,這使得SuperGlue能夠同時(shí)感知潛在的3D場(chǎng)景以及進(jìn)行特征匹配。

6908f100-0c4b-11ee-962d-dac502259ad0.png

代碼實(shí)踐:這里介紹一個(gè)常用的特征檢測(cè)、匹配、重建、定位工具包,hloc,里面集成里很多常用的特征檢測(cè)和匹配、重建、定位算法,我們直接拿他的庫(kù)來(lái)進(jìn)行super point和super glue特征檢測(cè)和匹配。

項(xiàng)目地址:https://github.com/cvg/Hierarchical-Localization

首先配置hloc,其需要Python >=3.7 PyTorch >=1.1

gitclone--recursivehttps://github.com/cvg/Hierarchical-Localization/
cdHierarchical-Localization/
python-mpipinstall-e.

代碼:

fromhlocimportextract_features,match_features
fromtqdmimporttqdm
frompathlibimportPath
importargparse
fromhloc.utils.parsersimportparse_retrieval
fromhloc.utils.ioimportget_keypoints,get_matches

importcv2
importnumpyasnp

importtime

if__name__=='__main__':

#添加參數(shù),在運(yùn)行時(shí)輸入自己的--base_dir,比如我的運(yùn)行代碼是'pythonSPSGtest.py--base_dir/home/ccy/code_test'
parser=argparse.ArgumentParser()
parser.add_argument('--base_dir',type=Path,required=True)
args=parser.parse_args()

#圖像所在路徑
images=args.base_dir/'images/'
#輸出路徑
outputs=args.base_dir/'output/'
#要匹配的圖像對(duì)所在路徑,里面每行的內(nèi)容為:img1name img2name
loc_pairs=args.base_dir/'loc_pairs.txt'
#計(jì)時(shí)
start=time.time()
#提取特征和匹配特征的配置文件
feature_conf=extract_features.confs['superpoint_max']
matcher_conf=match_features.confs['superglue']


#提取特征和匹配特征,利用預(yù)訓(xùn)練模型
features=extract_features.main(feature_conf,images,outputs)
loc_matches=match_features.main(matcher_conf,loc_pairs,feature_conf['output'],outputs)
retrieval_dict=parse_retrieval(loc_pairs)

end=time.time()
print('time:',end-start)

#遍歷每一對(duì)圖像,畫(huà)出匹配點(diǎn)對(duì)和匹配線(xiàn)
forimg1intqdm(retrieval_dict):
img2=retrieval_dict[img1]
forimg2nameinimg2:
matches,_=get_matches(loc_matches,img1,img2name)
kpts0=get_keypoints(features,img1)
kpts1=get_keypoints(features,img2name)
#找出匹配點(diǎn)對(duì)的坐標(biāo)
kpts0=kpts0[matches[:,0]]
kpts1=kpts1[matches[:,1]]
#畫(huà)出匹配點(diǎn)對(duì)
img1=cv2.imread(str(images/img1))
img2=cv2.imread(str(images/img2name))
foriinrange(len(kpts0)):
cv2.circle(img1,(int(kpts0[i][0]),int(kpts0[i][1])),2,(0,0,255),-1)
cv2.circle(img2,(int(kpts1[i][0]),int(kpts1[i][1])),2,(0,0,255),-1)

img3=np.zeros((max(img1.shape[0],img2.shape[0]),img1.shape[1]+img2.shape[1],3),np.uint8)
img3[:img1.shape[0],:img1.shape[1]]=img1
img3[:img2.shape[0],img1.shape[1]:]=img2
#畫(huà)出所有匹配線(xiàn)
foriinrange(len(kpts0)):
cv2.line(img3,(int(kpts0[i][0]),int(kpts0[i][1])),(int(kpts1[i][0])+img1.shape[1],int(kpts1[i][1])),(0,255,0),1)

cv2.imwrite('/home/ccy/code_test/result.jpg',img3)

結(jié)果:

6929b5f2-0c4b-11ee-962d-dac502259ad0.png

可以看到SP+SG的結(jié)果又快又準(zhǔn)!


審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4630

    瀏覽量

    93351
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7536

    瀏覽量

    88638
  • 特征檢測(cè)
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5638
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5513

    瀏覽量

    121546

原文標(biāo)題:三種最常用的特征檢測(cè)與匹配算法總結(jié)實(shí)踐!

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    算法三種結(jié)構(gòu)介紹

    嵌入式學(xué)習(xí)日記2018.11.62018.11.16理論學(xué)習(xí)階段計(jì)算機(jī)科學(xué)導(dǎo)論(原書(shū)第二版)第8章 算法學(xué)到的新知識(shí)1算法三種結(jié)構(gòu):順序、判斷(選擇)和重復(fù)(循環(huán))2常用
    發(fā)表于 11-08 07:12

    單片機(jī)系統(tǒng)中最常用三種通信協(xié)議

    UART、 I2C 和 SPI 是單片機(jī)系統(tǒng)中最常用三種通信協(xié)議。1、初步介紹SPI 是一高速的、全雙工、同步通信總線(xiàn),標(biāo)準(zhǔn)的 SPI 也僅僅使用 4 個(gè)引腳,常用于單片機(jī)和 EE
    發(fā)表于 11-18 09:22

    單片機(jī)系統(tǒng)中最常用三種通信協(xié)議是什么?

    單片機(jī)系統(tǒng)中最常用三種通信協(xié)議是什么?
    發(fā)表于 02-17 06:03

    基于HALCON的模板匹配方法總結(jié)

    了,需要可以去下載。 德國(guó)MVTec公司開(kāi)發(fā)地HALCON機(jī)器視覺(jué)開(kāi)發(fā)軟件,提供了許多地功能,在這里我主要學(xué)習(xí)和研究了其中地形狀匹配算法和流程。HDevelop開(kāi)發(fā)環(huán)境中提供地匹配地方法主要有
    發(fā)表于 09-19 06:13

    基于SIFT的視圖像特征匹配算法

    提出一基于SIFT的視圖像特征匹配算法。采用SIFT算法對(duì)
    發(fā)表于 04-18 09:49 ?24次下載

    基于SIFT描述子的特征匹配算法

    為了克服傳統(tǒng)的局部特征匹配算法對(duì)噪聲和圖像灰度非線(xiàn)性變換敏感的不足,提出了基于SIFT(Scale Invariant Feature Transform)描述算子的特征
    發(fā)表于 12-07 11:03 ?29次下載

    基于顏色和SURF特征的混合匹配算法研究

    針對(duì)傳統(tǒng)的SURF算法未使用圖像的顏色信息,提出了一基于顏色信息和SURF特征相結(jié)合的混合圖像匹配算法
    發(fā)表于 12-24 16:05 ?15次下載

    數(shù)控機(jī)床插補(bǔ)算法最常用三種算法源碼

    菱PLC(可編程邏輯控制器)編程實(shí)例項(xiàng)目例程——數(shù)控機(jī)床插補(bǔ)算法最常用三種算法源碼
    發(fā)表于 11-08 17:32 ?44次下載

    基于區(qū)域檢測(cè)特征匹配方法設(shè)計(jì)研究

    針對(duì)傳統(tǒng)特征匹配算法在實(shí)際的應(yīng)用中存在搜索范圍廣、無(wú)關(guān)特征點(diǎn)多等問(wèn)題,提出一基于顯著性區(qū)域檢測(cè)
    發(fā)表于 10-28 11:01 ?0次下載

    改進(jìn)的雙向SIFT特征匹配算法

    以基于圖像序列攝像機(jī)自標(biāo)定為基礎(chǔ),針對(duì)尺度不變特征轉(zhuǎn)換SIFT算法匹配率高且運(yùn)行效率低的問(wèn)題,提出一改進(jìn)的雙向SIFT特征
    發(fā)表于 12-06 15:00 ?1次下載
    一<b class='flag-5'>種</b>改進(jìn)的雙向SIFT<b class='flag-5'>特征</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>

    改進(jìn)ORB的特征點(diǎn)匹配算法

    針對(duì)定向二進(jìn)制簡(jiǎn)單描述符( ORB)算法不具備尺度不變性的問(wèn)題,提出一結(jié)合快速魯棒性特征( SURF)算法和ORB的改進(jìn)算法。首先,利用H
    發(fā)表于 12-15 17:15 ?21次下載

    開(kāi)關(guān)模式電源電流檢測(cè)三種常用檢測(cè)方法的詳細(xì)資料介紹

    開(kāi)關(guān)模式電源有三種常用電流檢測(cè)方法是:使用檢測(cè)電阻,使用MOSFET RDS(ON),以及使用電感的直流電阻(DCR)。每種方法都有優(yōu)點(diǎn)和缺點(diǎn),選擇
    的頭像 發(fā)表于 07-03 16:09 ?1.4w次閱讀
    開(kāi)關(guān)模式電源電流<b class='flag-5'>檢測(cè)</b>的<b class='flag-5'>三種</b><b class='flag-5'>常用</b><b class='flag-5'>檢測(cè)</b>方法的詳細(xì)資料介紹

    三種最常用的MEMS制造技術(shù)解析

    MEMS器件利用半導(dǎo)體加工技術(shù)來(lái)制造維機(jī)械結(jié)構(gòu),三種最常用的MEMS制造技術(shù)包括體微加工(Bulk Micro Machining)、表面微加工(Surface Micro Machining)和LIGA。
    發(fā)表于 07-29 17:42 ?7866次閱讀

    開(kāi)關(guān)電源最常見(jiàn)的三種結(jié)構(gòu)

    開(kāi)關(guān)電源最常見(jiàn)的三種結(jié)構(gòu)布局是降壓(buck)、升壓(boost)和降壓–升壓(buck-boost),這三種布局都不是相互隔離的。
    的頭像 發(fā)表于 03-11 17:00 ?8508次閱讀

    基于計(jì)算機(jī)視覺(jué)領(lǐng)域中的特征檢測(cè)匹配研究

    ? 我們都知道特征檢測(cè)匹配是計(jì)算機(jī)視覺(jué)領(lǐng)域中的重要任務(wù),它們?cè)谠S多應(yīng)用中發(fā)揮著關(guān)鍵作用,比如SLAM、SFM、AR、VR等許多算法都需要穩(wěn)定精確的
    的頭像 發(fā)表于 06-16 16:48 ?1116次閱讀
    基于計(jì)算機(jī)視覺(jué)領(lǐng)域中的<b class='flag-5'>特征</b><b class='flag-5'>檢測(cè)</b>和<b class='flag-5'>匹配</b>研究
    网上百家乐信誉| 太阳城娱乐城去大丰收娱乐| 百家乐赌博筹| 威尼斯人娱乐场官网 | 百家乐真人斗地主| 大发888娱乐场怎么才能赢到钱| 久久棋牌评测| 百家乐官网学院教学视频| 石河子市| 至尊百家乐官网娱乐| 风水97年农历6月24八字| 百家乐稳一点的押法| 百家乐电影网| 百家乐官网网络公式| 百家乐官网网页qq| 百家乐起步多少| 澳门百家乐手机软件| 广州百家乐官网酒店用品制造有限公司 | 网上百家乐信誉| 鄂州市| 迷你百家乐论坛| 迪威百家乐官网现场| 肯博百家乐官网的玩法技巧和规则| 百家乐赌博策略论坛| 真人百家乐官网软件博彩吧| 百家乐心态研究| 百家乐官网庄闲下载| 百家乐稳赢投资法| 济州岛娱乐场cns| 网络百家乐的破解| 百家乐官网能战胜吗| 百家乐补第三张牌规则| 新世纪娱乐| 星际百家乐娱乐城| 百家乐官网怎么发牌| 岚皋县| 千亿国际| 百家乐客户端下载| 百家乐官网软件官方| 大发888游戏平台dafa 888 gw| 澳门百家乐备用网址|