七叶笔记 » golang编程 » golang OpenCV4库gocv图片关键点检测

golang OpenCV4库gocv图片关键点检测

Go!

正所谓“横看成岭侧成峰,远近高低各不同”,当一个建筑或者人物变化角度后,计算机可以看出来是同一个吗,是怎么看出来的呢?

前面我们用gocv使用模板匹配寻找图片中的特定任务 ,现在我们将使用gocv来寻找图片中的关键点,以便达到匹配的目的。

首先,目标图片长这样:

来自百科,侵删

我们要做的呢,就是将图中的特征点标记出来,首先导入需要用到的库:

 package main
import (
    "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 main

import (
    "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
         }
    }

}  

相关文章