31-角点检测(EmguCV学习)

文章目录

说明

1、EmguCV中Harris角点检测函数:CvInvoke.CornerHarris()
参数harrisResponse为CV_32FC1的图像,计算后需要进行归一化或者阈值化,转换为CV8U再显示;
参数blockSize : 领域大小,和协方差矩阵M的计算有关(影响M的值)
在这里插入图片描述

在这里插入图片描述

2、Harris检测的结果衡量(角点响应度量):M为协方差矩阵,度量R判断是否为角点,需要自己选择判断合适的阈值;
在这里插入图片描述
在这里插入图片描述

3、Shi-Tomasi角点检测:EmguCV没有封装goodFeatureToTrack()方法,只能使用GFTTDetector类的Detect()方法来检测特征点;可以自己控制想要的角点数,使用更方便;
参数minDistance控制角点之间的距离;
在这里插入图片描述
在这里插入图片描述

4、亚像素级角点检测:cornerSubPix()
在这里插入图片描述

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using System.Drawing;
using Emgu.CV.Features2D;

namespace lesson31
{
    class Program
    {
        static void Main(string[] args)
        {
            ///Harris角点检测
            //Mat src = CvInvoke.Imread("3.jpg");
            //CvInvoke.Imshow("input", src);
            //Mat gray = new Mat();
            //CvInvoke.CvtColor(src, gray, ColorConversion.Bgr2Gray);
            //Mat dst = new Mat();
            //CvInvoke.CornerHarris(gray, dst, 2, 3, 0.04);//角点检测
            //CvInvoke.Threshold(dst, dst, 0.005, 255, ThresholdType.Binary);
            //Console.WriteLine("Depth: {0}\nChannels: {1}", dst.Depth, dst.NumberOfChannels);
            //dst.ConvertTo(dst, DepthType.Cv8U);
            //CvInvoke.Imshow("CornerHarris", dst);
            //Image<Gray, Byte> img = dst.ToImage<Gray, Byte>();
            //for (int i = 0; i < img.Rows; i++)
            //{
            //    for (int j = 0; j < img.Cols; j++)
            //    {
            //        if (img.Data[i, j, 0] == 255)
            //        {
            //            CvInvoke.Circle(src, new Point(j, i), 2, new MCvScalar(0, 255, 0), -1);
            //        }
            //    }
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///另一种方法
            //Mat src = CvInvoke.Imread("3.jpg");
            //Mat grayImg = new Mat();
            //CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);

            //Mat dst = new Mat();
            //CvInvoke.CornerHarris(grayImg, dst, 2, 3, 0.04, BorderType.Default);
            //Mat scaleImg = new Mat();
            //CvInvoke.Normalize(dst, dst, 0, 255, NormType.MinMax, DepthType.Cv32F);
            //CvInvoke.ConvertScaleAbs(dst, scaleImg, 1, 0);
            //Image<Gray, Byte> img = scaleImg.ToImage<Gray, Byte>();
            //for(int i = 0; i < img.Rows;i++)
            //{
            //    for(int j =0; j < img.Cols; j++)
            //    {
            //        if(img.Data[i,j,0] > 100)           //阈值选取很重要,控制角点个数
            //        {
            //            CvInvoke.Circle(src, new Point(j, i), 3, new MCvScalar(0, 255, 0), -1);
            //        }
            //    }
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///Shi-Tomasi角点检测
            //Mat src = CvInvoke.Imread("mask2.jpg");
            //Mat grayImg = new Mat();
            //CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);
            //GFTTDetector gFTT = new GFTTDetector(12, 0.01, 1, 3, false, 0.04);
            //MKeyPoint[] points = gFTT.Detect(grayImg);      //使用Shi-Tomasi检测算法检测特征点
            //for(int i = 0; i < points.Length; i++)
            //{
            //    Point pt = new Point();
            //    pt.X = (int)points[i].Point.X;
            //    pt.Y = (int)points[i].Point.Y;

            //    CvInvoke.Circle(src, pt, 3, new MCvScalar(0, 0, 255), -1);
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///亚像素角点检测
            Mat src = CvInvoke.Imread("3.jpg");
            CvInvoke.Imshow("input", src);

            Mat grayImg = new Mat();
            CvInvoke.CvtColor(src, grayImg, ColorConversion.Bgr2Gray);
            Mat harrisImg = new Mat();
            CvInvoke.CornerHarris(grayImg, harrisImg, 2, 3, 0.04);
            CvInvoke.Threshold(harrisImg, harrisImg, 0.01, 255, ThresholdType.Binary);
            Mat dst = new Mat();
            harrisImg.ConvertTo(dst, DepthType.Cv8U);
            CvInvoke.Imshow("mask", dst);


            VectorOfPointF corners = new VectorOfPointF();
            Image<Gray, Byte> img = dst.ToImage<Gray, Byte>();
            for(int i = 0; i < img.Rows; i++)
            {
                for(int j = 0; j < img.Cols; j++)
                {
                    if(img.Data[i,j,0] == 255)
                    {
                        CvInvoke.Circle(src, new Point(j, i), 3, new MCvScalar(0, 0, 255), -1);
                        PointF[] pt = new PointF[1];
                        pt[0].X = j;
                        pt[0].Y = i;
                        corners.Push(pt);
                    }
                }
            }
            CvInvoke.Imshow("result", src);
            MCvTermCriteria termCriteria = new MCvTermCriteria(40, 0.001);
            CvInvoke.CornerSubPix(grayImg, corners, new Size(5, 5), new Size(-1, -1), termCriteria); //亚像素级角点精确化
            for(int i = 0; i < corners.Size; i++)
            {
                Console.WriteLine("corner {0} : ({1:F2},{1:F2})", i, corners[i].X, corners[i].Y);
            }

            CvInvoke.WaitKey(0);
        }
    }
}

