1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 完整opencv(emgucv)人脸 检测 采集 识别 匹配 对比

完整opencv(emgucv)人脸 检测 采集 识别 匹配 对比

时间:2022-03-15 01:42:35

相关推荐

完整opencv(emgucv)人脸 检测 采集 识别 匹配 对比

//成对几何直方图匹配

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);

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。