正所谓“横看成岭侧成峰,远近高低各不同”,当一个建筑或者人物变化角度后,计算机可以看出来是同一个吗,是怎么看出来的呢?
前面我们用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 的定义,这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的 像素点 与该候选点的灰度值差别够大,则认为该候选点为一个特征点。
如果对具体细节感兴趣的话,可以查阅相关论文,这里就不多言了。
接下来,检测特征点:
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
}
}
}