Go!
正所謂“橫看成嶺側成峰,遠近高低各不同”,當一個建築或者人物變化角度後,計算機可以看出來是同一個嗎,是怎麼看出來的呢?
首先,目標圖片長這樣:
來自百科,侵刪
我們要做的呢,就是將圖中的特徵點標記出來,首先匯入需要用到的庫:
package mainimport ( "os" "gocv.io/x/gocv" "log" "image/color")
然後處理下輸入引數:
if len(os.Args) < 2 { log.Print("How to run:\n\tFindKP [Template image]") return } template:=os.Args[1] imgTempl:=gocv.IMRead(template,gocv.IMReadColor) if imgTempl.Empty(){ log.Printf("Invalid read of %s",template) return //為空,返回 } log.Printf("%v",imgTempl) defer imgTempl.Close() //沒事多defer
將圖片複製一份為灰度影象,便於處理:
grayTempl:=gocv.NewMat() gocv.CvtColor(imgTempl,&grayTempl,gocv.ColorBGRToGray) if grayTempl.Empty(){ log.Printf("Invalid transfer of %s to grayscale",template) return //為空,返回 }
建立一個fast角點特徵點檢測例項
fast:=gocv.NewFastFeatureDetector()defer fast.Close() //沒事多defer
簡要介紹下fast角點檢測,FAST特徵點檢測是公認的比較快速的特徵點檢測方法,只利用周圍畫素比較的資訊就可以得到特徵點,簡單,有效。FAST特徵檢測演算法來源於corner的定義,這個定義基於特徵點周圍的影象灰度值,檢測候選特徵點周圍一圈的畫素值,如果候選點周圍領域內有足夠多的畫素點與該候選點的灰度值差別夠大,則認為該候選點為一個特徵點。
FAST
如果對具體細節感興趣的話,可以查閱相關論文,這裡就不多言了。
接下來,檢測特徵點:
kpTemp:=fast.Detect(grayTempl)
繪製特徵點,並顯示:
blue := color.RGBA{0, 0, 255, 0} //定義顏色來畫特徵點gocv.DrawKeyPoints(imgTempl,kpTemp,&imgTempl,blue,0) //繪製關鍵點window1 := gocv.NewWindow(template)defer window1.Close() window1.IMShow(imgTempl) for { if window1.WaitKey('q') >= 0 { //檢測到Q鍵,則退出 break } }
在控制檯內執行:
go run test\main.go ..\2.jpg
結果為:
下篇文章,我們學習如何匹配兩個圖片的特徵點。
package mainimport ( "os" "gocv.io/x/gocv" "log" "image/color")func main() { if len(os.Args) < 2 { log.Print("How to run:\n\tFindKP [src image]") return } template:=os.Args[1] imgTempl:=gocv.IMRead(template,gocv.IMReadColor) if imgTempl.Empty(){ log.Printf("Invalid read of %s",template) return //為空,返回 } log.Printf("%v",imgTempl) defer imgTempl.Close() grayTempl:=gocv.NewMat() gocv.CvtColor(imgTempl,&grayTempl,gocv.ColorBGRToGray) if grayTempl.Empty(){ log.Printf("Invalid transfer of %s to grayscale",template) return //為空,返回 } fast:=gocv.NewFastFeatureDetector() defer fast.Close() kpTemp:=fast.Detect(grayTempl) log.Printf("%v,%v,%v",kpTemp,grayTempl,imgTempl) blue := color.RGBA{0, 0, 255, 0} gocv.DrawKeyPoints(imgTempl,kpTemp,&imgTempl,blue,0) window1 := gocv.NewWindow(template) defer window1.Close() window1.IMShow(imgTempl) for { if window1.WaitKey('q') >= 0 { break } }}
最新評論