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,需要将源码中的
改为:
将242改为249即可运行成功后的结果如下所示
接下来我们使用opencv来进行人脸比对,由于我也是初次接触opencv,没有找到opencv直接提供的人脸比对接口,这里我们采用以下方法来实现人脸比对,代码中存在很多异常,我们只是进行功能验证。
- 分别用facedetect功能将两张图片中的人脸检测出来
- 将这两张人脸图片转换成单通道的图像
- 使用直方图比较这两张单通道的人脸图像,得出相似度。
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 := 256image1 := 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