C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录

腾讯云人脸核身技术

Craneoffice.net 采用的识别方式

        1、活体人脸核身(权威库):

        2、活体人脸比对:

        3、照片人脸核身(权威库):

调用成本

百度云身份证识别

调用成本

相关结合点

核心代码

实现调用人脸核身API的示例 

实现调用身份证识别API的示例 

小结


腾讯云人脸核身技术

根据腾讯云的官方介绍,其慧眼人脸核身是一组对用户身份信息真实性进行验证审核的服务套件,提供人脸核身、身份信息核验、银行卡要素核验和运营商类要素核验等各类实名信息认证能力,以解决行业内大量对用户身份信息核实的需求。

Craneoffice.net 采用的识别方式

由于其产品众多,考虑一些综合因素,我们在 Craneoffice.net 架构里主要实现以下三种识别方式:

        1、活体人脸核身(权威库):

         流程为通过录制一段人脸活体静态视频,与大数据权威库身份证信息进行比对,判断是否为 同一人。

        2、活体人脸比对:

         流程为通过上传正确、清晰的身份证正面图片,截取头像图片,再通过录制人脸活体静态视频进行比对,判断是否为同一人。

        3、照片人脸核身(权威库):

         流程为上传正确的身份证正面图片,截取头像图片,传递身份证号与姓名,与大数据权威库身份证信息进行比对,判断是否为同一人。

调用成本

申请开发账号及具体费用情况请访问腾讯云人脸核身产品首页:

https://cloud.tencent.com/act/pro/huiyandiscount

我们的产品调用成本如下表,可参照一下比例,在此仅供参考:

识别方式调用成功的成本
活体人脸核身(权威库)1元 / 每次
活体人脸比对0.15元 / 每次
照片人脸核身(权威库)1元 / 每次

总之,在腾讯云商城购买越大的产品包调用成本越低,如果有优惠活动则更为合适。

百度云身份证识别

其官方宣传可以结构化识别二代居民身份证正反面所有8个字段,识别准确率超过99%;支持识别混贴身份证,适用于同一张图上有多张身份证正反面的场景;支持检测身份证正面头像,并返回头像切片的base64编码及位置信息,其具体详细产品介绍请访问如下地址:

https://ai.baidu.com/tech/ocr_cards/idcard

调用成本

我们使用的是企业申请,一个月应该可以享受2000次免费调用,后期调用应该是0.02元左右每次,具体可参照:

https://ai.baidu.com/ai-doc/OCR/fk3h7xune#%E8%BA%AB%E4%BB%BD%E8%AF%81%E8%AF%86%E5%88%AB

相关结合点

在人脸核身方面,虽然我们可以直接提供身份证号、姓名、自拍抠图的头像BASE64编码等参数传递给腾讯云识别接口,但考虑到实际应用场景中,更加规范、有效的验证有助于提升应用程序数据的质量和精准性,也更加保障了识别结果的准确性。

因此身份证的识别功能和人脸核身功能即可以单独独立运行,又可以利用产品特性相结合,实现数据采集、校验的双保险。

具体流程如下图:

核心代码

实现调用人脸核身API的示例 

该示例代码以上小节的介绍的三种识别方式实现,仅供参考:

//定义人脸识别类
            public class FaceR
            {
                public string ResultJson = "";   //记录返回 json 结果
                public string apiurl = "faceid.tencentcloudapi.com"; //腾讯人脸识别API地址
                public string debuginfo = "";  //调试信息
                public string ErrorMessage = "";  //错误信息
                string[] signHeaders = null;      //头部签名数组
                
                public FaceR()
                {
                }

//活体人脸核身方法,参数为身份证号;检验类型,这里传固定值 SILENT;姓名;活体的静态视频编码;方法返回相似度值等信息
                public string LivenessRecognition(string IdCard,string LivenessType,string Name,string VideoBase64)
                {
                    string content = "{  \"IdCard\":\"" + IdCard + "\",\"LivenessType\":\"" + LivenessType + "\", \"Name\":\"" + Name + "\" ,\"VideoBase64\":\"" + VideoBase64 + "\"}";
                    // 密钥参数
                    string SECRET_ID = 你申请的ID
                    string SECRET_KEY = 你申请的KEY

                    string service = "faceid";
                    string endpoint = "faceid.tencentcloudapi.com";
                    string region = "ap-guangzhou";
                    string action = "LivenessRecognition";
                    string version = "2018-03-01";

                    // 注意时区,建议此时间统一采用UTC时间戳,否则容易出错
                    DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);
                    date = DateTime.UtcNow;
                    string requestPayload = content;

                    Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service
                        , endpoint, region, action, version, date, requestPayload);

                    string rv = "POST https://faceid.tencentcloudapi.com\n";
                    ArrayList hs = new ArrayList();
                    foreach (KeyValuePair<string, string> kv in headers)
                    {
                        rv += (kv.Key + ": " + kv.Value) + "\n";
                        hs.Add(kv.Key + ": " + kv.Value);
                    }
                    rv += "\n";
                    hs.Add("");
                    rv += requestPayload + "\n";
                    string[] hss = new string[hs.Count];
                    debuginfo = "";
                    for (int i = 0; i < hs.Count; i++)
                    {
                        hss[i] = hs[i].ToString();
                        debuginfo += hss[i] + "\r\n";
                    }
                    signHeaders = hss;
                    string rvs = "";
                    rvs=GetResponseResult("https://faceid.tencentcloudapi.com", Encoding.UTF8, "POST",content, signHeaders);
                    return rvs;
                }



