C#人脸对比服务(基于虹软人脸识别SDKV4.1封装)

目录

效果

项目

代码

下载 


效果

 

项目

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Nancy;
using NLog;
using System.Diagnostics;
using System.IO;
using System.Drawing;
using ArcFaceSDK.Entity;
using Newtonsoft.Json;
using ArcFaceSDK.SDKModels;

namespace ArcSoftFaceService.Controller
{
    public class ViewFaceModule : NancyModule
    {
        private Logger _log = NLog.LogManager.GetCurrentClassLogger();

        private readonly static object _locker = new object();

        public ViewFaceModule()
            : base("/faceApi")
        {
            After.AddItemToEndOfPipeline((ctx) => ctx.Response
            .WithHeader("Access-Control-Allow-Origin", "*")
            .WithHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
            .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type"));

            Post["/faceRecognition"] = p =>
           {
               return FaceRecognizeByBase64();
           };
        }

        private dynamic FaceRecognizeByBase64()
        {
            Stopwatch sw = Stopwatch.StartNew();
            sw.Start();
            AjaxReturn ar = new AjaxReturn();
            ar.code = 0;
            ar.message = "ok";
            ar.similarity = 0;

            string ContentType = Request.Headers.ContentType;
            string base64str = null;
            string base64str2 = null;

            if (ContentType == "application/x-www-form-urlencoded")
            {
                base64str = Request.Form["zp1"];
                base64str2 = Request.Form["zp2"];
            }
            else if (ContentType == "application/json")
            {
                string postData = Request.Body.AsString();
                if (!string.IsNullOrEmpty(postData))
                {
                    ReqPicParameter reqPic = JsonConvert.DeserializeObject<ReqPicParameter>(postData);
                    base64str = reqPic.zp1;
                    base64str2 = reqPic.zp2;
                }
            }

            if (string.IsNullOrEmpty(base64str))
            {
                ar.code = 0;
                ar.message = "参数[zp1]不能为空";
            }
            else if (string.IsNullOrEmpty(base64str2))
            {
                ar.code = 0;
                ar.message = "参数[zp2]不能为空";
            }
            else
            {
                try
                {
                    //TODO 图片大小判断??

                    Image srcImage1 = StringToImage(base64str);
                    //调整图像宽度,需要宽度为4的倍数
                    if (srcImage1.Width % 4 != 0)
                    {
                        srcImage1 = ImageUtil.ScaleImage(srcImage1, srcImage1.Width - (srcImage1.Width % 4), srcImage1.Height);
                    }

                    //人脸检测
                    MultiFaceInfo multiFaceInfo1;
                    int retCode = Program.imageEngine.ASFDetectFacesEx(srcImage1, out multiFaceInfo1);
                    if (retCode != 0)
                    {
                        ar.code = 0;
                        ar.message = "图像人脸检测失败,请稍后重试!";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo1.faceNum < 1)
                    {
                        ar.code = 0;
                        ar.message = "图片1未检测出人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo1.faceNum >1)
                    {
                        ar.code = 0;
                        ar.message = "图片1检测出多张人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    SingleFaceInfo singleFaceInfo1;
                    bool isMask1;
                    string faceFeatureStr1 = string.Empty;
                    FaceFeature feature1 = FaceUtil.ExtractFeature(Program.imageEngine
                           , srcImage1
                           , Program.thresholdImgNoMask
                           , Program.thresholdImgMask
                           , ASF_RegisterOrNot.ASF_RECOGNITION
                           , out singleFaceInfo1
                           , out isMask1
                           , ref faceFeatureStr1
                           , out retCode
                           , 0);

                    if (feature1.featureSize == 0)
                    {
                        ar.code = 0;
                        ar.message = "图片1提取特征失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    //活体检测
                    int retCodeLiveness1 = -1;
                    LivenessInfo liveInfo1 = FaceUtil.LivenessInfo_RGB(Program.imageEngine, srcImage1, singleFaceInfo1, out retCodeLiveness1);
                    //活体检测结果
                    if (retCodeLiveness1.Equals(0) && liveInfo1.num > 0)
                    {
                        if (liveInfo1.isLive[0]!=1)
                        {
                            string livenessResult = CommonUtil.TransLivenessResult(liveInfo1.isLive[0]);
                            ar.code = 0;
                            ar.message = "图片1活体结果:" + livenessResult;
                            ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                            _log.Info(JsonConvert.SerializeObject(ar));
                            sw.Stop();
                            return Response.AsJson<AjaxReturn>(ar);
                        }
                       
                    }
                    else
                    {
                        ar.code = 0;
                        ar.message = "图片1活体检测失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    Image srcImage2 = StringToImage(base64str2);
                    //调整图像宽度,需要宽度为4的倍数
                    if (srcImage2.Width % 4 != 0)
                    {
                        srcImage2 = ImageUtil.ScaleImage(srcImage2, srcImage2.Width - (srcImage2.Width % 4), srcImage2.Height);
                    }

                    //人脸检测
                    MultiFaceInfo multiFaceInfo2;
                    int retCode2 = Program.imageEngine.ASFDetectFacesEx(srcImage2, out multiFaceInfo2);
                    if (retCode2 != 0)
                    {
                        ar.code = 0;
                        ar.message = "图像人脸检测失败,请稍后重试!";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo2.faceNum < 1)
                    {
                        ar.code = 0;
                        ar.message = "图片2未检测出人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo2.faceNum > 1)
                    {
                        ar.code = 0;
                        ar.message = "图片2检测出多张人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    SingleFaceInfo singleFaceInfo2;
                    bool isMask2;
                    string faceFeatureStr2 = string.Empty;
                    FaceFeature feature2 = FaceUtil.ExtractFeature(Program.imageEngine
                           , srcImage2
                           , Program.thresholdImgNoMask
                           , Program.thresholdImgMask
                           , ASF_RegisterOrNot.ASF_RECOGNITION
                           , out singleFaceInfo2
                           , out isMask2
                           , ref faceFeatureStr2
                           , out retCode2
                           , 0);

                    if (feature2.featureSize == 0)
                    {
                        ar.code = 0;
                        ar.message = "图片2提取特征失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    //活体检测
                    int retCodeLiveness2 = -1;
                    LivenessInfo liveInfo2 = FaceUtil.LivenessInfo_RGB(Program.imageEngine, srcImage2, singleFaceInfo2, out retCodeLiveness2);
                    //活体检测结果
                    if (retCodeLiveness2.Equals(0) && liveInfo2.num > 0)
                    {
                        if (liveInfo2.isLive[0] != 1)
                        {
                            string livenessResult = CommonUtil.TransLivenessResult(liveInfo2.isLive[0]);
                            ar.code = 0;
                            ar.message = "图片2活体结果:" + livenessResult;
                            ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                            _log.Info(JsonConvert.SerializeObject(ar));
                            sw.Stop();
                            return Response.AsJson<AjaxReturn>(ar);
                        }
                    }
                    else
                    {
                        ar.code = 0;
                        ar.message = "图片2活体检测失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    float similarity = 0f;
                    Program.imageEngine.ASFFaceFeatureCompare(feature1, feature2, out similarity, Program.compareModel);
                    //增加异常值处理
                    if (similarity.ToString().IndexOf("E") > -1)
                    {
                        similarity = 0f;
                    }

                    ar.code = 1;
                    ar.similarity = similarity;
                    ar.message = "ok";

                    srcImage1.Dispose();
                    srcImage2.Dispose();
                }
                catch (Exception ex)
                {
                    ar.code = 0;
                    ar.message = "识别异常:" + ex.Message;
                }

            }

            ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
            _log.Info(JsonConvert.SerializeObject(ar));
            sw.Stop();
            return Response.AsJson<AjaxReturn>(ar);
        }

        public Bitmap ByteToImage(byte[] bytes)
        {
            if (bytes == null)
            {
                return null;
            }
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                Bitmap bmp = new Bitmap(ms);
                SaveBitMap(bmp);
                ms.Close();
                return bmp;
            }
        }

        public bool SaveBitMap(Bitmap bmp)
        {
            if (Program.saveImg == "0")
            {
                return true;
            }

            try
            {
                string path = System.Windows.Forms.Application.StartupPath + "\\img";
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                string filename = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mmssffff") + ".jpeg";
                bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);//保存到服务器路径
                return true;
            }
            catch (Exception e)
            {
                _log.Error("SaveBitMap 保存图片出错", e);
                return false;
            }
        }

        /// <summary>
        /// base64编码的文本转为图片
        /// </summary>
        /// <param name="inputStr"></param>
        /// <returns></returns>
        public Bitmap StringToImage(string inputStr)
        {
            if (string.IsNullOrEmpty(inputStr))
            {
                return null;
            }
            byte[] arr = Convert.FromBase64String(inputStr.Trim());
            using (MemoryStream ms = new MemoryStream(arr))
            {
                Bitmap bmp = new Bitmap(ms);
                SaveBitMap(bmp);
                ms.Close();
                return bmp;
            }
        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Nancy;
using NLog;
using System.Diagnostics;
using System.IO;
using System.Drawing;
using ArcFaceSDK.Entity;
using Newtonsoft.Json;
using ArcFaceSDK.SDKModels;

namespace ArcSoftFaceService.Controller
{
    public class ViewFaceModule : NancyModule
    {
        private Logger _log = NLog.LogManager.GetCurrentClassLogger();

        private readonly static object _locker = new object();

        public ViewFaceModule()
            : base("/faceApi")
        {
            After.AddItemToEndOfPipeline((ctx) => ctx.Response
            .WithHeader("Access-Control-Allow-Origin", "*")
            .WithHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
            .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type"));

            Post["/faceRecognition"] = p =>
           {
               return FaceRecognizeByBase64();
           };
        }

        private dynamic FaceRecognizeByBase64()
        {
            Stopwatch sw = Stopwatch.StartNew();
            sw.Start();
            AjaxReturn ar = new AjaxReturn();
            ar.code = 0;
            ar.message = "ok";
            ar.similarity = 0;

            string ContentType = Request.Headers.ContentType;
            string base64str = null;
            string base64str2 = null;

            if (ContentType == "application/x-www-form-urlencoded")
            {
                base64str = Request.Form["zp1"];
                base64str2 = Request.Form["zp2"];
            }
            else if (ContentType == "application/json")
            {
                string postData = Request.Body.AsString();
                if (!string.IsNullOrEmpty(postData))
                {
                    ReqPicParameter reqPic = JsonConvert.DeserializeObject<ReqPicParameter>(postData);
                    base64str = reqPic.zp1;
                    base64str2 = reqPic.zp2;
                }
            }

            if (string.IsNullOrEmpty(base64str))
            {
                ar.code = 0;
                ar.message = "参数[zp1]不能为空";
            }
            else if (string.IsNullOrEmpty(base64str2))
            {
                ar.code = 0;
                ar.message = "参数[zp2]不能为空";
            }
            else
            {
                try
                {
                    //TODO 图片大小判断??

                    Image srcImage1 = StringToImage(base64str);
                    //调整图像宽度,需要宽度为4的倍数
                    if (srcImage1.Width % 4 != 0)
                    {
                        srcImage1 = ImageUtil.ScaleImage(srcImage1, srcImage1.Width - (srcImage1.Width % 4), srcImage1.Height);
                    }

                    //人脸检测
                    MultiFaceInfo multiFaceInfo1;
                    int retCode = Program.imageEngine.ASFDetectFacesEx(srcImage1, out multiFaceInfo1);
                    if (retCode != 0)
                    {
                        ar.code = 0;
                        ar.message = "图像人脸检测失败,请稍后重试!";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo1.faceNum < 1)
                    {
                        ar.code = 0;
                        ar.message = "图片1未检测出人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo1.faceNum >1)
                    {
                        ar.code = 0;
                        ar.message = "图片1检测出多张人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    SingleFaceInfo singleFaceInfo1;
                    bool isMask1;
                    string faceFeatureStr1 = string.Empty;
                    FaceFeature feature1 = FaceUtil.ExtractFeature(Program.imageEngine
                           , srcImage1
                           , Program.thresholdImgNoMask
                           , Program.thresholdImgMask
                           , ASF_RegisterOrNot.ASF_RECOGNITION
                           , out singleFaceInfo1
                           , out isMask1
                           , ref faceFeatureStr1
                           , out retCode
                           , 0);

                    if (feature1.featureSize == 0)
                    {
                        ar.code = 0;
                        ar.message = "图片1提取特征失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    //活体检测
                    int retCodeLiveness1 = -1;
                    LivenessInfo liveInfo1 = FaceUtil.LivenessInfo_RGB(Program.imageEngine, srcImage1, singleFaceInfo1, out retCodeLiveness1);
                    //活体检测结果
                    if (retCodeLiveness1.Equals(0) && liveInfo1.num > 0)
                    {
                        if (liveInfo1.isLive[0]!=1)
                        {
                            string livenessResult = CommonUtil.TransLivenessResult(liveInfo1.isLive[0]);
                            ar.code = 0;
                            ar.message = "图片1活体结果:" + livenessResult;
                            ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                            _log.Info(JsonConvert.SerializeObject(ar));
                            sw.Stop();
                            return Response.AsJson<AjaxReturn>(ar);
                        }
                       
                    }
                    else
                    {
                        ar.code = 0;
                        ar.message = "图片1活体检测失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    Image srcImage2 = StringToImage(base64str2);
                    //调整图像宽度,需要宽度为4的倍数
                    if (srcImage2.Width % 4 != 0)
                    {
                        srcImage2 = ImageUtil.ScaleImage(srcImage2, srcImage2.Width - (srcImage2.Width % 4), srcImage2.Height);
                    }

                    //人脸检测
                    MultiFaceInfo multiFaceInfo2;
                    int retCode2 = Program.imageEngine.ASFDetectFacesEx(srcImage2, out multiFaceInfo2);
                    if (retCode2 != 0)
                    {
                        ar.code = 0;
                        ar.message = "图像人脸检测失败,请稍后重试!";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo2.faceNum < 1)
                    {
                        ar.code = 0;
                        ar.message = "图片2未检测出人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    if (multiFaceInfo2.faceNum > 1)
                    {
                        ar.code = 0;
                        ar.message = "图片2检测出多张人脸";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    SingleFaceInfo singleFaceInfo2;
                    bool isMask2;
                    string faceFeatureStr2 = string.Empty;
                    FaceFeature feature2 = FaceUtil.ExtractFeature(Program.imageEngine
                           , srcImage2
                           , Program.thresholdImgNoMask
                           , Program.thresholdImgMask
                           , ASF_RegisterOrNot.ASF_RECOGNITION
                           , out singleFaceInfo2
                           , out isMask2
                           , ref faceFeatureStr2
                           , out retCode2
                           , 0);

                    if (feature2.featureSize == 0)
                    {
                        ar.code = 0;
                        ar.message = "图片2提取特征失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    //活体检测
                    int retCodeLiveness2 = -1;
                    LivenessInfo liveInfo2 = FaceUtil.LivenessInfo_RGB(Program.imageEngine, srcImage2, singleFaceInfo2, out retCodeLiveness2);
                    //活体检测结果
                    if (retCodeLiveness2.Equals(0) && liveInfo2.num > 0)
                    {
                        if (liveInfo2.isLive[0] != 1)
                        {
                            string livenessResult = CommonUtil.TransLivenessResult(liveInfo2.isLive[0]);
                            ar.code = 0;
                            ar.message = "图片2活体结果:" + livenessResult;
                            ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                            _log.Info(JsonConvert.SerializeObject(ar));
                            sw.Stop();
                            return Response.AsJson<AjaxReturn>(ar);
                        }
                    }
                    else
                    {
                        ar.code = 0;
                        ar.message = "图片2活体检测失败";
                        ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
                        _log.Info(JsonConvert.SerializeObject(ar));
                        sw.Stop();
                        return Response.AsJson<AjaxReturn>(ar);
                    }

                    float similarity = 0f;
                    Program.imageEngine.ASFFaceFeatureCompare(feature1, feature2, out similarity, Program.compareModel);
                    //增加异常值处理
                    if (similarity.ToString().IndexOf("E") > -1)
                    {
                        similarity = 0f;
                    }

                    ar.code = 1;
                    ar.similarity = similarity;
                    ar.message = "ok";

                    srcImage1.Dispose();
                    srcImage2.Dispose();
                }
                catch (Exception ex)
                {
                    ar.code = 0;
                    ar.message = "识别异常:" + ex.Message;
                }

            }

            ar.elapsedmilliseconds = sw.ElapsedMilliseconds;
            _log.Info(JsonConvert.SerializeObject(ar));
            sw.Stop();
            return Response.AsJson<AjaxReturn>(ar);
        }

        public Bitmap ByteToImage(byte[] bytes)
        {
            if (bytes == null)
            {
                return null;
            }
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                Bitmap bmp = new Bitmap(ms);
                SaveBitMap(bmp);
                ms.Close();
                return bmp;
            }
        }

        public bool SaveBitMap(Bitmap bmp)
        {
            if (Program.saveImg == "0")
            {
                return true;
            }

            try
            {
                string path = System.Windows.Forms.Application.StartupPath + "\\img";
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                string filename = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mmssffff") + ".jpeg";
                bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);//保存到服务器路径
                return true;
            }
            catch (Exception e)
            {
                _log.Error("SaveBitMap 保存图片出错", e);
                return false;
            }
        }

        /// <summary>
        /// base64编码的文本转为图片
        /// </summary>
        /// <param name="inputStr"></param>
        /// <returns></returns>
        public Bitmap StringToImage(string inputStr)
        {
            if (string.IsNullOrEmpty(inputStr))
            {
                return null;
            }
            byte[] arr = Convert.FromBase64String(inputStr.Trim());
            using (MemoryStream ms = new MemoryStream(arr))
            {
                Bitmap bmp = new Bitmap(ms);
                SaveBitMap(bmp);
                ms.Close();
                return bmp;
            }
        }

    }
}

下载 

代码下载

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天代码码天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值