五、最后
希望你在调用腾讯云-OCR通用印刷体识别Api的时候可以少走些弯路,少踩一些坑。当然了那一个或许算不上坑,大概是私房一些基础知识没了解。不管怎么着,假使您在使用OCR的时候,本文对你有好几援救,那它就发挥了应当的作用。
本文的源代码有趣味的可以下载。
二、OCR-通用印刷体识别
先是附上文档地址:OCR-通用印刷体识别。
3、请求包header
接口选取http协议,扶助指定图片URL和上传本地图片文件三种方法。
具备请求都须求包括下列的底部音讯:
Host、Content-Length、Content-Type、Authorization
2、具体落到实处
HttpClient client = new HttpClient();
var para = new
{
appid = "123456",
bucket = "test",
url = "http://test-123456.image.myqcloud.com/test.jpg"
};
var jsonPara = JsonConvert.SerializeObject(para);
StringContent content = new StringContent(jsonPara);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
content.Headers.ContentLength = jsonPara.Length;
content.Headers.Add("Host", "recognition.image.myqcloud.com");
content.Headers.Add("Authorization", aut);
var taskHrm = client.PostAsync(postUrl, content);
taskHrm.Wait();
var taskStr = taskHrm.Result.Content.ReadAsStringAsync();
taskStr.Wait();
var result = taskStr.Result;
F5运作,结果报错了:
其一荒唐的案由为:Host和Authorization无法这么添加到Headers中。于是乎我自作聪明的把它们放到参数中了:
var para = new
{
appid = "123456",
bucket = "test",
url = "http://test-123456.image.myqcloud.com/test.jpg",
Host = "recognition.image.myqcloud.com",
Authorization = aut
};
那般运行代码是不曾报错,可是后台重回“has
no sign or sign is empty”,没有签约。
再回头看看参数必要,Host和Authorization必须添加在请求包Header中。于是百度时而,如何行使Httpclient设置Authorization。最后消除方案如下:
client.DefaultRequestHeaders.Host = "recognition.image.myqcloud.com";
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", aut);
得逞运行!
只是项目中运用url的几率终究少,基本上都以上传一张地点图片,然后识别出来文字。
下边来看一下分辨一张地方图片。
3、使用 image 的请求包
POST /ocr/general HTTP/1.1
Authorization: FCHXdPTEwMDAwMzc5Jms9QUtJRGVRZDBrRU1yM2J4ZjhRckJi==
Host: recognition.image.myqcloud.com
Content-Length: 735
Content-Type: multipart/form-data;boundary=--------------acebdf13572468
----------------acebdf13572468
Content-Disposition: form-data; name="appid";
123456
----------------acebdf13572468
Content-Disposition: form-data; name="bucket";
test
----------------acebdf13572468
Content-Disposition: form-data; name="image"; filename="test.jpg"
Content-Type: image/jpeg
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
----------------acebdf13572468--
说实话见到那种格式,一先河真是一脸懵逼,前边多少个参数还好,后边这一大串不明白怎么传递过去,后来百度了弹指间,那种格式符合RFC
2045协议。
具体解释一下:
第5行:注明Content
Type类型,并定义边界字符串。边界符可以自定义,可是最好是用破折号等数据中貌似不会出现的字符;
第6、9、13以及18行是换行,传递的时候利用‘\r\n’;
第7、11以及15行是‘–’加上第5行的boundary即边界字符串。此地要小心是早晚要抬高前边的连字符‘–’,我起来没放在心上写的是和boundary一样,结果间接报错。
第8、10、12、14就是传递的Key_Value类型的数额。“appid”和“bucket”就是要传递的key,而“123456”以及“test”就是独家对应的value。
第16、17行代表其余一个多少,key是image,filename是“test.jpg”。
最终两行就是终结了。注意最终一行是boundary加上‘–’。
弄精通是什么样看头了,就足以初步写代码了。这里大家用WebRequest,至于缘何不要HttpClient,研讨ing。不知哪位仁兄使用HttpClient写过,请不吝赐教。
2、一些任何急需专注的
1、文中使用的appid、bucket、secret_id、``secret_key需要注册万象优图后,才能得到。至于如何得到,文档中说的很清楚,有详细的步骤。
2、在设置Header参数时,Content_Length和Host可以毫无安装。
2、一些其他急需留意的
1、文中使用的appid、bucket、secret_id、``secret_key需要注册万象优图后,才能得到。至于如何得到,文档中说的很清楚,有详细的步骤。
2、在设置Header参数时,Content_Length和Host可以绝不安装。
四、需求专注的点
2、接口url地址
http://recognition.image.myqcloud.com/ocr/general
1、使用 url 的哀求包
POST /ocr/general HTTP/1.1
Authorization: FCHXdPTEwMDAwMzc5Jms9QUtJRGVRZDBrRU1yM2J4ZjhRckJi==
Host: recognition.image.myqcloud.com
Content-Length: 187
Content-Type: application/json
{
"appid":"123456",
"bucket":"test",
"url":"http://test-123456.image.myqcloud.com/test.jpg"
}
以此url是万象优图中图纸的url地址。
看样子那种格式,心里大致有数了,开端敲代码。
四、须求专注的点
2、接口url地址
http://recognition.image.myqcloud.com/ocr/general
2、具体落到实处
HttpClient client = new HttpClient();
var para = new
{
appid = "123456",
bucket = "test",
url = "http://test-123456.image.myqcloud.com/test.jpg"
};
var jsonPara = JsonConvert.SerializeObject(para);
StringContent content = new StringContent(jsonPara);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
content.Headers.ContentLength = jsonPara.Length;
content.Headers.Add("Host", "recognition.image.myqcloud.com");
content.Headers.Add("Authorization", aut);
var taskHrm = client.PostAsync(postUrl, content);
taskHrm.Wait();
var taskStr = taskHrm.Result.Content.ReadAsStringAsync();
taskStr.Wait();
var result = taskStr.Result;
F5运作,结果报错了:
这几个荒唐的来由为:Host和Authorization无法这么添加到Headers中。于是乎我布鼓雷门的把它们放到参数中了:
var para = new
{
appid = "123456",
bucket = "test",
url = "http://test-123456.image.myqcloud.com/test.jpg",
Host = "recognition.image.myqcloud.com",
Authorization = aut
};
那般运行代码是未曾报错,然则后台重临“has
no sign or sign is empty”,没有签约。
再回头看看参数须要,Host和Authorization必须添加在请求包Header中。于是百度时而,如何选拔Httpclient设置Authorization。最终解决方案如下:
client.DefaultRequestHeaders.Host = "recognition.image.myqcloud.com";
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", aut);
得逞运行!
而是项目中运用url的可能率终究少,基本上都以上传一张地点图片,然后识别出来文字。
上面来看一下分辨一张地点图片。
1、统计Authorization授权签名
签署分为多次可行签名和单次有效签名。它们拼接成的签约串格式为:
a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&u=[userid]&f=[fileid]
现实各种字段的意思请参见官方文档:签署和鉴权文档
内需专注的有两点:
1、使用 HMAC-SHA1
算法对请求进行加密;
2、签名串须求利用
Base64
编码(首先对orignal使用HMAC-SHA1算法进行签字,然后将orignal附加到签约结果的尾声,再拓展Base64编码,得到最后的sign)。
/// <summary>
/// HMAC-SHA1加密算法
/// </summary>
/// <param name="secret_key">密钥</param>
/// <param name="orignalStr">源文</param>
/// <returns></returns>
public static string HmacSha1Sign(string secret_key, string orignalStr)
{
var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secret_key));
var orignalBytes = Encoding.UTF8.GetBytes(orignalStr);
var hashBytes = hmacsha1.ComputeHash(orignalBytes);
List<byte> bytes = new List<byte>();
bytes.AddRange(hashBytes);
bytes.AddRange(orignalBytes);
return Convert.ToBase64String(bytes.ToArray());
}
1、使用 url 的请求包
POST /ocr/general HTTP/1.1
Authorization: FCHXdPTEwMDAwMzc5Jms9QUtJRGVRZDBrRU1yM2J4ZjhRckJi==
Host: recognition.image.myqcloud.com
Content-Length: 187
Content-Type: application/json
{
"appid":"123456",
"bucket":"test",
"url":"http://test-123456.image.myqcloud.com/test.jpg"
}
这些url是万象优图中图纸的url地址。
看来那种格式,心里大致有数了,开始敲代码。
五、最后
期望您在调用腾讯云-OCR通用印刷体识别Api的时候可以少走些弯路,少踩一些坑。当然了这一个或者算不上坑,或者是个人一些基础知识没控制。不管怎么,若是您在选用OCR的时候,本文对您有几许救助,那它就发挥了应该的意义。
正文的源代码有趣味的可以下载。
1、通用OCR简介
通用OCR技术提供图片全体文字的检测和甄别服务,再次来到文字框地方与文字内容。协助多现象、任意版面下整图文字的辨别,以及中国和英国文、字母、数字的分辨。被广泛应用于印刷文档识别、广告图文字识别、街景店招识别、菜单识别、摄像标题识别、互连网头像文字识别等。
4、具体达成
要识其他图样如下:
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
Stream memStream = new MemoryStream();
webReq.Method = "POST";
string boundary = "--------------" + DateTime.Now.Ticks.ToString("x");// 边界符
webReq.ContentType = "multipart/form-data; boundary=" + boundary;
接下去是一个换行符,对应第6行:
byte[] enter = Encoding.ASCII.GetBytes("\r\n"); //换行
memStream.Write(enter, 0, enter.Length);
传递key_value的时候格式都以同等,于是我们写在一个循环往复之中:
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{"appid","1255710379"} ,
{"bucket","test1"}
};
//写入文本字段
string inputPartHeaderFormat = "--" + boundary + "\r\n" + "Content-Disposition:form-data;name=\"{0}\";" + "\r\n\r\n{1}\r\n";
foreach (var kv in dic)
{
string inputPartHeader = string.Format(inputPartHeaderFormat, kv.Key, kv.Value);
var inputPartHeaderBytes = Encoding.ASCII.GetBytes(inputPartHeader);
memStream.Write(inputPartHeaderBytes, 0, inputPartHeaderBytes.Length);
}
随之该写入image了,那里我们在bin/debug里面有一张名为1.jpg的图纸(即为上面的图纸)。
var fileStream = new FileStream("1.jpg", FileMode.Open, FileAccess.Read);
// 写入文件
string imagePartHeader = "--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
"Content-Type: image/jpeg\r\n\r\n";
var header = string.Format(imagePartHeader, "image", "1.jpg");
var headerbytes = Encoding.UTF8.GetBytes(header);
memStream.Write(headerbytes, 0, headerbytes.Length);
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
说到底就是终结符了:
// 最后的结束符
byte[] endBoundary = Encoding.ASCII.GetBytes("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "\r\n" + boundary + "--\r\n");
memStream.Write(endBoundary, 0, endBoundary.Length);
接下去设置任何Header参数:
webReq.ContentLength = memStream.Length;
webReq.Headers.Add(HttpRequestHeader.Authorization, aut);
webReq.Host = "recognition.image.myqcloud.com";
此地须求留意的一点是安装Host值的时候不大概选择
webReq.Headers.Add(HttpRequestHeader.Host, "recognition.image.myqcloud.com");
那几个方法,否则会有卓殊。
var requestStream = webReq.GetRequestStream();
memStream.Position = 0;
memStream.CopyTo(requestStream);
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
var ret = sr.ReadToEnd();
sr.Close();
response.Close();
requestStream.Close();
memStream.Close();
全盘运行!识别结果如下:
三、示例
一、写在前头
新近做项目需求用到识别图片中文字的功力,本来用的苔丝eract那几个写的,可是效果不是很完美。
随后上网搜了一晃OCR接口,就准备采用腾讯云、百度的OCR接口试一下效果。但是那些腾讯云OCR就折腾了一天!
二、OCR-通用印刷体识别
率先附上文档地址:OCR-通用印刷体识别。
3、使用 image 的请求包
POST /ocr/general HTTP/1.1
Authorization: FCHXdPTEwMDAwMzc5Jms9QUtJRGVRZDBrRU1yM2J4ZjhRckJi==
Host: recognition.image.myqcloud.com
Content-Length: 735
Content-Type: multipart/form-data;boundary=--------------acebdf13572468
----------------acebdf13572468
Content-Disposition: form-data; name="appid";
123456
----------------acebdf13572468
Content-Disposition: form-data; name="bucket";
test
----------------acebdf13572468
Content-Disposition: form-data; name="image"; filename="test.jpg"
Content-Type: image/jpeg
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
----------------acebdf13572468--
说实话见到那种格式,一起初真是一脸懵逼,后面多少个参数还好,后边这一大串不晓得怎么传递过去,后来百度了弹指间,那种格式符合RFC
2045协议。
具体解释一下:
第5行:声明Content
Type类型,并定义边界字符串。边界符可以自定义,可是最好是用破折号等数据中一般不会并发的字符;
第6、9、13以及18行是换行,传递的时候利用‘\r\n’;
第7、11以及15行是‘–’加上第5行的boundary即边界字符串。此地要小心是肯定要抬高前边的连字符‘–’,我开端没放在心上写的是和boundary一样,结果一贯报错。
第8、10、12、14就是传递的Key_Value类型的数据。“appid”和“bucket”就是要传送的key,而“123456”以及“test”就是分别对应的value。
第16、17行代表其它一个数额,key是image,filename是“test.jpg”。
末尾两行就是终结了。注意最终一行是boundary加上‘–’。
弄领会是何许意思了,就足以开端写代码了。那里大家用WebRequest,至于缘何不用HttpClient,研商ing。不知哪位仁兄使用HttpClient写过,请不吝赐教。
4、具体贯彻
要识其他图样如下:
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
Stream memStream = new MemoryStream();
webReq.Method = "POST";
string boundary = "--------------" + DateTime.Now.Ticks.ToString("x");// 边界符
webReq.ContentType = "multipart/form-data; boundary=" + boundary;
接下去是一个换行符,对应第6行:
byte[] enter = Encoding.ASCII.GetBytes("\r\n"); //换行
memStream.Write(enter, 0, enter.Length);
传递key_value的时候格式都以如出一辙,于是大家写在一个巡回之中:
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{"appid","1255710379"} ,
{"bucket","test1"}
};
//写入文本字段
string inputPartHeaderFormat = "--" + boundary + "\r\n" + "Content-Disposition:form-data;name=\"{0}\";" + "\r\n\r\n{1}\r\n";
foreach (var kv in dic)
{
string inputPartHeader = string.Format(inputPartHeaderFormat, kv.Key, kv.Value);
var inputPartHeaderBytes = Encoding.ASCII.GetBytes(inputPartHeader);
memStream.Write(inputPartHeaderBytes, 0, inputPartHeaderBytes.Length);
}
随着该写入image了,那里大家在bin/debug里面有一张名为1.jpg的图纸(即为下边的图形)。
var fileStream = new FileStream("1.jpg", FileMode.Open, FileAccess.Read);
// 写入文件
string imagePartHeader = "--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
"Content-Type: image/jpeg\r\n\r\n";
var header = string.Format(imagePartHeader, "image", "1.jpg");
var headerbytes = Encoding.UTF8.GetBytes(header);
memStream.Write(headerbytes, 0, headerbytes.Length);
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
最后就是完毕符了:
// 最后的结束符
byte[] endBoundary = Encoding.ASCII.GetBytes("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "\r\n" + boundary + "--\r\n");
memStream.Write(endBoundary, 0, endBoundary.Length);
接下去设置任何Header参数:
webReq.ContentLength = memStream.Length;
webReq.Headers.Add(HttpRequestHeader.Authorization, aut);
webReq.Host = "recognition.image.myqcloud.com";
这边须求小心的一些是设置Host值的时候不可以应用
webReq.Headers.Add(HttpRequestHeader.Host, "recognition.image.myqcloud.com");
其一法子,否则会有尤其。
var requestStream = webReq.GetRequestStream();
memStream.Position = 0;
memStream.CopyTo(requestStream);
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
var ret = sr.ReadToEnd();
sr.Close();
response.Close();
requestStream.Close();
memStream.Close();
到家运行!识别结果如下:
3、请求包header
接口选取http协议,辅助指定图片URL和上传本地图片文件二种形式。
怀有请求都务求涵盖下列的头顶新闻:
Host、Content-Length、Content-Type、Authorization
1、统计Authorization授权签名
署名分为数十次得力签名和单次有效签名。它们拼接成的签署串格式为:
a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&u=[userid]&f=[fileid]
实际每一个字段的意思请参见官方文档:署名和鉴权文档
内需专注的有两点:
1、使用 HMAC-SHA1
算法对请求进行加密;
2、签名串须求利用
Base64
编码(首先对orignal使用HMAC-SHA1算法举行签字,然后将orignal附加到签约结果的末段,再拓展Base64编码,得到终极的sign)。
/// <summary>
/// HMAC-SHA1加密算法
/// </summary>
/// <param name="secret_key">密钥</param>
/// <param name="orignalStr">源文</param>
/// <returns></returns>
public static string HmacSha1Sign(string secret_key, string orignalStr)
{
var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secret_key));
var orignalBytes = Encoding.UTF8.GetBytes(orignalStr);
var hashBytes = hmacsha1.ComputeHash(orignalBytes);
List<byte> bytes = new List<byte>();
bytes.AddRange(hashBytes);
bytes.AddRange(orignalBytes);
return Convert.ToBase64String(bytes.ToArray());
}
1、通用OCR简介
通用OCR技术提供图片全体文字的检测和辨认服务,重回文字框地点与文字内容。帮忙多现象、任意版面下整图文字的辨别,以及中国和英国文、字母、数字的辨别。被广泛应用于印刷文档识别、广告图文字识别、街景店招识别、菜单识别、视频标题识别、互连网头像文字识别等。
一、写在目前
不久前做项目须求用到识别图片中文字的效率,本来用的Tesseract这几个写的,可是效果不是很杰出。
随着上网搜了一晃OCR接口,就准备利用腾讯云、百度的OCR接口试一下效果。不过那一个腾讯云OCR就折腾了一天!