//活体人脸比对方法,参数为传递检验类型,这里传固定值 SILEN;身份证头像图片编码;活体的静态视频编码,方法返回相似度值等信息
                public string LivenessCompare(string LivenessType, string ImageBase64, string VideoBase64)
                {
                    string content = "{ \"LivenessType\":\"" + LivenessType + "\", \"ImageBase64\":\"" + ImageBase64 + "\" ,\"VideoBase64\":\"" + VideoBase64 + "\"}";
                    // 密钥参数
                    string SECRET_ID = 你申请的ID
                    string SECRET_KEY = 你申请的KEY

                    string service = "faceid";
                    string endpoint = "faceid.tencentcloudapi.com";
                    string region = "ap-guangzhou";
                    string action = "LivenessCompare";
                    string version = "2018-03-01";

                    // 注意时区,建议此时间统一采用UTC时间戳,否则容易出错
                    DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);
                    date = DateTime.UtcNow;
                    string requestPayload = content;

                    Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service
                        , endpoint, region, action, version, date, requestPayload);

                    string rv = "POST https://faceid.tencentcloudapi.com\n";
                    ArrayList hs = new ArrayList();
                    foreach (KeyValuePair<string, string> kv in headers)
                    {
                        rv += (kv.Key + ": " + kv.Value) + "\n";
                        hs.Add(kv.Key + ": " + kv.Value);
                    }
                    rv += "\n";
                    hs.Add("");
                    rv += requestPayload + "\n";
                    string[] hss = new string[hs.Count];
                    debuginfo = "";
                    for (int i = 0; i < hs.Count; i++)
                    {
                        hss[i] = hs[i].ToString();
                        debuginfo += hss[i] + "\r\n";
                    }
                    signHeaders = hss;
                    string rvs = "";
                    rvs = GetResponseResult("https://faceid.tencentcloudapi.com", Encoding.UTF8, "POST", content, signHeaders);
                    return rvs;
                }



