在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 本地摄像头抓拍 示例源码

C# 本地摄像头抓拍 示例源码

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:55.53M
  • 下载次数:34
  • 浏览次数:445
  • 发布时间:2018-11-29
  • 实例类别:C#语言基础
  • 发 布 人:红豆杉
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 摄像头 摄像

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

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 System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Diagnostics;
using System.Threading;
using AmFaceVerify;

namespace ArcsoftFaceTest
{
    public partial class Form1 : Form
    {
        byte[] firstFeature;

        byte[] secondFeature;

        //人脸检测引擎
        IntPtr detectEngine = IntPtr.Zero;

        //人脸识别引擎
        IntPtr regcognizeEngine = IntPtr.Zero;

        //拖拽线程
        private Thread threadMultiExec;

        //构造函数
        public Form1()
        {
            InitializeComponent();
        }

        //把图片转成byte[]
        private byte[] getBGR(Bitmap image, ref int width, ref int height, ref int pitch)
        {
            //Bitmap image = new Bitmap(imgPath);

            const PixelFormat PixelFormat = PixelFormat.Format24bppRgb;

            BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat);

            IntPtr ptr = data.Scan0;

            int ptr_len = data.Height * Math.Abs(data.Stride);

            byte[] ptr_bgr = new byte[ptr_len];

            Marshal.Copy(ptr, ptr_bgr, 0, ptr_len);

            width = data.Width;

            height = data.Height;

            pitch = Math.Abs(data.Stride);

            int line = width * 3;

            int bgr_len = line * height;

            byte[] bgr = new byte[bgr_len];

            for (int i = 0; i < height;   i)
            {
                Array.Copy(ptr_bgr, i * pitch, bgr, i * line, line);
            }

            pitch = line;

            image.UnlockBits(data);

            return bgr;
        }

        //选择第一张照片
        private void button4_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();

            openFile.Filter = "图片文件|*.bmp;*.jpg;*.jpeg;*.png|所有文件|*.*;";

            openFile.Multiselect = false;

            openFile.FileName = "";

