昨天看了關於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...