社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
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,需要将源码中的
改为:
运行成功后的结果如下所示
接下来我们使用opencv来进行人脸比对,由于我也是初次接触opencv,没有找到opencv直接提供的人脸比对接口,这里我们采用以下方法来实现人脸比对,代码中存在很多异常,我们只是进行功能验证。
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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!