效果

1、Harris角点检测:
在这里插入图片描述
使用不同阈值,检测到的角点数也不同:
在这里插入图片描述
2、Shi-Tomasi检测:(GFTTDetector)
在这里插入图片描述

3、亚像素级角点精确化:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: EmguCV是一个基于经典计算机视觉库OpenCV的.NET包装器,它允许我们在使用.NET编程语言的过程中使用OpenCV的功能。活体检测是指通过计算机视觉技术来验证一个人脸是否为真实的活体。 在EmguCV中,实现活体检测可以使用多种方法。其中一种常见的方法是使用面部表情识别。通过分析面部表情的变化,判断人脸是否真实。例如,我们可以通过分析面部肌肉的动作来判断人脸是否真实。此外,我们还可以使用眼睛的眨眼频率和眼球运动来判断人脸是否活体。 另一种常见的活体检测方法是使用红外光或热成像。这种方法通过使用红外光或热成像技术来检测人脸的温度差异。一个真实的人脸会有较高的温度差异,而一个伪造的人脸则不会有明显的温度差异。 除了这些方法之外,EmguCV还提供了其他一些用于活体检测的功能,例如人脸追踪和人脸特征点检测。通过这些功能,我们可以更加准确地分析和判断人脸是否为真实的活体。 总之,EmguCV提供了丰富的功能和算法,可以用于活体检测。无论是通过面部表情识别、红外光或热成像,还是人脸追踪和特征点检测,EmguCV都可以帮助我们实现准确和可靠的活体检测。 ### 回答2: EMGUcv是一种基于C#语言的图像处理库,可以用于实现活体检测功能。活体检测是一种识别人脸是否为真实活体的技术,可以有效避免使用照片、视频等非真实人脸进行识别的情况。 EMGUcv活体检测的基本原理是通过对人脸区域进行分析,检测脸部特征和反应,以判断是否为真实存活的人脸。具体步骤如下: 1. 人脸检测:使用EMGUcv的人脸检测算法,检测图像中的人脸位置。常用的人脸检测算法有Haar级联、深度学习等。 2. 关键点检测:在检测到的人脸区域内,使用EMGUcv提供的关键点检测算法,识别出人脸的眼睛、鼻子、嘴等重要特征点。 3. 活体判断:根据关键点的位置和运动情况,判断人脸是否为真实活体。例如,通过检测眼睛的眨眼频率、鼻子的呼吸变化、嘴唇的微笑等,来确定是否为真实人脸。 4. 结果输出:最后,将活体检测的结果输出,判断图像中的人脸是否为真实活体。 EMGUcv提供了丰富的图像处理和计算机视觉功能,可以用于实现活体检测。开发人员可以根据具体需求,调用相应的函数和算法,实现活体检测功能。同时,EMGUcv的易用性和灵活性也使得开发过程更加便捷。因此,使用EMGUcv实现活体检测可以提高人脸识别的准确性和安全性,广泛应用于人脸识别系统、手机解锁、金融支付等领域。 ### 回答3: EmguCV是一个基于OpenCV的开源计算机视觉库,可以使用C#或VB.NET进行编程。在EmguCV中实现活体检测可以通过不同的方法来完成。 活体检测是指通过对人脸进行分析和识别,判断所检测到的人脸是否为真实的人脸而不是照片或视频的播放。以下是使用EmguCV进行活体检测的步骤和方法: 1. 人脸检测:首先,使用EmguCV提供的人脸检测器(如Haar级联分类器)对图像进行人脸检测。这将帮助我们找到输入图像中的人脸。 2. 关键点检测:通过使用EmguCV提供的关键点检测器(如DLib库),可以检测人脸关键点,例如眼睛、鼻子和嘴巴等位置。这些关键点可以用于进一步的活体检测。 3. 提取特征:使用关键点检测结果,可以提取人脸的一些特征,例如眼睛区域的纹理、嘴巴的形状等。 4. 活体检测算法:基于提取的特征,可以使用不同的活体检测算法来判断人脸是否为真实的。一种常见的方法是基于视觉刺激反应,例如使用眨眼检测来验证眼睛是否有眨眼动作,并结合其他特征进行判断。 5. 结果分析和判断:根据活体检测算法的结果,可以判断所检测到的人脸是否为真人。 总的来说,使用EmguCV进行活体检测需要进行人脸检测、关键点检测和特征提取等步骤,然后应用相应的活体检测算法来判断人脸的真实性。这样可以帮助我们提高人脸识别的安全性,防止伪造攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值