基于golang的opencv人脸比对 - Go语言中文社区

基于golang的opencv人脸比对


github上golang结合opencv:https://github.com/go-opencv/go-opencv

下载后进入go-opencv/samples目录,目录下为示例代码

编译opencv源码:http://blog.csdn.net/zhjinw/article/details/79627454

试运行go run hellocv.go

如果出现以下错误,即没有找到opencv头文件,到mingw安装目录下的include文件夹,查看是否存在opencv和opencv2的文件夹,如果没有,到opencv编译目录include以及moudles下拷贝


如果出现以下错误,即没有找到opencv的相关dll动态库,到mingw安装目录下的bin文件夹,查看是否有libopencv_core等相关dll文件,如果没有,到opencv编译目录bin文件夹中拷贝过来。

这里需要注意以下,我们编译的是opencv2.4.9,源码中为opencv2.4.2,需要将源码中的

#cgo windows LDFLAGS: -lopencv_core242 -lopencv_imgproc242 -lopencv_photo242 -lopencv_highgui242 -lstdc++

改为:

//#cgo windows LDFLAGS: -lopencv_core249 -lopencv_imgproc249 -lopencv_photo249 -lopencv_highgui249 -lstdc++
将242改为249即可

运行成功后的结果如下所示


接下来我们使用opencv来进行人脸比对,由于我也是初次接触opencv,没有找到opencv直接提供的人脸比对接口,这里我们采用以下方法来实现人脸比对,代码中存在很多异常,我们只是进行功能验证。

  1. 分别用facedetect功能将两张图片中的人脸检测出来
  2. 将这两张人脸图片转换成单通道的图像
  3. 使用直方图比较这两张单通道的人脸图像,得出相似度。
code:
package main
/*
#include <stdio.h>
#include <stdlib.h>

static float **test(){
        float *a = malloc(2*sizeof(float));
        float **b = malloc(1*sizeof(a));
        *a = 0;
        *(a + 1) = 255;
        b[0] = a;
        return b;
}
*/
//#include "../opencv/opencv.h"
//#cgo linux  pkg-config: opencv
//#cgo darwin pkg-config: opencv
//#cgo freebsd pkg-config: opencv
//#cgo windows LDFLAGS: -lopencv_core249 -lopencv_imgproc249 -lopencv_photo249 -lopencv_highgui249 -lstdc++
import "C"
import (
	"unsafe"
	"fmt"
	"path"
	"runtime"

	"github.com/lazywei/go-opencv/opencv"
	//"../opencv" // can be used in forks, comment in real application
)

func main() {
	_, currentfile, _, _ := runtime.Caller(0)
	
	HistogramBins := 256

	image1 := opencv.LoadImage(path.Join(path.Dir(currentfile), "../images/111.jpg"))
	
	cascade := opencv.LoadHaarClassifierCascade(path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml"))
	cascade.DetectObjects(image1)
	
	image2 := opencv.LoadImage(path.Join(path.Dir(currentfile), "../images/222.jpg"))
	
	cascade = opencv.LoadHaarClassifierCascade(path.Join(path.Dir(currentfile), "haarcascade_frontalface_alt.xml"))
	cascade.DetectObjects(image2)

	histogram1 :=  (*C.CvHistogram)(C.cvCreateHist(1, (*C.int)(unsafe.Pointer(&HistogramBins)), C.CV_HIST_ARRAY, C.test(), 1));
	histogram2 :=  (*C.CvHistogram)(C.cvCreateHist(1, (*C.int)(unsafe.Pointer(&HistogramBins)), C.CV_HIST_ARRAY, C.test(), 1));

	srcImage := opencv.CreateImage(image1.Width(), image1.Height(), image1.Depth(), 1)
	opencv.CvtColor(image1, srcImage, C.CV_BGR2GRAY)

	tarImage := opencv.CreateImage(image2.Width(), image2.Height(), image2.Depth(), 1)
	opencv.CvtColor(image2, tarImage, C.CV_BGR2GRAY)

	C.cvCalcHist((**C.IplImage)(unsafe.Pointer(&srcImage)), histogram1, 0, nil)
	C.cvCalcHist((**C.IplImage)(unsafe.Pointer(&tarImage)), histogram2, 0, nil)
	
    C.cvNormalizeHist(histogram1, 1);  
    C.cvNormalizeHist(histogram2, 1);  

	fmt.Println(C.cvCompareHist(histogram1, histogram2, C.CV_COMP_CORREL))	

	C.cvReleaseHist(&histogram1)
	C.cvReleaseHist(&histogram2)

	opencv.WaitKey(0)
}

最后进行功能验证,如果两张图片相同,得出的结果为1,如果两张图片的人脸相似度越高,则越趋向于1

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ZhJinW/article/details/79628632
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 00:05:36
  • 阅读 ( 2570 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