C#利用百度云进行驾驶证和行驶证的识别

其实这个功能还是个非常简单实现的功能相对于调微信的接口来说,有时候调微信的接口让人有一种想打人的冲动,每次朋友都劝我 没办法用别人的东西你就将就点 我。。。。。。。

好吧 废话不多说  首要前提是开通百度云账号

先上文档:在文字识别的api文档里

驾驶证识别

对机动车驾驶证所有关键字段进行识别

public void DrivingLicenseDemo() {
    var image = File.ReadAllBytes("图片文件路径");
    // 调用驾驶证识别,可能会抛出网络等异常,请使用try/catch捕获
    var result = client.DrivingLicense(image);
    Console.WriteLine(result);
    // 如果有可选参数
    var options = new Dictionary<string, object>{
        {"detect_direction", "true"}
    };
    // 带参数调用驾驶证识别
    result = client.DrivingLicense(image, options);
    Console.WriteLine(result);
}

驾驶证识别 请求参数详情

参数名称是否必选类型可选值范围默认值说明
imagebyte[]  二进制图像数据
detect_directionstringtrue
false
false是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。

行驶证识别

对机动车行驶证正本所有关键字段进行识别

public void VehicleLicenseDemo() {
    var image = File.ReadAllBytes("图片文件路径");
    // 调用行驶证识别,可能会抛出网络等异常,请使用try/catch捕获
    var result = client.VehicleLicense(image);
    Console.WriteLine(result);
    // 如果有可选参数
    var options = new Dictionary<string, object>{
        {"detect_direction", "true"},
        {"accuracy", "normal"}
    };
    // 带参数调用行驶证识别
    result = client.VehicleLicense(image, options);
    Console.WriteLine(result);
}

行驶证识别 请求参数详情

参数名称是否必选类型可选值范围默认值说明
imagebyte[]  二进制图像数据
detect_directionstringtrue
false
false是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
accuracystringnormal - 使用快速服务 normal 使用快速服务,1200ms左右时延;缺省或其它值使用高精度服务,1600ms左右时延

 那么就根据文档一步步来  

第一步百度云需要获取接口实例:

 /// <summary>
        /// 获取百度云接口类实例
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private Baidu.Aip.Ocr.Ocr GetClient(string input)
        {
            Baidu.Aip.Ocr.Ocr client = null;
            if (!string.IsNullOrEmpty(_appConfigurationAccessor.Configuration["BaiDuAI:IsEnabled"]))
            {
                switch (input)
                {
                    case "CharacterRecog":
                        client = new Baidu.Aip.Ocr.Ocr(_appConfigurationAccessor
                .Configuration["BaiDuAI:CharacterRecog:ApiKey"], _appConfigurationAccessor.Configuration["BaiDuAI:CharacterRecog:SecretKey"]);
                        client.Timeout = 60000; // 修改超时时间
                        break;
                    default:
                        break;
                }


            }

            return client;
        }

 配置里配置了百度云的apikey和SecretKey所以直接取就行了  这里的入参只是区别是驾驶证识别还是行驶证识别而已

2.图片的处理:百度只接受Base64的图片格式

 /// <summary>
        /// 获取图片字节
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private byte[] GetUrlImageToBase64(Stream stream)
        {
            try
            {

                Bitmap bmp = new Bitmap(stream);
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length);
                ms.Close();
                return arr;
            }
            catch (Exception ex)
            {
                throw new UserFriendlyException("图片转byte[]发生错误:" + ex.ToString());
            }


        }

然后根据出参定义其实体类(这里以驾驶证为例)

 public class DrivingLicenceResult
    {

       
            public long log_id { get; set; }
            public int direction { get; set; }
            public int words_result_num { get; set; }
            public Words_Result words_result { get; set; }
        

        public class Words_Result
        {
            public 证号 证号 { get; set; }

            public 有效起始日期 有效起始日期 { get; set; }
            public 有效期限 有效期限 { get; set; }
            public 准驾车型 准驾车型 { get; set; }
            public 住址 住址 { get; set; }
            public 至 至 { get; set; }
            public 姓名 姓名 { get; set; }
            public 国籍 国籍 { get; set; }
            public 出生日期 出生日期 { get; set; }
            public 性别 性别 { get; set; }
            public 初次领证日期 初次领证日期 { get; set; }
        }

        public class 证号
        {
            public string words { get; set; }
        }
        public class 有效起始日期
        {
            public string words { get; set; }
        }

        public class 有效期限
        {
            public string words { get; set; }
        }

        public class 准驾车型
        {
            public string words { get; set; }
        }

        public class 住址
        {
            public string words { get; set; }
        }

        public class 至
        {
            public string words { get; set; }
        }

        public class 姓名
        {
            public string words { get; set; }
        }

        public class 国籍
        {
            public string words { get; set; }
        }

        public class 出生日期
        {
            public string words { get; set; }
        }

        public class 性别
        {
            public string words { get; set; }
        }

        public class 初次领证日期
        {
            public string words { get; set; }
        }

    }

