国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C# 通過Emgu CV 人臉檢測

2019-11-17 02:20:40
字體:
來源:轉載
供稿:網友

C# 通過Emgu CV 人臉檢測

1、Emgu CV使用opencv人臉檢測,C#使用代碼(轉載于Emgu CV Example):

using System;using System.Collections.Generic;using System.Diagnostics;using System.Drawing;using Emgu.CV;using Emgu.CV.Structure;#if !IOSusing Emgu.CV.Cuda;#endifnamespace FaceDetection{   public static class DetectFace   {      public static void Detect(        Mat image, String faceFileName, String eyeFileName,         List<Rectangle> faces, List<Rectangle> eyes,         bool tryUseCuda, bool tryUSEOpenCL,        out long detectionTime)      {         Stopwatch watch;                  #if !IOS         if (tryUseCuda && CudaInvoke.HasCuda)         {            using (CudaCascadeClassifier face = new CudaCascadeClassifier(faceFileName))            using (CudaCascadeClassifier eye = new CudaCascadeClassifier(eyeFileName))            {               watch = Stopwatch.StartNew();               using (CudaImage<Bgr, Byte> gpuImage = new CudaImage<Bgr, byte>(image))               using (CudaImage<Gray, Byte> gpuGray = gpuImage.Convert<Gray, Byte>())               {                  Rectangle[] faceRegion = face.DetectMultiScale(gpuGray, 1.1, 10, Size.Empty);                  faces.AddRange(faceRegion);                  foreach (Rectangle f in faceRegion)                  {                     using (CudaImage<Gray, Byte> faceImg = gpuGray.GetSubRect(f))                     {                        //For some reason a clone is required.                        //Might be a bug of CudaCascadeClassifier in opencv                        using (CudaImage<Gray, Byte> clone = faceImg.Clone(null))                        {                           Rectangle[] eyeRegion = eye.DetectMultiScale(clone, 1.1, 10, Size.Empty);                           foreach (Rectangle e in eyeRegion)                           {                              Rectangle eyeRect = e;                              eyeRect.Offset(f.X, f.Y);                              eyes.Add(eyeRect);                           }                        }                     }                  }               }               watch.Stop();            }         }         else         #endif         {            //Many opencl functions require opencl compatible gpu devices.             //As of opencv 3.0-alpha, opencv will crash if opencl is enable and only opencv compatible cpu device is PResented            //So we need to call CvInvoke.HaveOpenCLCompatibleGpuDevice instead of CvInvoke.HaveOpenCL (which also returns true on a system that only have cpu opencl devices).            CvInvoke.UseOpenCL = tryUseOpenCL && CvInvoke.HaveOpenCLCompatibleGpuDevice;            //Read the HaarCascade objects            using (CascadeClassifier face = new CascadeClassifier(faceFileName))            using (CascadeClassifier eye = new CascadeClassifier(eyeFileName))            {               watch = Stopwatch.StartNew();               using (UMat ugray = new UMat())               {                  CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);                  //normalizes brightness and increases contrast of the image                  CvInvoke.EqualizeHist(ugray, ugray);                  //Detect the faces  from the gray scale image and store the locations as rectangle                  //The first dimensional is the channel                  //The second dimension is the index of the rectangle in the specific channel                  Rectangle[] facesDetected = face.DetectMultiScale(                     ugray,                     1.1,                     10,                     new Size(20, 20));                                       faces.AddRange(facesDetected);                  foreach (Rectangle f in facesDetected)                  {                     //Get the region of interest on the faces                     using (UMat faceRegion = new UMat(ugray, f))                     {                        Rectangle[] eyesDetected = eye.DetectMultiScale(                           faceRegion,                           1.1,                           10,                           new Size(20, 20));                                                foreach (Rectangle e in eyesDetected)                        {                           Rectangle eyeRect = e;                           eyeRect.Offset(f.X, f.Y);                           eyes.Add(eyeRect);                        }                     }                  }               }               watch.Stop();            }         }         detectionTime = watch.ElapsedMilliseconds;      }   }}

2、參數說明,人臉檢測耗時影響,精度影響

Rectangle[] facesDetected = face.DetectMultiScale(                     ugray, //灰度圖像,單通道圖片                     1.1,   //scaleFactor 1.1~1.5 越大耗時越低、檢測精度越低                     10,    //minNeighbors 3~15 越高耗時越低                     new Size(20, 20)); //最小臉部大??? //最大臉部大小,  越大耗時越低

DetectMultiScale支持多線程,加載人臉識別模型可以全局初始化,減小耗時。

using (CudaCascadeClassifier face = new CudaCascadeClassifier(faceFileName)) using (CudaCascadeClassifier eye = new CudaCascadeClassifier(eyeFileName))


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平遥县| 佛教| 绥阳县| 乌兰察布市| 玛沁县| 邢台市| 成安县| 江永县| 城步| 桓台县| 大安市| 维西| 布拖县| 玛沁县| 天峨县| 郸城县| 商洛市| 黑水县| 清新县| 镇雄县| 潼南县| 桑植县| 日照市| 武功县| 翁牛特旗| 新巴尔虎右旗| 红河县| 罗甸县| 建水县| 柘城县| 偃师市| 平江县| 明溪县| 鸡西市| 泽库县| 郸城县| 云南省| 策勒县| 图木舒克市| 同德县| 大埔区|