zoukankan      html  css  js  c++  java
  • 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}毫秒 ", compareMethod.ToString("G"), compareResult, time);
              
          } 

  • 相关阅读:
    Redis 事务相关的命令有哪几个?
    是否了解字典树?
    memcached 是如何做身份验证的?
    memcached 和服务器的 local cache(比如 PHP 的 APC、 mmap 文件等)相比,有什么优缺点?
    memcached 如何处理容错的?
    memcached 的多线程是什么?如何使用它们?
    memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?
    memcached 如何实现冗余机制?
    memcached 最大能存储多大的单个 item?
    memcached 能接受的 key 的最大长度是多少?
  • 原文地址:https://www.cnblogs.com/zhayunjia/p/5622576.html
Copyright © 2011-2022 走看看