档案管理:在大型企业或政府机构的档案管理中,有大量的纸质文件被扫描成 JPG 格式保存。这些文件的关键信息(如文件编号、日期、主题等)可能分布在图片的特定区域。通过区域识别重命名,可以将图片文件按照关键信息命名,同时将这些信息保存到表格中,方便后续的检索和管理。
以下是一个基于 QT 和腾讯云 OCR API 实现对 JPG 图片和扫描件进行区域识别重命名,并将区域内容保存为表格的详细方案:
使用 QT Creator 创建一个新的 QT Widgets Application 项目。
在项目的.pro
文件中添加网络模块:
pro
QT += network
在mainwindow.h
文件中添加以下头文件:
cpp
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QFileDialog>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStandardPaths>
在mainwindow.cpp
中实现一个函数用于发送 OCR 请求:
cpp
void MainWindow::sendOCRRequest(const QString &imagePath) {
// 读取图片文件
QFile file(imagePath);
if (!file.open(QIODevice::ReadOnly)) {
return;
}
QByteArray imageData = file.readAll();
file.close();
// 构建请求URL和请求体
QString url = "https://ocr.tencentcloudapi.com/";
QNetworkRequest request(QUrl(url));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// 构建请求体JSON
QJsonObject json;
json["Action"] = "GeneralBasicOCR";
json["Version"] = "2018-11-19";
json["Region"] = "ap-guangzhou";
json["ImageBase64"] = imageData.toBase64();
QJsonDocument doc(json);
QByteArray postData = doc.toJson();
// 发送请求
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply *reply = manager->post(request, postData);
connect(reply, &QNetworkReply::finished, [=]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray responseData = reply->readAll();
QJsonDocument responseDoc = QJsonDocument::fromJson(responseData);
QJsonObject responseObj = responseDoc.object();
// 处理OCR结果
processOCRResult(responseObj, imagePath);
}
reply->deleteLater();
});
}
cpp
void MainWindow::processOCRResult(const QJsonObject &response, const QString &imagePath) {
QJsonArray textDetections = response["Response"]["TextDetections"].toArray();
QString recognizedText;
for (const auto &detection : textDetections) {
QJsonObject detectionObj = detection.toObject();
recognizedText += detectionObj["DetectedText"].toString() + " ";
}
// 重命名图片
QString newName = recognizedText.trimmed().replace("/", "_") + ".jpg";
QFile::rename(imagePath, QFileInfo(imagePath).absolutePath() + "/" + newName);
// 将识别结果保存到表格
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
ui->tableWidget->setItem(row, 0, new QTableWidgetItem(newName));
ui->tableWidget->setItem(row, 1, new QTableWidgetItem(recognizedText));
}
在mainwindow.cpp
的构造函数中添加一个按钮点击事件处理函数:
cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->selectButton, &QPushButton::clicked, [=]() {
QStringList filePaths = QFileDialog::getOpenFileNames(this, "选择图片", QStandardPaths::writableLocation(QStandardPaths::PicturesLocation), "JPEG Images (*.jpg)");
for (const QString &filePath : filePaths) {
sendOCRRequest(filePath);
}
});
}
cpp
void MainWindow::saveTableToCSV() {
QString filePath = QFileDialog::getSaveFileName(this, "保存表格", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "CSV Files (*.csv)");
if (!filePath.isEmpty()) {
QFile file(filePath);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
for (int i = 0; i < ui->tableWidget->rowCount(); ++i) {
for (int j = 0; j < ui->tableWidget->columnCount(); ++j) {
QTableWidgetItem *item = ui->tableWidget->item(i, j);
if (item) {
out << item->text();
}
if (j < ui->tableWidget->columnCount() - 1) {
out << ",";
}
}
out << "\n";
}
file.close();
}
}
}
在 QT Designer 中设计界面,添加一个按钮用于选择图片,一个表格用于显示识别结果,另一个按钮用于保存表格数据到文件。
通过以上步骤,你可以实现对 JPG 图片和扫描件的区域识别重命名,并将识别结果保存为表格。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。