完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比
2012-08-03 10:34
731 查看
//成对几何直方图匹配
public static string MatchHist()
{
string haarXmlPath = @"haarcascade_frontalface_alt_tree.xml";
HaarCascade haar = new HaarCascade(haarXmlPath);
int[] hist_size = new int[1] { 256 };//建一个数组来存放直方图数据
//IntPtr img1 = CvInvoke.cvLoadImage("", Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); //根据路径导入图像
//准备轮廓
Image<Bgr, Byte> image1 = new Image<Bgr, byte>("D:\\code\\picture\\frunck.jpg");
Image<Bgr, Byte> image2 = new Image<Bgr, byte>("D:\\code\\picture\\lena.jpg");
MCvAvgComp[] faces = haar.Detect(image1.Convert<Gray, byte>(), 1.4, 1, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20), Size.Empty);
MCvAvgComp[] faces2 = haar.Detect(image2.Convert<Gray, byte>(), 1.4, 1, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20), Size.Empty);
int l1 = faces.Length;
int l2 = faces2.Length;
image1 = image1.Copy(faces[0].rect);
image2 = image2.Copy(faces2[0].rect);
Image<Gray, Byte> imageGray1 = image1.Convert<Gray, Byte>();
Image<Gray, Byte> imageGray2 = image2.Convert<Gray, Byte>();
Image<Gray, Byte> imageThreshold1 = imageGray1.ThresholdBinaryInv(new Gray(128d), new Gray(255d));
Image<Gray, Byte> imageThreshold2 = imageGray2.ThresholdBinaryInv(new Gray(128d), new Gray(255d));
//Contour<Point> contour1 = imageThreshold1.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);
Contour<Point> contour1 = imageThreshold1.FindContours();
Contour<Point> contour2 = imageThreshold2.FindContours();
IntPtr HistImg1 = CvInvoke.cvCreateHist(1, hist_size, Emgu.CV.CvEnum.HIST_TYPE.CV_HIST_ARRAY, null, 1); //创建一个空的直方图
IntPtr HistImg2 = CvInvoke.cvCreateHist(1, hist_size, Emgu.CV.CvEnum.HIST_TYPE.CV_HIST_ARRAY, null, 1);
//CvInvoke.cvHaarDetectObjects();
IntPtr[] inPtr1 = new IntPtr[1] { imageThreshold1 };
IntPtr[] inPtr2 = new IntPtr[1] { imageThreshold2 };
CvInvoke.cvCalcHist(inPtr1, HistImg1, false, IntPtr.Zero); //计算inPtr1指向图像的数据,并传入HistImg1中
CvInvoke.cvCalcHist(inPtr2, HistImg2, false, IntPtr.Zero);
Stopwatch sw = new Stopwatch();
sw.Start();
double compareResult;
Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD compareMethod = Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD.CV_COMP_BHATTACHARYYA;
CvInvoke.cvNormalizeHist(HistImg1, 1d); //直方图对比方式
CvInvoke.cvNormalizeHist(HistImg2, 1d);
compareResult = CvInvoke.cvCompareHist(HistImg1, HistImg2, compareMethod);
//compareResult = CvInvoke.cvMatchShapes(HistImg1, HistImg2, Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 1d);
sw.Stop();
double time = sw.Elapsed.TotalMilliseconds;
return string.Format("成对几何直方图匹配(匹配方式:{0}),结果:{1:F05},用时:{2:F05}毫秒\r\n", compareMethod.ToString("G"), compareResult, time);
}
public static string MatchHist()
{
string haarXmlPath = @"haarcascade_frontalface_alt_tree.xml";
HaarCascade haar = new HaarCascade(haarXmlPath);
int[] hist_size = new int[1] { 256 };//建一个数组来存放直方图数据
//IntPtr img1 = CvInvoke.cvLoadImage("", Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); //根据路径导入图像
//准备轮廓
Image<Bgr, Byte> image1 = new Image<Bgr, byte>("D:\\code\\picture\\frunck.jpg");
Image<Bgr, Byte> image2 = new Image<Bgr, byte>("D:\\code\\picture\\lena.jpg");
MCvAvgComp[] faces = haar.Detect(image1.Convert<Gray, byte>(), 1.4, 1, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20), Size.Empty);
MCvAvgComp[] faces2 = haar.Detect(image2.Convert<Gray, byte>(), 1.4, 1, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20), Size.Empty);
int l1 = faces.Length;
int l2 = faces2.Length;
image1 = image1.Copy(faces[0].rect);
image2 = image2.Copy(faces2[0].rect);
Image<Gray, Byte> imageGray1 = image1.Convert<Gray, Byte>();
Image<Gray, Byte> imageGray2 = image2.Convert<Gray, Byte>();
Image<Gray, Byte> imageThreshold1 = imageGray1.ThresholdBinaryInv(new Gray(128d), new Gray(255d));
Image<Gray, Byte> imageThreshold2 = imageGray2.ThresholdBinaryInv(new Gray(128d), new Gray(255d));
//Contour<Point> contour1 = imageThreshold1.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);
Contour<Point> contour1 = imageThreshold1.FindContours();
Contour<Point> contour2 = imageThreshold2.FindContours();
IntPtr HistImg1 = CvInvoke.cvCreateHist(1, hist_size, Emgu.CV.CvEnum.HIST_TYPE.CV_HIST_ARRAY, null, 1); //创建一个空的直方图
IntPtr HistImg2 = CvInvoke.cvCreateHist(1, hist_size, Emgu.CV.CvEnum.HIST_TYPE.CV_HIST_ARRAY, null, 1);
//CvInvoke.cvHaarDetectObjects();
IntPtr[] inPtr1 = new IntPtr[1] { imageThreshold1 };
IntPtr[] inPtr2 = new IntPtr[1] { imageThreshold2 };
CvInvoke.cvCalcHist(inPtr1, HistImg1, false, IntPtr.Zero); //计算inPtr1指向图像的数据,并传入HistImg1中
CvInvoke.cvCalcHist(inPtr2, HistImg2, false, IntPtr.Zero);
Stopwatch sw = new Stopwatch();
sw.Start();
double compareResult;
Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD compareMethod = Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD.CV_COMP_BHATTACHARYYA;
CvInvoke.cvNormalizeHist(HistImg1, 1d); //直方图对比方式
CvInvoke.cvNormalizeHist(HistImg2, 1d);
compareResult = CvInvoke.cvCompareHist(HistImg1, HistImg2, compareMethod);
//compareResult = CvInvoke.cvMatchShapes(HistImg1, HistImg2, Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 1d);
sw.Stop();
double time = sw.Elapsed.TotalMilliseconds;
return string.Format("成对几何直方图匹配(匹配方式:{0}),结果:{1:F05},用时:{2:F05}毫秒\r\n", compareMethod.ToString("G"), compareResult, time);
}
相关文章推荐
- Neurotec Biometrics 人脸、检测、采集、识别、匹配、对比
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
- 人脸检测和识别 源代码 下载-opencv3+python3.6完整实战项目源代码 识别视频《欢乐颂》中人物
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
- 代码C++, opencv实现人脸识别,人脸检测,人脸匹配,视频中的人脸检测,摄像头下的人脸检测等
- Android 人脸识别+人脸匹配(OpenCV+JavaCV)
- Android使用OpenCV实现「人脸检测」和「人脸识别」
- 基于OpenCv的人脸检测、识别系统学习制作笔记之三
- OpenCV人脸检测+识别
- opencv3.1图片相似度对比和人脸检测裁剪
- Opencv与dlib联合进行人脸关键点检测与识别【转】
- 人脸识别在opencv下作人脸检测
- OpenCV结合V4l2实现人脸检测以及人脸识别
- 人脸检测和识别及python实现系列(2)-- 相关API介绍与数据采集
- 【OpenCV人脸识别入门教程之二】人脸检测
- 人脸识别在opencv下作人脸检测
- Opencv与dlib联合进行人脸关键点检测与识别
- opencv 人脸识别和行人检测
- 基于OpenCV读取摄像头进行人脸检测和人脸识别