opencv 比較直方圖方式 進行人臉檢測對比


//成對幾何直方圖匹配         
      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);
          
      } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM