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

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

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

手寫圖像模板匹配算法在OpenCV中的實(shí)現(xiàn)

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 2024-11-11 10:12 ? 次閱讀

OpenCV中的模板匹配

OpenCV中的模板匹配是支持基于NCC相似度查找的,但是不是很好用,一個(gè)主要的原因是查找最大閾值,只能匹配一個(gè),自己比對(duì)閾值,又導(dǎo)致無法正確設(shè)定閾值范圍,所以問題很多。于是我重新寫了純Python版本的NCC圖像模板匹配的代碼實(shí)現(xiàn)了一個(gè)Python版本的,簡單易用,支持多尺度,跟多進(jìn)程并行!

主要思想

主要是基于NCC實(shí)現(xiàn)的像素相似度計(jì)算,這個(gè)OpenCV官方的模板匹配也有這中方式像素相似度計(jì)算支持,它的公式描述如下:

b454650e-904d-11ef-a511-92fbcf53809c.png

就是參照這個(gè)公式,然后基于OpenCV提供的積分圖計(jì)算函數(shù),實(shí)現(xiàn)了NCC相似度比較計(jì)算,值在0~1之間,1表示完全相似,0表示完全不相似。

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

我把整個(gè)部分搞成了一個(gè)類,調(diào)用的方法主要是run_match,就可以直接運(yùn)行,完成模板匹配。大體的功能跟OpenCV實(shí)現(xiàn)的模板匹配功能比較相似,改進(jìn)的地方就是比較方便的實(shí)現(xiàn)多個(gè)對(duì)象匹配的直接輸出Box框。該類完整的代碼實(shí)現(xiàn)如下:

importcv2ascv
importnumpyasnp
importtime
importconcurrent.futures

classNCCTemplateMatch:
def__init__(self,ref_imgs,target_imgs,scores,tpl_sums,tpl_sqr_sums,target_sums,target_sqr_sums):
self.ref_imgs=ref_imgs
self.target_imgs=target_imgs
self.scores=scores
self.tpls_sums=tpl_sums
self.tpls_sqsums=tpl_sqr_sums
self.target_sums=target_sums
self.target_sqsums=target_sqr_sums
self.nms_boxes=[]

defrun_match(self):
num_ps=min(6,len(self.ref_imgs))
#print("num_ps:",num_ps)
start=time.perf_counter()
withconcurrent.futures.ProcessPoolExecutor(num_ps)asexecutor:
matched=executor.map(self.ncc_run,self.ref_imgs,self.target_imgs,self.tpls_sums,self.tpls_sqsums,self.target_sums,self.target_sqsums,self.scores)
self.nms_boxes=list(matched)
end=time.perf_counter()
print(f'Finishedin{round(end-start,2)}seconds')