//照片人脸核身方法,参数传递身份证号;姓名;截取的身份证头像图片编码;方法返回相似度值等信息
                public string ImageRecognition(string IdCard,string Name, string ImageBase64)
                {
                    string content = "{ \"IdCard\":\"" + IdCard + "\", \"Name\":\"" + HttpUtility.UrlDecode(Name, Encoding.UTF8) + "\" ,\"ImageBase64\":\"" + ImageBase64 + "\"}";
                    // 密钥参数
                    string SECRET_ID = 你申请的ID
                    string SECRET_KEY = 你申请的KEY

                    string service = "faceid";
                    string endpoint = "faceid.tencentcloudapi.com";
                    string region = "ap-guangzhou";
                    string action = "ImageRecognition";
                    string version = "2018-03-01";

                    // 注意时区,建议此时间统一采用UTC时间戳,否则容易出错
                    DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(1551113065);
                    date = DateTime.UtcNow;
                    string requestPayload = content;

                    Dictionary<string, string> headers = BuildHeaders(SECRET_ID, SECRET_KEY, service
                        , endpoint, region, action, version, date, requestPayload);

                    string rv = "POST https://faceid.tencentcloudapi.com\n";
                    ArrayList hs = new ArrayList();
                    foreach (KeyValuePair<string, string> kv in headers)
                    {
                        rv += (kv.Key + ": " + kv.Value) + "\n";
                        hs.Add(kv.Key + ": " + kv.Value);
                    }
                    rv += "\n";
                    hs.Add("");
                    rv += requestPayload + "\n";
                    string[] hss = new string[hs.Count];
                    debuginfo = "";
                    for (int i = 0; i < hs.Count; i++)
                    {
                        hss[i] = hs[i].ToString();
                        debuginfo += hss[i] + "\r\n";
                    }
                    signHeaders = hss;
                    string rvs = "";
                    rvs = GetResponseResult("https://faceid.tencentcloudapi.com", Encoding.UTF8, "POST", content, signHeaders);
                    return rvs;
                }

                //SHA256Hex算法
                public static string SHA256Hex(string s)
                {
                    using (SHA256 algo = SHA256.Create())
                    {
                        byte[] hashbytes = algo.ComputeHash(Encoding.UTF8.GetBytes(s));
                        StringBuilder builder = new StringBuilder();
                        for (int i = 0; i < hashbytes.Length; ++i)
                        {
                            builder.Append(hashbytes[i].ToString("x2"));
                        }
                        return builder.ToString();
                    }
                }
               

                //HMAC-SHA256算法
                public static byte[] HmacSHA256(byte[] key, byte[] msg)
                {
                    using (HMACSHA256 mac = new HMACSHA256(key))
                    {
                        return mac.ComputeHash(msg);
                    }
                }


                //构造头部签名
                public static Dictionary<String, String> BuildHeaders(string secretid,
                    string secretkey, string service, string endpoint, string region,
                    string action, string version, DateTime date, string requestPayload)
                {
                    string datestr = date.ToString("yyyy-MM-dd");
                    DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                    long requestTimestamp = (long)Math.Round((date - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero) / 1000;
                    // ************* 步骤 1:拼接规范请求串 *************
                    string algorithm = "TC3-HMAC-SHA256";
                    string httpRequestMethod = "POST";
                    string canonicalUri = "/";
                    string canonicalQueryString = "";
                    string contentType = "application/json";
                    string canonicalHeaders = "content-type:" + contentType + "; charset=utf-8\n"
                        + "host:" + endpoint + "\n"
                        + "x-tc-action:" + action.ToLower() + "\n";
                    string signedHeaders = "content-type;host;x-tc-action";
                    string hashedRequestPayload = SHA256Hex(requestPayload);
                    string canonicalRequest = httpRequestMethod + "\n"
                        + canonicalUri + "\n"
                        + canonicalQueryString + "\n"
                        + canonicalHeaders + "\n"
                        + signedHeaders + "\n"
                        + hashedRequestPayload;
                    Console.WriteLine(canonicalRequest);

                    // ************* 步骤 2:拼接待签名字符串 *************
                    string credentialScope = datestr + "/" + service + "/" + "tc3_request";
                    string hashedCanonicalRequest = SHA256Hex(canonicalRequest);
                    string stringToSign = algorithm + "\n"
                        + requestTimestamp.ToString() + "\n"
                        + credentialScope + "\n"
                        + hashedCanonicalRequest;
                    Console.WriteLine(stringToSign);

                    // ************* 步骤 3:计算签名 *************
                    byte[] tc3SecretKey = Encoding.UTF8.GetBytes("TC3" + secretkey);
                    byte[] secretDate = HmacSHA256(tc3SecretKey, Encoding.UTF8.GetBytes(datestr));
                    byte[] secretService = HmacSHA256(secretDate, Encoding.UTF8.GetBytes(service));
                    byte[] secretSigning = HmacSHA256(secretService, Encoding.UTF8.GetBytes("tc3_request"));
                    byte[] signatureBytes = HmacSHA256(secretSigning, Encoding.UTF8.GetBytes(stringToSign));
                    string signature = BitConverter.ToString(signatureBytes).Replace("-", "").ToLower();
                    Console.WriteLine(signature);

                    // ************* 步骤 4:拼接 Authorization *************
                    string authorization = algorithm + " "
                        + "Credential=" + secretid + "/" + credentialScope + ", "
                        + "SignedHeaders=" + signedHeaders + ", "
                        + "Signature=" + signature;
                    Console.WriteLine(authorization);

                    Dictionary<string, string> headers = new Dictionary<string, string>();
                    headers.Add("Authorization", authorization);
                    headers.Add("Host", endpoint);
                    headers.Add("Content-Type", contentType + "; charset=utf-8");
                    headers.Add("X-TC-Timestamp", requestTimestamp.ToString());
                    headers.Add("X-TC-Version", version);
                    headers.Add("X-TC-Action", action);
                    headers.Add("X-TC-Region", region);
                    return headers;
                }





                //调用API地址,传递参数并获取返回值的通用方法
                public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData, string[] headers, string ContentType = "application/x-www-form-urlencoded")
                {
                    method = method.ToUpper();
                    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
                    if (method == "GET")
                    {
                        try
                        {
                            WebRequest request2 = WebRequest.Create(@url);
                            request2.Method = method;
                            WebResponse response2 = request2.GetResponse();
                            Stream stream = response2.GetResponseStream();
                            StreamReader reader = new StreamReader(stream, encoding);
                            string content = reader.ReadToEnd();
                            return content;
                        }
                        catch (Exception ex)
                        {
                            ErrorMessage = ex.Message;
                            return "";
                        }

                    }
                    Stream outstream = null;
                    Stream instream = null;
                    StreamReader sr = null;
                    HttpWebResponse response = null;
                    HttpWebRequest request = null;
                    byte[] data = encoding.GetBytes(postData);
                    // 准备请求...
                    try
                    {
                        // 设置参数
                        request = WebRequest.Create(url) as HttpWebRequest;
                        CookieContainer cookieContainer = new CookieContainer();
                        request.CookieContainer = cookieContainer;
                        request.AllowAutoRedirect = true;
                        request.Method = method;
                        debuginfo = headers.GetLength(0).ToString()+"\r\n";
                        if (headers != null)
                        {
                            for (int i = 0; i < headers.GetLength(0); i++)
                            {
                                if (headers[i].Split(':').Length < 2)
                                {
                                    continue;
                                }
                                debuginfo += i.ToString()+headers[i]+"\r\n";

                                if (headers[i].Split(':').Length > 1)
                                {
                                    if (headers[i].Split(':')[0] == "Host")
                                    {
                                        request.Host = headers[i].Split(':')[1].Trim();
                                        continue;
                                    }
                                    else if (headers[i].Split(':')[0] == "Content-Type")
                                    {
                                        request.ContentType = headers[i].Split(':')[1].Trim();
                                        ContentType = headers[i].Split(':')[1].Trim();
                                        continue;
                                    }
                                }
                                request.Headers.Add(headers[i].Trim());
                            }
                            debuginfo += "sd2" + "\r\n";

                        }
                        request.ContentType = ContentType;
                        request.ContentLength = data.Length;
                        outstream = request.GetRequestStream();
                        outstream.Write(data, 0, data.Length);
                        outstream.Close();
                        //发送请求并获取相应回应数据
                        response = request.GetResponse() as HttpWebResponse;
                        //直到request.GetResponse()程序才开始向目标网页发送Post请求
                        instream = response.GetResponseStream();
                        sr = new StreamReader(instream, encoding);
                        //返回结果网页(html)代码
                        string content = sr.ReadToEnd();
                        return content;
                    }
                    catch (Exception ex)
                    {
                        ErrorMessage = ex.Message;
                        return "";
                    }
                }//get response result

            }

