目錄
騰訊云人臉核身技術(shù)
Craneoffice.net 采用的識(shí)別方式
? ? ? ? 1、活體人臉核身(權(quán)威庫(kù)):
? ? ? ? 2、活體人臉比對(duì):
? ? ? ? 3、照片人臉核身(權(quán)威庫(kù)):
調(diào)用成本
百度云身份證識(shí)別
調(diào)用成本
相關(guān)結(jié)合點(diǎn)
核心代碼
實(shí)現(xiàn)調(diào)用人臉核身API的示例?
實(shí)現(xiàn)調(diào)用身份證識(shí)別API的示例?
小結(jié)
騰訊云人臉核身技術(shù)
根據(jù)騰訊云的官方介紹,其慧眼人臉核身是一組對(duì)用戶身份信息真實(shí)性進(jìn)行驗(yàn)證審核的服務(wù)套件,提供人臉核身、身份信息核驗(yàn)、銀行卡要素核驗(yàn)和運(yùn)營(yíng)商類要素核驗(yàn)等各類實(shí)名信息認(rèn)證能力,以解決行業(yè)內(nèi)大量對(duì)用戶身份信息核實(shí)的需求。
Craneoffice.net 采用的識(shí)別方式
由于其產(chǎn)品眾多,考慮一些綜合因素,我們?cè)?Craneoffice.net 架構(gòu)里主要實(shí)現(xiàn)以下三種識(shí)別方式:
? ? ? ? 1、活體人臉核身(權(quán)威庫(kù)):
? ? ? ? ?流程為通過(guò)錄制一段人臉活體靜態(tài)視頻,與大數(shù)據(jù)權(quán)威庫(kù)身份證信息進(jìn)行比對(duì),判斷是否為 同一人。
? ? ? ? 2、活體人臉比對(duì):
? ? ? ? ?流程為通過(guò)上傳正確、清晰的身份證正面圖片,截取頭像圖片,再通過(guò)錄制人臉活體靜態(tài)視頻進(jìn)行比對(duì),判斷是否為同一人。
? ? ? ? 3、照片人臉核身(權(quán)威庫(kù)):
? ? ? ? ?流程為上傳正確的身份證正面圖片,截取頭像圖片,傳遞身份證號(hào)與姓名,與大數(shù)據(jù)權(quán)威庫(kù)身份證信息進(jìn)行比對(duì),判斷是否為同一人。
調(diào)用成本
申請(qǐng)開(kāi)發(fā)賬號(hào)及具體費(fèi)用情況請(qǐng)?jiān)L問(wèn)騰訊云人臉核身產(chǎn)品首頁(yè):
https://cloud.tencent.com/act/pro/huiyandiscount
我們的產(chǎn)品調(diào)用成本如下表,可參照一下比例,在此僅供參考:
識(shí)別方式 | 調(diào)用成功的成本 |
活體人臉核身(權(quán)威庫(kù)) | 1元 / 每次 |
活體人臉比對(duì) | 0.15元 / 每次 |
照片人臉核身(權(quán)威庫(kù)) | 1元 / 每次 |
總之,在騰訊云商城購(gòu)買越大的產(chǎn)品包調(diào)用成本越低,如果有優(yōu)惠活動(dòng)則更為合適。
百度云身份證識(shí)別
其官方宣傳可以結(jié)構(gòu)化識(shí)別二代居民身份證正反面所有8個(gè)字段,識(shí)別準(zhǔn)確率超過(guò)99%;支持識(shí)別混貼身份證,適用于同一張圖上有多張身份證正反面的場(chǎng)景;支持檢測(cè)身份證正面頭像,并返回頭像切片的base64編碼及位置信息,其具體詳細(xì)產(chǎn)品介紹請(qǐng)?jiān)L問(wèn)如下地址:
https://ai.baidu.com/tech/ocr_cards/idcard
調(diào)用成本
我們使用的是企業(yè)申請(qǐng),一個(gè)月應(yīng)該可以享受2000次免費(fèi)調(diào)用,后期調(diào)用應(yīng)該是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
相關(guān)結(jié)合點(diǎn)
在人臉核身方面,雖然我們可以直接提供身份證號(hào)、姓名、自拍摳圖的頭像BASE64編碼等參數(shù)傳遞給騰訊云識(shí)別接口,但考慮到實(shí)際應(yīng)用場(chǎng)景中,更加規(guī)范、有效的驗(yàn)證有助于提升應(yīng)用程序數(shù)據(jù)的質(zhì)量和精準(zhǔn)性,也更加保障了識(shí)別結(jié)果的準(zhǔn)確性。
因此身份證的識(shí)別功能和人臉核身功能即可以單獨(dú)獨(dú)立運(yùn)行,又可以利用產(chǎn)品特性相結(jié)合,實(shí)現(xiàn)數(shù)據(jù)采集、校驗(yàn)的雙保險(xiǎn)。
具體流程如下圖:
核心代碼
實(shí)現(xiàn)調(diào)用人臉核身API的示例?
該示例代碼以上小節(jié)的介紹的三種識(shí)別方式實(shí)現(xiàn),僅供參考:
//定義人臉識(shí)別類
public class FaceR
{
public string ResultJson = ""; //記錄返回 json 結(jié)果
public string apiurl = "faceid.tencentcloudapi.com"; //騰訊人臉識(shí)別API地址
public string debuginfo = ""; //調(diào)試信息
public string ErrorMessage = ""; //錯(cuò)誤信息
string[] signHeaders = null; //頭部簽名數(shù)組
public FaceR()
{
}
//活體人臉核身方法,參數(shù)為身份證號(hào);檢驗(yàn)類型,這里傳固定值 SILENT;姓名;活體的靜態(tài)視頻編碼;方法返回相似度值等信息
public string LivenessRecognition(string IdCard,string LivenessType,string Name,string VideoBase64)
{
string content = "{ \"IdCard\":\"" + IdCard + "\",\"LivenessType\":\"" + LivenessType + "\", \"Name\":\"" + Name + "\" ,\"VideoBase64\":\"" + VideoBase64 + "\"}";
// 密鑰參數(shù)
string SECRET_ID = 你申請(qǐng)的ID
string SECRET_KEY = 你申請(qǐng)的KEY
string service = "faceid";
string endpoint = "faceid.tencentcloudapi.com";
string region = "ap-guangzhou";
string action = "LivenessRecognition";
string version = "2018-03-01";
// 注意時(shí)區(qū),建議此時(shí)間統(tǒng)一采用UTC時(shí)間戳,否則容易出錯(cuò)
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;
}
//活體人臉比對(duì)方法,參數(shù)為傳遞檢驗(yàn)類型,這里傳固定值 SILEN;身份證頭像圖片編碼;活體的靜態(tài)視頻編碼,方法返回相似度值等信息
public string LivenessCompare(string LivenessType, string ImageBase64, string VideoBase64)
{
string content = "{ \"LivenessType\":\"" + LivenessType + "\", \"ImageBase64\":\"" + ImageBase64 + "\" ,\"VideoBase64\":\"" + VideoBase64 + "\"}";
// 密鑰參數(shù)
string SECRET_ID = 你申請(qǐng)的ID
string SECRET_KEY = 你申請(qǐng)的KEY
string service = "faceid";
string endpoint = "faceid.tencentcloudapi.com";
string region = "ap-guangzhou";
string action = "LivenessCompare";
string version = "2018-03-01";
// 注意時(shí)區(qū),建議此時(shí)間統(tǒng)一采用UTC時(shí)間戳,否則容易出錯(cuò)
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;
}
//照片人臉核身方法,參數(shù)傳遞身份證號(hào);姓名;截取的身份證頭像圖片編碼;方法返回相似度值等信息
public string ImageRecognition(string IdCard,string Name, string ImageBase64)
{
string content = "{ \"IdCard\":\"" + IdCard + "\", \"Name\":\"" + HttpUtility.UrlDecode(Name, Encoding.UTF8) + "\" ,\"ImageBase64\":\"" + ImageBase64 + "\"}";
// 密鑰參數(shù)
string SECRET_ID = 你申請(qǐng)的ID
string SECRET_KEY = 你申請(qǐng)的KEY
string service = "faceid";
string endpoint = "faceid.tencentcloudapi.com";
string region = "ap-guangzhou";
string action = "ImageRecognition";
string version = "2018-03-01";
// 注意時(shí)區(qū),建議此時(shí)間統(tǒng)一采用UTC時(shí)間戳,否則容易出錯(cuò)
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);
}
}
//構(gòu)造頭部簽名
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:拼接規(guī)范請(qǐng)求串 *************
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:計(jì)算簽名 *************
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;
}
//調(diào)用API地址,傳遞參數(shù)并獲取返回值的通用方法
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);
// 準(zhǔn)備請(qǐng)求...
try
{
// 設(shè)置參數(shù)
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();
//發(fā)送請(qǐng)求并獲取相應(yīng)回應(yīng)數(shù)據(jù)
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才開(kāi)始向目標(biāo)網(wǎng)頁(yè)發(fā)送Post請(qǐng)求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回結(jié)果網(wǎng)頁(yè)(html)代碼
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
return "";
}
}//get response result
}
實(shí)現(xiàn)調(diào)用身份證識(shí)別API的示例?
public class IdCard
{
public string name = ""; //姓名
public string sex = ""; //性別
public string photo_base64 = ""; //截取的身份證頭像圖像的編碼值
public string nation = ""; //民族
public string address = ""; //住址
public string IDNumber = ""; //身份證號(hào)
public string birthday = ""; //生日
public string org = ""; //發(fā)證機(jī)關(guān)
public string startDate = ""; //有效期起
public string endDate = ""; //有效期止
public string ResultJson = ""; //記錄返回的JSON值
public string ErrorMessage = ""; //記錄錯(cuò)誤信息
public string direction = ""; //上傳時(shí)圖片的方向
public string image_status = ""; //上傳圖片的識(shí)別狀態(tài)
public string risk_type = ""; //上傳圖片的識(shí)別類型
public string edit_tool = ""; //上傳圖片是否P圖
public string idcard_number_type = ""; //上傳圖片的識(shí)別錯(cuò)誤信息
public IdCard()
{
}
//得到指定文件的 byte[],參數(shù)為文件絕對(duì)路徑值
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;
}
//識(shí)別身份證信息方法,參數(shù)為文件絕對(duì)路徑值;正反面值:正面?zhèn)?front,反面?zhèn)?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 = 申請(qǐng)的開(kāi)發(fā)ID;
var API_KEY = 申請(qǐng)的開(kāi)發(fā)KEY;
var SECRET_KEY = 開(kāi)發(fā)密鑰;
var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);
client.Timeout = 60000; // 修改超時(shí)時(shí)間
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"]["公民身份號(hào)碼"]["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"]["簽發(fā)機(jī)關(guān)"]["words"].ToString();
startDate = result["words_result"]["簽發(fā)日期"]["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 = "逆時(shí)針90度";
break;
case "2":
direction = "逆時(shí)針180度";
break;
case "3":
direction = "逆時(shí)針270度";
break;
}
image_status = result["image_status"].ToString();
switch (image_status)
{
case "normal":
image_status = "識(shí)別正常";
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 = "身份證關(guān)鍵字段反光或過(guò)曝";
break;
case "over_dark":
image_status = "身份證欠曝(亮度過(guò)低)";
break;
case "unknown":
image_status = "未知狀態(tài)";
break;
}
risk_type = result["risk_type"].ToString();
switch (risk_type)
{
case "normal":
risk_type = "正常身份證";
break;
case "copy":
risk_type = "復(fù)印件";
break;
case "temporary":
risk_type = "臨時(shí)身份證";
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 = "身份證證號(hào)識(shí)別錯(cuò)誤";
break;
case "1":
idcard_number_type = "身份證證號(hào)和性別、出生信息一致";
break;
case "2":
idcard_number_type = "身份證證號(hào)和性別、出生信息都不一致";
break;
case "3":
idcard_number_type = "身份證證號(hào)和出生信息不一致";
break;
case "4":
idcard_number_type = "身份證證號(hào)和性別信息不一致";
break;
}
}
}
catch (Exception e)
{
ErrorMessage = e.Message;
}
}
}// idcard
小結(jié)
采用哪種識(shí)別方式,要根據(jù)我們?cè)趯?shí)際的應(yīng)用場(chǎng)景中進(jìn)行選擇,而且也需要考慮調(diào)用的成本(本文涉及的調(diào)用成本僅供參考)。這里講述的幾種方案是我們自研產(chǎn)品中所采用的方式,騰訊云的人臉核身產(chǎn)品分支很多,大家可以根據(jù)具體需求進(jìn)行選擇、擴(kuò)充自己的產(chǎn)品功能。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-715300.html
再次感謝您的閱讀,歡迎大家討論指正。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-715300.html
到了這里,關(guān)于C# 基于騰訊云人臉核身和百度云證件識(shí)別技術(shù)相結(jié)合的 API 實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!