defncc_run(self,tpl_gray,target_gray,tpl_sum,tpl_sqsum,target_sum,target_sqsum,score):
print("runonce~~~~")
th,tw=tpl_gray.shape
min_step=max(1,min(th//16,tw//16))
h,w=target_gray.shape
sr=1/(th*tw)
t_s1=tpl_sum[th,tw]
t_s1_2=t_s1*t_s1*sr
t_s1_1=t_s1*sr
t_s2=tpl_sqsum[th,tw]
sum_t=np.sqrt(t_s2-t_s1_2)
row=0
boxes=[]
confidences=[]
whilerowscore:
boxes.append([col,row,tw,th])
confidences.append(float(ncc))
col+=tw//2
else:
col+=min_step
row+=min_step

#NMSProcess
nms_indices=cv.dnn.NMSBoxes(boxes,confidences,0.5,0.5)
det_boxes=[]
print(nms_indices)
foriinrange(len(nms_indices)):
rect_box=boxes[nms_indices[i]]
det_boxes.append(rect_box)
returndet_boxes

defget_block_sum(self,integal_img,x1,y1,x2,y2):
t1=integal_img[y1,x1]
t2=integal_img[y1,x2]
t3=integal_img[y2,x1]
t4=integal_img[y2,x2]
s=t4-t2-t3+t1
returns
相關(guān)的測試與調(diào)用代碼如下:
print("testncc......")
tpl_image=cv.imread("D:/images/llk_tpl.png")
target_image=cv.imread("D:/images/llk.jpg")

tpl_gray=cv.cvtColor(tpl_image,cv.COLOR_BGR2GRAY)
target_gray=cv.cvtColor(target_image,cv.COLOR_BGR2GRAY)
tpl_gray=np.float32(tpl_gray/255.0)
target_gray=np.float32(target_gray/255.0)
tpl_sum,tpl_sqsum=cv.integral2(tpl_gray)
t_sum,t_sqsum=cv.integral2(target_gray)
matcher=NCCTemplateMatch([tpl_gray],[target_gray],[0.85],
[tpl_sum],[tpl_sqsum],[t_sum],[t_sqsum])
matcher.run_match()
forrect_boxinmatcher.nms_boxes[0]:
cv.rectangle(target_image,(rect_box[0],rect_box[1]),
(rect_box[0]+rect_box[2],rect_box[1]+rect_box[3]),(0,0,255),2,8,0)
cv.imshow("result",target_image)
cv.waitKey(0)
cv.destroyAllWindows()
模板圖像:

b46f91a8-904d-11ef-a511-92fbcf53809c.png

運(yùn)行結(jié)果如下:

b4867990-904d-11ef-a511-92fbcf53809c.png

b4a731da-904d-11ef-a511-92fbcf53809c.png

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

    關(guān)注

    23

    文章

    4612

    瀏覽量

    92884
  • 圖像
    +關(guān)注

    關(guān)注

    2

    文章

    1084

    瀏覽量

    40461
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41347

原文標(biāo)題:只用半小時(shí) | OpenCV手寫圖像模板匹配算法

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是模板匹配?模板匹配的原理講解 圖像處理與模板匹配算法

    一:什么是模板匹配? OpenCV教程這樣解釋模板匹配
    的頭像 發(fā)表于 05-05 09:25 ?3.4w次閱讀
    什么是<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>?<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>的原理講解 <b class='flag-5'>圖像</b>處理與<b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>

    基于QT+OpenCv的目標(biāo)跟蹤算法實(shí)現(xiàn)

    目標(biāo)跟蹤算法作為一種有著非常廣泛的應(yīng)用的算法航空航天、智能交通、智能設(shè)備等領(lǐng)域有著非常廣泛的應(yīng)用。本系列博客將教大家410c開發(fā)板上基于linux操作系統(tǒng)環(huán)境,采用QT+
    發(fā)表于 09-21 10:42

    【觸覺智能 Purple Pi OH 開發(fā)板體驗(yàn)】四、(Ubuntu)OpenCV手寫數(shù)字識(shí)別

    ]#===============計(jì)算最佳匹配值及模板序號(hào)======================# matchValue用于存儲(chǔ)所有匹配值matchValue = []# 從images
    發(fā)表于 09-18 14:01

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

    一篇《基于HDevelop地形狀匹配算法參數(shù)地優(yōu)化研究》文章,總結(jié)了形狀匹配過程哪些參數(shù)影響到模板
    發(fā)表于 09-19 06:13

    openCV的庫自帶了模板匹配算法嗎?

    openCV的庫自帶了模板匹配算法
    發(fā)表于 10-10 06:48

    手寫數(shù)字識(shí)別的模板匹配方法源程序

    手寫數(shù)字識(shí)別的模板匹配
    發(fā)表于 01-02 19:43 ?73次下載

    基于模板匹配圖像跟蹤技術(shù)

    為了解決傳統(tǒng)模板匹配方法跟蹤圖像時(shí)遇到的問題,提出了在跟蹤過程采用變模板匹配的方法。該方法較好
    發(fā)表于 12-20 17:01 ?0次下載

    模板匹配

    OpenCV3編程入門》書本配套源代碼:模板匹配
    發(fā)表于 06-06 15:39 ?5次下載

    OpenCV3編程入門-源碼例程全集-模板匹配

    OpenCV3編程入門-源碼例程全集-模板匹配
    發(fā)表于 09-17 22:55 ?4次下載

    基于輪廓曲線的圖像匹配算法

    為了提高一鍵式檢測圖像匹配精度和速度,提出一種基于輪廓曲線的快速高精度圖像配準(zhǔn)算法:根據(jù)定義的圖像
    發(fā)表于 11-02 10:47 ?5次下載
    基于輪廓曲線的<b class='flag-5'>圖像</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>

    基于DSP和模板匹配算法的實(shí)時(shí)圖像跟蹤處理系統(tǒng)的優(yōu)化設(shè)計(jì)

    本文詳細(xì)介紹了基于高性能TigerSHARC DSP 處理模塊和模板匹配算法(templatematching)的實(shí)時(shí)圖像跟蹤處理系統(tǒng)的優(yōu)化設(shè)計(jì)方法;深入分析了SAD 操作
    發(fā)表于 05-11 12:01 ?1668次閱讀
    基于DSP和<b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>的實(shí)時(shí)<b class='flag-5'>圖像</b>跟蹤處理系統(tǒng)的優(yōu)化設(shè)計(jì)

    OpenMV如何實(shí)現(xiàn)旋轉(zhuǎn)模板匹配

    OpenCV模板匹配不支持旋轉(zhuǎn)角度、不支持多尺度跟多對(duì)象模板匹配,同時(shí)
    的頭像 發(fā)表于 01-14 10:21 ?1886次閱讀

    手把手教你使用LabVIEW OpenCV DNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(含源碼)

    LabVIEW如何使用OpenCV DNN模塊實(shí)現(xiàn)手寫數(shù)字識(shí)別
    的頭像 發(fā)表于 03-08 16:10 ?1750次閱讀

    模板匹配算法的改進(jìn)及自動(dòng)發(fā)牌機(jī)的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《模板匹配算法的改進(jìn)及自動(dòng)發(fā)牌機(jī)的應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 11-08 09:53 ?0次下載
    <b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>的改進(jìn)及<b class='flag-5'>在</b>自動(dòng)發(fā)牌機(jī)<b class='flag-5'>中</b>的應(yīng)用

    OpenCV邊緣模板匹配算法原理詳解

    ,悲喜交加,充分感受到了理想與現(xiàn)實(shí)的距離,不過沒關(guān)系,這里介紹一種新的模板匹配算法,主要是基于圖像邊緣梯度,它對(duì)圖像光照與像素遷移都有很強(qiáng)的
    的頭像 發(fā)表于 12-07 10:56 ?1397次閱讀
    <b class='flag-5'>OpenCV</b>邊緣<b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>原理詳解