Emgu 边缘检测,Triangle2DF[]画三角形,MCvBox2D[]画矩形

程序配图

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emgu.CV.Util;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;

//Emgu image<,>将pictureBox1控件中的图像读入
//Memstorage对OpenCV的cvMemStorage的封装
namespace ContourFinding
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string strFileName = string.Empty;
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Image<Bgr, Byte> img1 = new Image<Bgr, Byte>(ofd.FileName);
                pictureBox1.Image = img1.ToBitmap();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //将pictureBox1控件中的图像读入
            Image<Bgr, Byte> img1 = new Image<Bgr, byte>(new Bitmap(pictureBox1.Image));
            //转换为灰度图像,然后对img1滤除噪声
            Image<Gray, Byte> gray1 = img1.Convert<Gray, Byte>().PyrDown().PyrUp();
            //Canny算子边缘检测
            Image<Gray, Byte> cannyGray = gray1.Canny(120, 180);

            //存储三角形和矩形的列表
            //三角形
            List<Triangle2DF> triangleList = new List<Triangle2DF>();
            List<MCvBox2D> boxList = new List<MCvBox2D>();
            //实例化Memstorage,对OpenCV的cvMemStorage的封装
            //Contour轮廓
            //
            using (MemStorage storage1 = new MemStorage())
                for (Contour<Point> contours1 = cannyGray.FindContours(); contours1 != null; contours1 = contours1.HNext)
                {
                    //多边形逼近
                    Contour<Point> contoursAP = contours1.ApproxPoly(contours1.Perimeter * 0.05, storage1);
                    //利用区域面积判断
                    if (contours1.Area >= 200)
                    {
                        //用顶点数量来决定形状
                        if (contoursAP.Total == 3)
                        {
                            //三角形
                            Point[] points = contoursAP.ToArray();
                            triangleList.Add(new Triangle2DF(
                                points[0],
                                points[1],
                                points[2]
                                ));
                        }
                        else if (contoursAP.Total == 4)
                        { 
                            //四边形
                            bool isRectangle = true;
                            Point[] points = contoursAP.ToArray();
                            LineSegment2D[] edges = PointCollection.PolyLine(points, true);
                            //在[ 75,105 ]的范围内将被检测
                            for (int i = 0; i < edges.Length; i++)
                            {
                                double angle = Math.Abs(
                                   edges[(i + 1) % edges.Length].GetExteriorAngleDegree(edges[i]));
                                if (angle < 75 || angle > 105)
                                {
                                    isRectangle = false;
                                    break;
                                }
                            }
                            if (isRectangle)
                            {
                                boxList.Add(contoursAP.GetMinAreaRect());
                            }
                        }
                    }
                }
            //Draw result
            Image<Bgr, Byte> imageResult = img1.CopyBlank();
            foreach (Triangle2DF triangle in triangleList)
                imageResult.Draw(triangle, new Bgr(Color.LightSteelBlue), 5);
            foreach (MCvBox2D box in boxList)
                imageResult.Draw(box, new Bgr(Color.LimeGreen), 5);
            //Show result
            pictureBox2.Image = imageResult.ToBitmap();
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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进行活体检测需要进行人脸检测、关键点检测和特征提取等步骤,然后应用相应的活体检测算法来判断人脸的真实性。这样可以帮助我们提高人脸识别的安全性,防止伪造攻击。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值