完整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学习笔记——判断两张图的相似