然后就是调用接口进行识别了

 /// <summary>
        /// 驾驶证识别并存储信息
        /// </summary>
        private UploadFilesOutput IdentificationDrivingLicence(byte[] byteImage, long driverInfoId)
        {
            UploadFilesOutput uploadFilesOutput = new UploadFilesOutput();
            var client = GetClient(_appConfigurationAccessor.Configuration["BaiDuAI:Type"]);
            if (client == null)
            {
                throw new UserFriendlyException("接口实例化失败!请认真核对配置信息");
            }
            try
            {
                var result = client.DrivingLicense(byteImage);
                DrivingLicenceResult drivingLicenceResult = JsonConvert.DeserializeObject<DrivingLicenceResult>(result.ToString());
                if (drivingLicenceResult != null)//返回成功标志
                {
                    DriverLicenceInfo driverLicenceInfo = new DriverLicenceInfo();

                    driverLicenceInfo.No = drivingLicenceResult.words_result.证号.words;
                    driverLicenceInfo.Address = drivingLicenceResult.words_result.住址.words;

                    DateTime birthdate;
                    if (DateTime.TryParseExact(drivingLicenceResult.words_result.出生日期.words, "yyyyMMdd", CultureInfo.CurrentCulture, DateTimeStyles.None, out birthdate))
                    {
                        driverLicenceInfo.Birthdate = birthdate;
                    }

                    driverLicenceInfo.CreationTime = Clock.Now;
                    driverLicenceInfo.Name = drivingLicenceResult.words_result.姓名.words;
                    driverLicenceInfo.Validity = drivingLicenceResult.words_result.至 != null ? drivingLicenceResult.words_result.至.words : drivingLicenceResult.words_result.有效期限.words;
                    driverLicenceInfo.DriverInfoId = driverInfoId;
                    driverLicenceInfo.Nationality = drivingLicenceResult.words_result.国籍.words;
                    driverLicenceInfo.QuasiDrivingType = drivingLicenceResult.words_result.准驾车型.words;


                    DateTime effectiveDate;
                    if (DateTime.TryParseExact(drivingLicenceResult.words_result.有效起始日期 != null ?
                                                                               drivingLicenceResult.words_result.有效起始日期.words
                                                                               : drivingLicenceResult.words_result.有效期限.words, "yyyyMMdd"
                                                                            , CultureInfo.CurrentCulture
                                                                            , DateTimeStyles.None
                                                                            , out effectiveDate))
                    {
                        driverLicenceInfo.EffectiveDate = effectiveDate;
                    }

                    driverLicenceInfo.Gender = drivingLicenceResult.words_result.性别.words.Equals("男") ? GenderEnum.Male : GenderEnum.Female;
                    driverLicenceInfo.IsDeleted = false;

                    DateTime dateOfInitialLicensing;
                    if (DateTime.TryParseExact(drivingLicenceResult.words_result.初次领证日期.words, "yyyyMMdd"
                                                                            , CultureInfo.CurrentCulture
                                                                            , DateTimeStyles.None
                                                                            , out dateOfInitialLicensing))
                    {
                        driverLicenceInfo.DateOfInitialLicensing = dateOfInitialLicensing;
                    }

                    driverLicenceInfo.IsConfirmed = false;

                    var driverLicenceInfoId = _driverLicenceInfoRepository.InsertAndGetId(driverLicenceInfo);
                    uploadFilesOutput.DriverLicenceInfoId = driverLicenceInfoId;
                    uploadFilesOutput.DriverLicenceInfoDto = driverLicenceInfo;
                }

                return uploadFilesOutput;


            }
            catch (UserFriendlyException ex)
            {
                throw new UserFriendlyException("使用百度识别驾驶证信息时发生错误:" + ex.Message);
            }
        }

那么行驶证的也是和驾驶证差不多的啦 希望可以帮助到大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值