说明

示例使用QT C++编写,调用百度AI开放平台的OCR图像文字识别和身份证识别专用接口完成相应功能,识别率很好,速度也很快。后面抽时间集成截图功能,截图识别就很方便了,敬请关注。

2021-3-26更新:集成截图功能,使用非常方便,支持快捷键Ctrl + S截图。截图功能搬运了feiyangqingyun刘老师开源的屏幕截图,并做了一点修改,在此感谢刘老师!

飞桨 身份证ocr java_qt

实际效果如下,身份信息打码

飞桨 身份证ocr java_qt_02


飞桨 身份证ocr java_qt_03

项目源码下载地址

BaiduOCR.rar

使用说明(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);
}

API文档参考

1、百度-AI接入指南

2、百度-通用文字识别(标准版)

3、百度-身份证识别