实现调用身份证识别API的示例 

                public class IdCard
                {
                    public string name = "";        //姓名
                    public string sex = "";         //性别
                    public string photo_base64 = "";    //截取的身份证头像图像的编码值 
                    public string nation = "";       //民族
                    public string address = "";      //住址
                    public string IDNumber = "";      //身份证号
                    public string birthday = "";      //生日
                    public string org = "";           //发证机关
                    public string startDate = "";      //有效期起
                    public string endDate = "";        //有效期止
                    public string ResultJson = "";     //记录返回的JSON值
                    public string ErrorMessage = "";   //记录错误信息
                    public string direction = "";        //上传时图片的方向
                    public string image_status = "";     //上传图片的识别状态
                    public string risk_type = "";        //上传图片的识别类型
                    public string edit_tool = "";        //上传图片是否P图
                    public string idcard_number_type = "";   //上传图片的识别错误信息
                    public IdCard()
                    {
                    }

                    //得到指定文件的 byte[],参数为文件绝对路径值
                    private  byte[] getImageByte(string imagePath)
                    {
                        FileStream files = new FileStream(imagePath, FileMode.Open);
                        byte[] imgByte = new byte[files.Length];
                        files.Read(imgByte, 0, imgByte.Length);
                        files.Close();
                        return imgByte;
                    }


               //识别身份证信息方法,参数为文件绝对路径值;正反面值:正面传 front,反面传 back
                    public void valid(string imagePath, string id_card_side)
                    {
                         name = "";
                         sex = "";
                         photo_base64 = "";
                         nation = "";
                         address = "";
                         IDNumber = "";
                         birthday = "";
                         org = "";
                         startDate = "";
                         endDate = "";
                        direction="";
                        image_status = "";
                        risk_type = "";
                        edit_tool = "";
                        idcard_number_type = "";
                        byte[] image = getImageByte(imagePath);
                        var APP_ID = 申请的开发ID;
                        var API_KEY = 申请的开发KEY;
                        var SECRET_KEY = 开发密钥;

                        var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);

                        client.Timeout = 60000;  // 修改超时时间
                        Newtonsoft.Json.Linq.JObject result = new JObject();
                        var options = new Dictionary<string, object>{
                        {"detect_risk", "true"},
	                    {"detect_direction", "true"},
	                    {"detect_photo", "true"}
    	                };
                        try
                        {
                            result = client.Idcard(image, id_card_side, options);
                            ResultJson = result.ToString();
                            if (id_card_side == "front")
                            {
                                name = result["words_result"]["姓名"]["words"].ToString();
                                sex = result["words_result"]["性别"]["words"].ToString();
                                nation = result["words_result"]["民族"]["words"].ToString();
                                address = result["words_result"]["住址"]["words"].ToString();
                                IDNumber = result["words_result"]["公民身份号码"]["words"].ToString();
                                photo_base64 = result["photo"].ToString();
                                birthday = result["words_result"]["出生"]["words"].ToString();
                                birthday = birthday.Substring(0, 4) + "-" + birthday.Substring(4, 2) + "-" + birthday.Substring(6, 2);
                            }
                            if (id_card_side == "back")
                            {
                                org = result["words_result"]["签发机关"]["words"].ToString();
                                startDate = result["words_result"]["签发日期"]["words"].ToString();
                                startDate = startDate.Substring(0, 4) + "-" + startDate.Substring(4, 2) + "-" + startDate.Substring(6, 2);
                                endDate = result["words_result"]["失效日期"]["words"].ToString();
                                endDate = endDate.Substring(0, 4) + "-" + endDate.Substring(4, 2) + "-" + endDate.Substring(6, 2);
                            }
                            direction = result["direction"].ToString();
                            switch (direction)
                            {
                                case "-1":
                                    direction = "未定义";
                                    break;
                                case "0":
                                    direction = "正向";
                                    break;
                                case "1":
                                    direction = "逆时针90度";
                                    break;
                                case "2":
                                    direction = "逆时针180度";
                                    break;
                                case "3":
                                    direction = "逆时针270度";
                                    break;

                            }
                            image_status = result["image_status"].ToString();
                            switch (image_status)
                            {
                                case "normal":
                                    image_status = "识别正常";
                                    break;
                                case "reversed_side":
                                    image_status = "身份证正反面颠倒";
                                    break;
                                case "non_idcard":
                                    image_status = "上传的图片中不包含身份证";
                                    break;
                                case "blurred":
                                    image_status = "身份证模糊";
                                    break;
                                case "other_type_card":
                                    image_status = "其他类型证照";
                                    break;
                                case "over_exposure":
                                    image_status = "身份证关键字段反光或过曝";
                                    break;
                                case "over_dark":
                                    image_status = "身份证欠曝(亮度过低)";
                                    break;
                                case "unknown":
                                    image_status = "未知状态";
                                    break;

                            }
                            risk_type = result["risk_type"].ToString();
                            switch (risk_type)
                            {
                                case "normal":
                                    risk_type = "正常身份证";
                                    break;
                                case "copy":
                                    risk_type = "复印件";
                                    break;
                                case "temporary":
                                    risk_type = "临时身份证";
                                    break;
                                case "screen":
                                    risk_type = "翻拍";
                                    break;
                                case "unknown":
                                    risk_type = "其他未知情况";
                                    break;

                            }
                            if (ResultJson.IndexOf("edit_tool") != -1)
                            {
                                edit_tool = result["edit_tool"].ToString();
                            }
                            else
                            {
                                edit_tool = "未P图";
                            }
                            if (ResultJson.IndexOf("idcard_number_type") != -1)
                            {
                                idcard_number_type = result["idcard_number_type"].ToString();
                                switch (idcard_number_type)
                                {
                                    case "-1":
                                        idcard_number_type = "身份证正面所有字段全为空";
                                        break;
                                    case "0":
                                        idcard_number_type = "身份证证号识别错误";
                                        break;
                                    case "1":
                                        idcard_number_type = "身份证证号和性别、出生信息一致";
                                        break;
                                    case "2":
                                        idcard_number_type = "身份证证号和性别、出生信息都不一致";
                                        break;
                                    case "3":
                                        idcard_number_type = "身份证证号和出生信息不一致";
                                        break;
                                    case "4":
                                        idcard_number_type = "身份证证号和性别信息不一致";
                                        break;

                                }
                            }
                        }
                        catch (Exception e)
                        {
                            ErrorMessage = e.Message;
                        }
                    }
                  }// idcard

