gocv是一个基于OPENCV的golang项目。
gocv首页是:https://gocv.io/
想要用gocv进行人脸检测,首先得安装gocv, 官网内有详细的安装步骤,这里就不重复了。
gocv内的函数与opencv的函数名是一样的,差别在于参数的不一样。因为自己没有学过opencv,对opencv的函数不是很熟悉,所以就依葫芦画瓢,百度出py或者C++的人脸检测的例子照着写。
要进行人脸检测,首先得有图片, 在这里我们可以选择打开电脑的摄像头来获取图片:
webcam, err := gocv.OpenVideoCapture(deviceID)
if err != nil {
fmt.Printf("error opening video capture device: %v\n", deviceID)
return
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
if ok := webcam.Read(&img); !ok {
fmt.Printf(“Device closed: %v\n”, deviceID)
return
}
if img.Empty() {
continue
}
函数OpenVideoCapture的功能是打开一个摄像头设备, deviceID表示要打开的摄像头设备号,一般为0. 函数NewMat()的功能是创建一个图片变量,就是opencv里的MAT用来存放图片,然后用 webcam.Read(&img)来把摄像头读取到的图片加载进图片变量中。
如果电脑没有摄像头或者想对图片进行检测,我们可以直接用gocv.IMRead(file, int)函数来打开一张图片,file是图片的位置地址, int为打开图片的方式, -1为全彩,0为灰度等等。
在对图片进行检测之前我们要先加载检测模型,
classifier := gocv.NewCascadeClassifier()
defer classifier.Close()
if !classifier.Load(xmlFile) {
fmt.Printf("Error reading cascade file: %v\n", xmlFile)
return
}
rects := classifier.DetectMultiScale(img)
函数gocv.NewCascadeClassifier()会返回一个分类器,然后用 classifier.Load(xmlFile)来加载分类文件,其中分来文件haarcascade_frontalface_default.xml可以在opencv的github项目内找到,加载完分类器后就可以使用 classifier.DetectMultiScale(img)函数对图片进行检测,该函数会返回检测到的人脸的两个点对角点的坐标,我们可以利用该坐标对图片进行切割或者画边框之类的操作。
人脸的剪切。
当我们拿到人脸的两个对角坐标后,就可以使用img.Region()函数对人脸进行剪切, 该函数会返回坐标内的一张图片,我们剪切出人脸图片后就可以对该图片进一步的处理,以实现人脸识别的功能。