说明
示例使用QT C++编写,调用百度AI开放平台的OCR图像文字识别和身份证识别专用接口完成相应功能,识别率很好,速度也很快。后面抽时间集成截图功能,截图识别就很方便了,敬请关注。
2021-3-26更新:集成截图功能,使用非常方便,支持快捷键Ctrl + S截图。截图功能搬运了feiyangqingyun刘老师开源的屏幕截图,并做了一点修改,在此感谢刘老师!
实际效果如下,身份信息打码
项目源码下载地址
使用说明(windows 32位)
1、下载后解压,打开pro,在baiduocronline.h中修改API_Key和Secret_Key两个参数。
2、编译,仅编译,不运行。
3、将https请求依赖的两个动态库libcrypto-1_1.dll和libssl-1_1.dll复制到exe所在目录,运行。
4、点击打开图片,自动加载到tab widget当前选项卡区域显示,点击面向百度即可。
5、欢迎留言反馈。
程序说明
1、运行程序,自动获取AccToken。用户创建文字识别应用后,会产生应用的API Key和Secret Key,在示例代码中baiduocronline.h对应修改API_Key和Secret_Key两个参数即可。
2、调用StdOCR(const QImage& image)和CardScan(const QImage& image, quint8 id_card_side)。这两个接口内组织post请求的数据内容,包括设置头部、请求参数、图像数据转码,然后连接响应槽,发送请求。身份证识别参数id_card_side区分正反面。以OCR识别为例:
void BaiduOCROnline::StdOCR(const QImage& image)
{
//图像数据转码,按API文档要求进行转码
QString img_base64 = image2base64_str(image);
QByteArray post_data = QString("image=" + img_base64).toUtf8();
//请求参数
QUrlQuery UrlQuery;
UrlQuery.addQueryItem("access_token", AccToken);
QUrl url(StdOCRUrl);
url.setQuery(UrlQuery);
NetRequest.setUrl(url);
//设置头部
NetRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-www-form-urlencoded")); //接口置顶头部类型
connect(NetAccManager,&QNetworkAccessManager::finished,this,&BaiduOCROnline::StdOCRReply);
NetAccManager->post(NetRequest, post_data);
}
3、在响应槽中,读取返回的数据后,进行json解析。需要注意的是,这部分可能与API文档中的描述有差别(可能是接口变更或者升级的原因,文档更新没跟上),以实际响应内容为准进行解析,下面贴出OCR识别部分。
void BaiduOCROnline::StdOCRReply(QNetworkReply* reply)
{
if (reply->error() != QNetworkReply::NoError)
{
QMessageBox::warning(0,"","请求错误!");
return;
}
QByteArray content = reply->readAll();
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(content, &jsonError); // 转为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
{
QJsonObject root_object = doucment.object();
if(!root_object.contains("error_code")) //没有返回错误码说明识别成功,下面提取数据
{
int words_result_num = root_object.take("words_result_num").toInt(); //文字内容的行数
QJsonArray words_result = root_object.take("words_result").toArray();
QString OCRResult;
for(int index = 0; index < words_result_num; index++)
{
OCRResult.append(words_result.at(index).toObject().take("words").toString() + "\n"); //每一行的文字内容带上换行符,附加到OCRResult
}
emit StdOCRResult(OCRResult); //发送识别结果到UI
}
}
reply->deleteLater();
disconnect(NetAccManager,&QNetworkAccessManager::finished,this,&BaiduOCROnline::StdOCRReply);
}