            if (openFile.ShowDialog() == DialogResult.OK)
            {
                this.pictureBox1.Image = null;

                Image image = Image.FromFile(openFile.FileName);

                this.pictureBox1.Image = new Bitmap(image);

                image.Dispose();

                firstFeature = detectAndExtractFeature(this.pictureBox1.Image, 1);
            }
        }

        //选择第二张照片
        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();

            openFile.Filter = "图片文件|*.bmp;*.jpg;*.jpeg;*.png|所有文件|*.*;";

            openFile.Multiselect = false;

            openFile.FileName = "";

            if (openFile.ShowDialog() == DialogResult.OK)
            {
                this.pictureBox2.Image = null;

                Image image = Image.FromFile(openFile.FileName);

                this.pictureBox2.Image = new Bitmap(image);

                image.Dispose();

                secondFeature = detectAndExtractFeature(this.pictureBox2.Image, 2);
            }

        }

        //提取识别出的人脸
        public static Bitmap CutFace(Bitmap srcImage, int StartX, int StartY, int iWidth, int iHeight)
        {
            if (srcImage == null)
            {
                return null;
            }

            int w = srcImage.Width;

            int h = srcImage.Height;

            if (StartX >= w || StartY >= h)
            {
                return null;
            }
            if (StartX   iWidth > w)
            {
                iWidth = w - StartX;
            }
            if (StartY   iHeight > h)
            {
                iHeight = h - StartY;
            }
            try
            {
                Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);

                Graphics g = Graphics.FromImage(bmpOut);

                g.DrawImage(srcImage, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);

                g.Dispose();

                return bmpOut;
            }
            catch
            {
                return null;
            }
        }

        //获取相似度
        private void button3_Click(object sender, EventArgs e)
        {
            float similar = 0f;

            AFR_FSDK_FACEMODEL localFaceModels = new AFR_FSDK_FACEMODEL();

            IntPtr firstFeaturePtr = Marshal.AllocHGlobal(firstFeature.Length);

            Marshal.Copy(firstFeature, 0, firstFeaturePtr, firstFeature.Length);

            localFaceModels.lFeatureSize = firstFeature.Length;

            localFaceModels.pbFeature = firstFeaturePtr;

            IntPtr secondFeaturePtr = Marshal.AllocHGlobal(secondFeature.Length);

            Marshal.Copy(secondFeature, 0, secondFeaturePtr, secondFeature.Length);

            AFR_FSDK_FACEMODEL localFaceModels2 = new AFR_FSDK_FACEMODEL();

            localFaceModels2.lFeatureSize = secondFeature.Length;

            localFaceModels2.pbFeature = secondFeaturePtr;

            IntPtr firstPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels));

            Marshal.StructureToPtr(localFaceModels, firstPtr, false);

            IntPtr secondPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels2));

            Marshal.StructureToPtr(localFaceModels2, secondPtr, false);

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            int result = AmFaceVerify.AFR_FSDK_FacePairMatching(regcognizeEngine, firstPtr, secondPtr, ref similar);

            stopwatch.Stop();

            setControlText(this.label1, "相似度:"   similar.ToString()   " 耗时:"   stopwatch.ElapsedMilliseconds.ToString()   "ms");

            //this.label1.Text = "相似度:"   similar.ToString()   " 耗时:"   stopwatch.ElapsedMilliseconds.ToString()   "ms";

            localFaceModels = new AFR_FSDK_FACEMODEL();

            Marshal.FreeHGlobal(firstFeaturePtr);

            Marshal.FreeHGlobal(secondFeaturePtr);

            Marshal.FreeHGlobal(firstPtr);

            Marshal.FreeHGlobal(secondPtr);

            localFaceModels2 = new AFR_FSDK_FACEMODEL();
        }

        //检测人脸、提取特征
        private byte[] detectAndExtractFeature(Image imageParam, int firstSecondFlg)
        {
            byte[] feature = null;

            try
            {
                Console.WriteLine();

                Console.WriteLine("############### Face Detect Start #########################");

                int width = 0;

                int height = 0;

                int pitch = 0;

                Bitmap bitmap = new Bitmap(imageParam);

                byte[] imageData = getBGR(bitmap, ref width, ref height, ref pitch);

                //GCHandle hObject = GCHandle.Alloc(imageData, GCHandleType.Pinned);

                //IntPtr imageDataPtr = hObject.AddrOfPinnedObject();

                IntPtr imageDataPtr = Marshal.AllocHGlobal(imageData.Length);

                Marshal.Copy(imageData, 0, imageDataPtr, imageData.Length);

                ASVLOFFSCREEN offInput = new ASVLOFFSCREEN();

                offInput.u32PixelArrayFormat = 513;

                offInput.ppu8Plane = new IntPtr[4];

                offInput.ppu8Plane[0] = imageDataPtr;

                offInput.i32Width = width;

                offInput.i32Height = height;

                offInput.pi32Pitch = new int[4];

                offInput.pi32Pitch[0] = pitch;

                AFD_FSDK_FACERES faceRes = new AFD_FSDK_FACERES();

                IntPtr offInputPtr = Marshal.AllocHGlobal(Marshal.SizeOf(offInput));

                Marshal.StructureToPtr(offInput, offInputPtr, false);

                IntPtr faceResPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceRes));

                //Marshal.StructureToPtr(faceRes, faceResPtr, false);

                Console.WriteLine("StartTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"));

                Stopwatch watchTime = new Stopwatch();

                watchTime.Start();
                //人脸检测
                int detectResult = AmFaceVerify.AFD_FSDK_StillImageFaceDetection(detectEngine, offInputPtr, ref faceResPtr);

                watchTime.Stop();

                if (firstSecondFlg == 1)
                {
                    setControlText(this.label5, String.Format("检测耗时:{0}ms", watchTime.ElapsedMilliseconds));

                    //this.label5.Text = String.Format("检测耗时:{0}ms", watchTime.ElapsedMilliseconds);
                }
                else if (firstSecondFlg == 2)
                {
                    setControlText(this.label2, String.Format("检测耗时:{0}ms", watchTime.ElapsedMilliseconds));

                    //this.label2.Text = String.Format("检测耗时:{0}ms", watchTime.ElapsedMilliseconds);
                }

                object obj = Marshal.PtrToStructure(faceResPtr, typeof(AFD_FSDK_FACERES));

                faceRes = (AFD_FSDK_FACERES)obj;

                Console.WriteLine("  Face Count:{0}", faceRes.nFace);

                for (int i = 0; i < faceRes.nFace; i  )
                {
                    MRECT rect = (MRECT)Marshal.PtrToStructure(faceRes.rcFace   Marshal.SizeOf(typeof(MRECT)) * i, typeof(MRECT));

                    int orient = (int)Marshal.PtrToStructure(faceRes.lfaceOrient   Marshal.SizeOf(typeof(int)) * i, typeof(int));

                    if (i == 0)
                    {
                        Image image = CutFace(bitmap, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);

                        if (firstSecondFlg == 1)
                        {
                            this.pictureBox3.Image = image;
                        }
                        else if (firstSecondFlg == 2)
                        {
                            this.pictureBox4.Image = image;
                        }
                    }

                    Console.WriteLine("    left:{0} top:{1} right:{2} bottom:{3} orient:{4}", rect.left, rect.top, rect.right, rect.bottom, orient);
                }

                Console.WriteLine("  EndTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"));

                Console.WriteLine("############### Face Detect End   #########################");

                if (faceRes.nFace > 0)
                {
                    Console.WriteLine();

                    Console.WriteLine("############### Face Recognition Start #########################");

                    AFR_FSDK_FACEINPUT faceResult = new AFR_FSDK_FACEINPUT();

                    int orient = (int)Marshal.PtrToStructure(faceRes.lfaceOrient, typeof(int));

                    faceResult.lfaceOrient = orient;

                    faceResult.rcFace = new MRECT();

                    MRECT rect = (MRECT)Marshal.PtrToStructure(faceRes.rcFace, typeof(MRECT));

                    faceResult.rcFace = rect;

                    IntPtr faceResultPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceResult));

                    Marshal.StructureToPtr(faceResult, faceResultPtr, false);

                    AFR_FSDK_FACEMODEL localFaceModels = new AFR_FSDK_FACEMODEL();

                    IntPtr localFaceModelsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels));

                    //Marshal.StructureToPtr(localFaceModels, localFaceModelsPtr, false);

                    watchTime.Start();

                    int extractResult = AmFaceVerify.AFR_FSDK_ExtractFRFeature(regcognizeEngine, offInputPtr, faceResultPtr, localFaceModelsPtr);

                    Marshal.FreeHGlobal(faceResultPtr);

                    Marshal.FreeHGlobal(offInputPtr);

                    watchTime.Stop();

                    if (firstSecondFlg == 1)
                    {
                        setControlText(this.label3, String.Format("抽取特征耗时:{0}ms", watchTime.ElapsedMilliseconds));

                        //this.label3.Text = String.Format("抽取特征耗时:{0}ms", watchTime.ElapsedMilliseconds);
                    }
                    else if (firstSecondFlg == 2)
                    {
                        setControlText(this.label4, String.Format("抽取特征耗时:{0}ms", watchTime.ElapsedMilliseconds));

                        //this.label4.Text = String.Format("抽取特征耗时:{0}ms", watchTime.ElapsedMilliseconds);
                    }

                    object objFeature = Marshal.PtrToStructure(localFaceModelsPtr, typeof(AFR_FSDK_FACEMODEL));

                    Marshal.FreeHGlobal(localFaceModelsPtr);

                    localFaceModels = (AFR_FSDK_FACEMODEL)objFeature;

                    feature = new byte[localFaceModels.lFeatureSize];

                    Marshal.Copy(localFaceModels.pbFeature, feature, 0, localFaceModels.lFeatureSize);

                    localFaceModels = new AFR_FSDK_FACEMODEL();

                    Console.WriteLine("############### Face Recognition End   #########################");

                }

                bitmap.Dispose();

                imageData = null;

                Marshal.FreeHGlobal(imageDataPtr);

                offInput = new ASVLOFFSCREEN();

                faceRes = new AFD_FSDK_FACERES();

                //Marshal.FreeHGlobal(faceResPtr);
            }
            catch (Exception e)
            {
                LogHelper.WriteErrorLog("detect", e.Message   "\n"   e.StackTrace);
            }
            return feature;
        }

        //初始化
        private void Form1_Load(object sender, EventArgs e)
        {
            #region 初始化人脸检测引擎

            int detectSize = 40 * 1024 * 1024;

            IntPtr pMem = Marshal.AllocHGlobal(detectSize);

            //1-1
            //string appId = "4tnYSJ68e8wztSo4Cf7WvbyMZduHwpqtThAEM3obMWbE";

            //1-1
            //string sdkKey = "Cgbaq34izc8PA2Px26x8qqWTQn2P5vxijaWKdUrdCwYT";

            //1-n
            string appId = "4tnYSJ68e8wztSo4Cf7Wvbz6Y3UFa7sYbRpM78FrKa1b";

            //1-n
            string sdkKey = "ACWCx3meGjZyWCYCUE3gG4NmrhG2q8MzjcZKQHfSL935";

            //人脸检测引擎初始化
            int retCode = AmFaceVerify.AFD_FSDK_InitialFaceEngine(appId, sdkKey, pMem, detectSize, ref detectEngine, 5, 50, 1);

            //获取人脸检测引擎版本
            IntPtr versionPtr = AmFaceVerify.AFD_FSDK_GetVersion(detectEngine);

            AFD_FSDK_Version version = (AFD_FSDK_Version)Marshal.PtrToStructure(versionPtr, typeof(AFD_FSDK_Version));

            Console.WriteLine("lCodebase:{0} lMajor:{1} lMinor:{2} lBuild:{3} Version:{4} BuildDate:{5} CopyRight:{6}", version.lCodebase, version.lMajor, version.lMinor, version.lBuild, Marshal.PtrToStringAnsi(version.Version), Marshal.PtrToStringAnsi(version.BuildDate), Marshal.PtrToStringAnsi(version.CopyRight));

            //Marshal.FreeHGlobal(versionPtr);

            #endregion

            #region 初始化人脸识别引擎

            int recognizeSize = 40 * 1024 * 1024;

            IntPtr pMemDetect = Marshal.AllocHGlobal(recognizeSize);

            //1-1
            //string appIdDetect = "4tnYSJ68e8wztSo4Cf7WvbyMZduHwpqtThAEM3obMWbE";

            //1-1
            //string sdkKeyDetect = "Cgbaq34izc8PA2Px26x8qqWaaBHbPD7wWMcTU6xe8VRo";

            //1-n
            string appIdDetect = "4tnYSJ68e8wztSo4Cf7Wvbz6Y3UFa7sYbRpM78FrKa1b";

            //1-n
            string sdkKeyDetect = "ACWCx3meGjZyWCYCUE3gG4PGWJJfTYJKx22ztQFVkAjG";

            //人脸识别引擎初始化
            retCode = AmFaceVerify.AFR_FSDK_InitialEngine(appIdDetect, sdkKeyDetect, pMemDetect, recognizeSize, ref regcognizeEngine);

            //获取人脸识别引擎版本
            IntPtr versionPtrDetect = AmFaceVerify.AFR_FSDK_GetVersion(regcognizeEngine);

            AFR_FSDK_Version versionDetect = (AFR_FSDK_Version)Marshal.PtrToStructure(versionPtrDetect, typeof(AFR_FSDK_Version));

            Console.WriteLine("lCodebase:{0} lMajor:{1} lMinor:{2} lBuild:{3} lFeatureLevel:{4} Version:{5} BuildDate:{6} CopyRight:{7}", versionDetect.lCodebase, versionDetect.lMajor, versionDetect.lMinor, versionDetect.lBuild, versionDetect.lFeatureLevel, Marshal.PtrToStringAnsi(versionDetect.Version), Marshal.PtrToStringAnsi(versionDetect.BuildDate), Marshal.PtrToStringAnsi(versionDetect.CopyRight));

            #endregion
        }

        //拖拽事件
        private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            // Extract the data from the DataObject-Container into a string list
            string[] fileList = (string[])e.Data.GetData(DataFormats.FileDrop, false);

            if (fileList.Length >= 2)
            {
                this.threadMultiExec = new Thread(new ParameterizedThreadStart(multiCompare));

                this.threadMultiExec.Start(new object[] { fileList });

                this.threadMultiExec.IsBackground = true;
            }

        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            // Check if the Dataformat of the data can be accepted
            // (we only accept file drops from Explorer, etc.)
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Copy; // Okay
            }
            else
            {
                e.Effect = DragDropEffects.None; // Unknown data, ignore it
            }
        }

        //多线程设置PictureBox的图像
        private void setPictureBoxControlImage(PictureBox control, Bitmap value)
        {
            control.Invoke(new Action<PictureBox, Bitmap>((ct, v) => { ct.Image = v; }), new object[] { control, value });
        }

        //多线程设置控件的文本
        private void setControlText(Control control, string value)
        {
            control.Invoke(new Action<Control, string>((ct, v) => { ct.Text = v; }), new object[] { control, value });
        }

        //比对多个图片
        private void multiCompare(object args)
        {
            object[] objs = args as object[];

            string[] fileList = (string[])objs[0];

            for (int i = 0; i < fileList.Length; i  )
            {

                Image image = Image.FromFile(fileList[i]);

                //this.pictureBox1.Image = null;

                //this.pictureBox1.Image = new Bitmap(image);

                setPictureBoxControlImage(this.pictureBox1, new Bitmap(image));

                firstFeature = detectAndExtractFeature(image, 1);

                image.Dispose();

                if (firstFeature == null)
                {

                    continue;
                }

                if (i   1 >= fileList.Length)
                {

                    continue;
                }

                Image image2 = Image.FromFile(fileList[  i]);

                //this.pictureBox2.Image = null;

                // this.pictureBox2.Image = new Bitmap(image2);

                setPictureBoxControlImage(this.pictureBox2, new Bitmap(image2));

                secondFeature = detectAndExtractFeature(image2, 2);

                image2.Dispose();

                if (secondFeature == null)
                {

                    continue;
                }

                button3_Click(null, null);

                setControlText(this.label6, "正在处理:"   (i   1).ToString());

                //label6.Text = "正在处理:"   (i   1).ToString();

                //this.Update();

                Thread.Sleep(10);

            }

        }
    }
}

标签: 摄像头 摄像

实例下载地址

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警