如果没有安装gocv,请查看文章《gocv-go语言调用opencv入门》
准备好环境,需要下载PIGO的库:
go get -u -f github.com/esimov/pigo/cmd/pigo
官方源码路径:https://github.com/esimov/pigo
1、代码展示
package main
// 人脸检测,基于pico方法
import (
"gocv.io/x/gocv"
"fmt"
"github.com/esimov/pigo/core"
"log"
"io/ioutil"
"image"
"image/color"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if nil != err{
fmt.Println("VideoCaptureDevice err ", err)
return
}
defer webcam.Close()
window := gocv.NewWindow("pigo")
defer window.Close()
window.ResizeWindow(640, 480)
img := gocv.NewMat()
defer img.Close()
green := color.RGBA{0,255, 0, 0}
cascadeFile, err := ioutil.ReadFile("facefinder")
if err != nil {
log.Fatalf("Error reading the cascade file: %v", err)
}
for{
if ok := webcam.Read(&img); !ok{
fmt.Println("Read err ")
return
}
if img.Empty(){
continue
}
goImg, err := img.ToImage()
if nil != err{
fmt.Println("ToImage err ")
return
}
pixels := pigo.RgbToGrayscale(goImg)
cols, rows := goImg.Bounds().Max.X, goImg.Bounds().Max.Y
cParams := pigo.CascadeParams{
MinSize: 20,
MaxSize: 1000,
ShiftFactor: 0.1,
ScaleFactor: 1.1,
ImageParams: pigo.ImageParams{
Pixels: pixels,
Rows: rows,
Cols: cols,
Dim: cols,
},
}
pPigo := pigo.NewPigo()
classifier, err := pPigo.Unpack(cascadeFile)
if err != nil {
log.Fatalf("Error reading the cascade file: %s", err)
}
angle := 0.0
iouThreshold := 0.3
dets := classifier.RunCascade(cParams, angle)
dets = classifier.ClusterDetections(dets, iouThreshold)
for _, face := range dets {
if face.Q > 5{
x := face.Col-face.Scale/2
y := face.Row-face.Scale/2
r := image.Rect(x, y, x + face.Scale, y + face.Scale)
gocv.Rectangle(&img, r, green, 3)
}else{
continue
}
}
window.IMShow(img)
if 27 == window.WaitKey(1){
break
}
}
}
2、代码说明
webcam, err := gocv.VideoCaptureDevice(0)
表示打开电脑的摄像头。
window := gocv.NewWindow("pigo")
表示申请显示窗口,左上角显示“pigo”
img := gocv.NewMat()
表示创建图像矩阵
cascadeFile, err := ioutil.ReadFile("facefinder")
表示读取PIGO的模型数据,是二进制[]byte。文件facefinder在目录%GOPATH%\src\github.com\esimov\pigo\cascade
webcam.Read(&img)
表示从摄像头读取视频内容,并放于图像矩阵中。
goImg, err := img.ToImage()
表示图像矩阵转换成image格式。
pixels := pigo.RgbToGrayscale(goImg)
将image图像转换成灰度图像,输出[]uint8格式。
pPigo := pigo.NewPigo()
创建一个PIGO的分类器对象。
classifier, err := pPigo.Unpack(cascadeFile)
解压缩PIGO的二进制文件模型数据,解压到PIGO分类器中,返回决策树的数量、深度、阈值和预测。
cParams := pigo.CascadeParams{
MinSize: 20,
MaxSize: 1000,
ShiftFactor: 0.1,
ScaleFactor: 1.1,
ImageParams: pigo.ImageParams{
Pixels: pixels,
Rows: rows,
Cols: cols,
Dim: cols,
},
}
angle := 0.0
iouThreshold := 0.3
dets := classifier.RunCascade(cParams, angle)
dets = classifier.ClusterDetections(dets, iouThreshold)
PIGO的分类器跟输入的参数,进行分类,PIGO没有返回矩形框,而输出人脸所在位置信息。
for _, face := range dets {
if face.Q > 5{
x := face.Col-face.Scale/2
y := face.Row-face.Scale/2
r := image.Rect(x, y, x + face.Scale, y + face.Scale)
gocv.Rectangle(&img, r, green, 3)
}else{
continue
}
}
把人脸所在位置信息,对图像矩阵img,绘制一个绿色的矩形框。
window.IMShow(img)
把图像矩阵的内存内容,显示到显示窗口。
if 27 == window.WaitKey(1){
break
}
等待按“ESC”退出。
2、代码运行效果
|