小结

采用哪种识别方式,要根据我们在实际的应用场景中进行选择,而且也需要考虑调用的成本(本文涉及的调用成本仅供参考)。这里讲述的几种方案是我们自研产品中所采用的方式,腾讯云的人脸核身产品分支很多,大家可以根据具体需求进行选择、扩充自己的产品功能。

再次感谢您的阅读,欢迎大家讨论指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/103703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序设置 wx.showModal 提示框中 确定和取消按钮的颜色

wx官方提供的 showModal 无疑是个非常优秀的选择提示工具 但是 我们还可以让他的颜色更贴近整体的小程序风格 cancelColor 可以改变取消按钮的颜色 confirmColor 则可以控制确定按钮的颜色 参考代码如下 wx.showModal({cancelColor: #0000FF,confirmColor: #45B250,content:…

行业追踪,2023-10-25

自动复盘 2023-10-25 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

如何构建一个外卖微信小程序

随着外卖行业的不断发展&#xff0c;越来越多的商家开始关注外卖微信小程序的开发。微信小程序具有使用方便、快速上线、用户覆盖广等优势&#xff0c;成为了商家们的首选。 那么&#xff0c;如何快速开发一个外卖微信小程序呢&#xff1f;下面就让我们来看看吧&#xff01; 首…

Python Opencv实践 - 入门使用Tesseract识别图片中的文字

做车牌识别项目前试一试tesseract识别中文。tesseract的安装使用请参考&#xff1a; Python OCR工具pytesseract详解 - 知乎pytesseract是基于Python的OCR工具&#xff0c; 底层使用的是Google的Tesseract-OCR 引擎&#xff0c;支持识别图片中的文字&#xff0c;支持jpeg, png…

面试题之Vue和React的区别是什么?

一提到前端框架&#xff0c;相信大家都对Vue和React不陌生&#xff0c;这两个前端框架都是比较主流的&#xff0c;用户也都比较多&#xff0c;但是我们在使用这些框架的时候&#xff0c;是否对这两个框架之间的区别有所了解呢&#xff1f;接下来&#xff0c;让我们来一起的系统…

RK3399平台开发中安卓系统去除USB权限弹窗

RK3399平台开发中安卓系统去除USB权限弹窗 问题方法 问题 当我们在访问一个插入到Android系统的USB设备的时候往往是需要权限的&#xff0c;此时系统会弹出询问权限的对话框&#xff0c;而我们此时希望让它默认允许访问USB设备并且不希望用户看到这个对话框。 方法 文件目录&…

Git不常用命令(持续更新)

今日鸡汤&#xff1a;当你最满足的时候&#xff0c;通常也最孤独&#xff1b;当你最愤慨的时候&#xff0c;通常也最可怜。 此博文会列出一些平时不常用&#xff0c;但是能提高效率的git命令&#xff0c;后续会出IDEA对应的操作步骤 快看看你是不是都用过... 分支&#xff08;…

蓝桥算法赛(铺地板)

问题描述 小蓝家要装修了&#xff0c;小蓝爸爸买来了很多块&#xff08;你可以理解为数量无限&#xff09; 23 规格的地砖&#xff0c;小蓝家的地板是 nm 规格的&#xff0c;小蓝想问你&#xff0c;能否用这些 23 的地砖铺满地板。 铺满地板&#xff1a;对于地板的每个区域&…

C语言-面试题实现有序序列合并

要求&#xff1a; a.输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤n,m≤1000 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤val≤30000 输入描述&#xff1a; 1.输入包含三行&#xff0c; 2.第一行包含两个正整数n, m&am…

Kubernetes 的有状态和无状态服务

Author&#xff1a;rab 目录 前言一、无状态服务案例1.1 yml 案例1.2 扩容与缩容1.2.1 扩容1.2.2 缩容 1.3 暂停与恢复1.3.1 暂停1.3.2 恢复 1.4 回滚 二、有状态服务案例2.1 yml 案例2.2 扩容与缩容2.2.1 扩容2.2.2 缩容 总结 前言 在 Kubernetes&#xff08;k8s&#xff09;…

(Java)中的数据类型和变量

文章目录 一、字面常量二、数据类型三、变量1.变量的概念2.语法的格式3.整型变量4.长整型变量5.短整型变量6.字节型变量 四、浮点型变量1.双精度浮点数2.单精度浮点数 五、字符型常量六、布尔型变量七、类型转换1.自动类型转换&#xff08;隐式&#xff09;2.强制类型转换(显式…

SCT52240STDR双路 4A/4A 高速MOSFET/IGBT栅极驱动器, 可并联输出

SCT52240是是一款宽供电电压、双通道、高速、低测栅极驱动器&#xff0c;包括功率MOSFET&#xff0c;IGBT。单个通道能够提供高达4A拉电流和4A灌电流的轨到轨驱动能力&#xff0c;并实现轨到轨输出。高达24V宽电压范围提高功率器件开关瞬间栅极驱动的振铃幅值裕度。13ns输入输出…

Pytorch公共数据集、tensorboard、DataLoader使用

本文将主要介绍torchvision.datasets的使用&#xff0c;并以CIFAR-10为例进行介绍&#xff0c;对可视化工具tensorboard进行介绍&#xff0c;包括安装&#xff0c;使用&#xff0c;可视化过程等&#xff0c;最后介绍DataLoader的使用。希望对你有帮助 Pytorch公共数据集 torc…

如何理解某一个开发框架的意图,从而去写和落代码文件位置不会出错

理解一个开发框架的意图并正确地组织代码和文件位置是一个重要的技能。这不仅需要对框架本身有深入的理解&#xff0c;还需要对框架背后的设计哲学和最佳实践有所了解。以下是一些帮助你达到这一目标的步骤和建议&#xff1a; 1. 学习框架的文档 详细阅读: 开始使用任何框架前…

【数据结构】数组和字符串(四):特殊矩阵的压缩存储:稀疏矩阵——三元组表

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表结构体初始化元素设置打印矩阵主函数输出结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串&#xff08;一&#xff…

前端请求后台接口失败处理逻辑

前后分离项目&#xff0c;前端为uni-app&#xff08;vue2&#xff09;&#xff0c;后台为java 后台api设置存在问题&#xff0c;部分公共接口为开放非登录用户访问权限 导致前台打开首页后立即跳转到登录提示页 怀疑是开了uni-app开发代理服务器&#xff0c;导致访问的代理服务…

Kubernetes 通过 Deployment 部署Jupyterlab

概要 在Kubernetes上部署jupyterlab服务&#xff0c;链接Kubernetes集群内的MySQL&#xff0c;实现简单的数据开发功能。 前置条件 镜像准备&#xff1a;自定义Docker镜像--Jupyterlab-CSDN博客 MySQL-Statefulset准备&#xff1a;StatefulSet 简单实践 Kubernetes-CSDN博客…

利用MATLAB创建栅格地图(代码可复制)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

C语言 每日一题 PTA 10.21-10.24日 day3

1.计算分段函数[1] 本题目要求计算下列分段函数f(x)的值&#xff1a; yf(x)1/x x!0 yf(x)0 x0 int main() {double num 0;scanf("%lf", &num);double result 0;if (num 0){result 0;}else{result 1 / num;}printf("f(%.1lf)%.1lf", num, result)…

通俗介绍:什么是 Redis ?

刚接触 Redis 的伙伴们可能会因为不熟悉而感到困惑。本文简述 Redis 是什么、有哪些作用的问题&#xff0c;是一篇短浅而入门级别的文章。 Redis官网&#xff1a;Redis 打开 Redis 官网可以看到&#xff0c;官方对 Redis 的介绍是这样的&#xff1a;The open source, in-memo…