常見模板匹配法學習(SIFT,SURF,ORB)

2021-09-03 08:15:52 字數 3616 閱讀 3213

昨天看了關於slam的綜述文章一篇,對於其中提到的sift,surf,orb三種特徵提取匹配的方法,非常想要實踐學習其python的編寫方法。同時我爸讓我幫他寫乙個樹莓派(raspberry pi)檢測黑點的程式,黑點有什麼好檢測的(╯•̀ὤ•́)╯,考慮到神經網路識別計算複雜度過高,我決定用模板匹配法去做。

首先我們應該明確,怎麼開發這個程式最快。肯定是用opencv,所以讀了《opencv3計算機視覺python語言實現》,獲得了相關程式與。然後於linux下安裝opencv。

先學習的是sift。使用書中的程式;

import cv2

import sys

import numpy as np

imgpath = sys.argv[1]

img = cv2.imread(imgpath)

gray = cv2.cvtcolor(img, cv2.color_bgr2gray)

sift = cv2.xfeatures2d.sift_create()

keypoints, descriptor = sift.detectandcompute(gray,none)

img = cv2.drawkeypoints(image=img, outimage=img, keypoints = keypoints, flags = 4, color = (51, 163, 236))

cv2.imshow('sift_keypoints', img)

while (true):

if cv2.waitkey(1000/12) & 0xff == ord("q"):

break

cv2.destroyallwindows()

有兩個問題:

其一,anaconda使用run file按鈕無法新增輸入內容,也就是argv[1]。所以直接從右下視窗輸入:

runfile('/home/emin/temp/tensorflow/pycv-master/chapter6/sift.py',args='/home/emin/temp/tensorflow/pycv-master/images/varese.jpg', wdir='/home/emin/temp/tensorflow/pycv-master/chapter6')
也就是帶輸入的執行檔案。

其二,產生如下問題:

if cv2.waitkey(1000 / 12) & 0xff == ord("q"):

typeerror: integer argument expected, got float

if cv2.waitkey(1) & 0xff == ord("q"):
問題解決,生成了sift特徵提取影象。

同理3.1,修改程式後,通過ipython consolo命令輸入arg執行。

import cv2

import sys

import numpy as np

imgpath = sys.argv[1]

img = cv2.imread(imgpath)

alg = sys.argv[2]

def fd(algorithm):

algorithms =

return algorithms[algorithm]

gray = cv2.cvtcolor(img, cv2.color_bgr2gray)

fd_alg = fd(alg)

keypoints, descriptor = fd_alg.detectandcompute(gray,none)

img = cv2.drawkeypoints(image=img, outimage=img, keypoints = keypoints, flags = 4, color = (51, 163, 236))

cv2.imshow('keypoints', img)

while (true):

if cv2.waitkey(1) & 0xff == ord("q"):

break

cv2.destroyallwindows()

由於需要輸入雙引數,進行模式的選擇,所以使用命令:

runfile('/home/emin/temp/tensorflow/pycv-master/chapter6/surf+sift.py',args='/home/emin/temp/tensorflow/pycv-master/images/varese.jpg surf', wdir='/home/emin/temp/tensorflow/pycv-master/chapter6')
兩個arg之間使用了空格。

這裡使用的是自己的,所以拍攝的尺寸較大,要進行壓縮,程式結果如下。

將匹配對應的點數量增加。

演算法學習 模式匹配

子串的定位操作通常稱為串的模式匹配。模式匹配的應用很常見,比如在文字處理軟體中經常用到的查詢功能。我們用如下函式來表示對字串位置的定位 int index const string tag,const string ptn,int pos 其中,tag為主串,ptn為子串 模式串 如果在主串tag的...

(四)模板方法學習

模板方法 多個子類,對於某一種流程,處理方法只有細微的差別,此時,可以將不同物件之間相同的處理,集中到其基類中處理,而有差別的地方,在子類中進行分別實現。定義乙個抽象基類,其public介面 首先 實現公共的處理,然後 呼叫由子類必須實現的虛函式,實現差異化的處理 這裡需要注意的是,要特別仔細的辨別...

Opencv學習 模板匹配

功能簡述 實現影象中某目標物體的匹配,並用矩形框繪製出來。如下 include include int main int argc,char ar cv resize template img,template img,cv size template img.cols 2,template img...