完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比
//成對(duì)幾何直方圖匹配????????
 ????? public static string MatchHist()?????????
 ????? {
 ????????? string haarXmlPath = @"haarcascade_frontalface_alt_tree.xml";
 ????????? HaarCascade haar = new HaarCascade(haarXmlPath);
 ????????? int[] hist_size = new int[1] { 256 };//建一個(gè)數(shù)組來存放直方圖數(shù)據(jù)
 ????????? //IntPtr img1 = CvInvoke.cvLoadImage("", Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); //根據(jù)路徑導(dǎo)入圖像
 ???????????????
 ????????? //準(zhǔn)備輪廓?
 ????????? 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); //創(chuàng)建一個(gè)空的直方圖
 ????????? 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); //計(jì)算inPtr1指向圖像的數(shù)據(jù),并傳入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); //直方圖對(duì)比方式
 ????????? 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("成對(duì)幾何直方圖匹配(匹配方式:{0}),結(jié)果:{1:F05},用時(shí):{2:F05}毫秒\r\n", compareMethod.ToString("G"), compareResult, time);
 ?????????
 ????? }?
總結(jié)
以上是生活随笔為你收集整理的完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: IDEA 错误:找不到或无法加载主类
- 下一篇: OpenCV学习笔记——判断两张图的相似
