前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【图像区域识别改名】JPG的图片和扫描件如何区域识别重命名,并将区域内容保存为表格,基于QT和腾讯API的实现方案

【图像区域识别改名】JPG的图片和扫描件如何区域识别重命名,并将区域内容保存为表格,基于QT和腾讯API的实现方案

原创
作者头像
不负众望
修改于 2025-02-24 09:56:37
修改于 2025-02-24 09:56:37
22700
代码可运行
举报
运行总次数:0
代码可运行

档案管理:在大型企业或政府机构的档案管理中,有大量的纸质文件被扫描成 JPG 格式保存。这些文件的关键信息(如文件编号、日期、主题等)可能分布在图片的特定区域。通过区域识别重命名,可以将图片文件按照关键信息命名,同时将这些信息保存到表格中,方便后续的检索和管理。

以下是一个基于 QT 和腾讯云 OCR API 实现对 JPG 图片和扫描件进行区域识别重命名,并将区域内容保存为表格的详细方案:

1. 环境准备

  • 安装 QT:从 QT 官方网站下载并安装适合你操作系统的 QT 开发环境。
  • 注册腾讯云账号:在腾讯云官网注册账号,并开通 OCR 服务,获取 API 密钥(SecretId 和 SecretKey)。

2. 创建 QT 项目

使用 QT Creator 创建一个新的 QT Widgets Application 项目。

3. 配置项目

在项目的.pro文件中添加网络模块:

pro

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QT += network

4. 实现步骤

4.1 引入必要的头文件

mainwindow.h文件中添加以下头文件:

cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QFileDialog>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStandardPaths>
4.2 实现腾讯云 OCR 请求函数

mainwindow.cpp中实现一个函数用于发送 OCR 请求:

cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
    });
}
4.3 处理 OCR 结果

cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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));
}
4.4 选择图片并处理

mainwindow.cpp的构造函数中添加一个按钮点击事件处理函数:

cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
        }
    });
}
4.5 保存表格数据到文件

cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
        }
    }
}

5. UI 设计

在 QT Designer 中设计界面,添加一个按钮用于选择图片,一个表格用于显示识别结果,另一个按钮用于保存表格数据到文件。

6. 注意事项

  • 上述代码中的腾讯云 API 请求部分需要进行签名验证,实际使用时需要根据腾讯云的签名规则进行修改。
  • 确保你的腾讯云账号有足够的权限和额度使用 OCR 服务。

通过以上步骤,你可以实现对 JPG 图片和扫描件的区域识别重命名,并将识别结果保存为表格。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
MySQL字段默认值设置详解
在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默认值相关知识。
MySQL技术
2021/03/04
11.3K0
CHAR与VARCHAR面面观
前面写过一篇介绍int类型的文章,一直想写一篇介绍字符串字段类型的文章,一直拖着也没思路要怎么下手。最近多关注了下这方面的文章,决定还是把拖了好久的文章了结了吧。本篇文章主要会介绍字符串类型char及varchar的用法及区别。
MySQL技术
2019/11/18
5560
INT类型知多少
整型是MySQL中最常用的字段类型之一,通常用于存储整数,其中int是整型中最常用的,对于int类型你是否真正了解呢?本文会带你熟悉int类型相关知识,也会介绍其他整型字段的使用。
MySQL技术
2019/09/08
9900
MySQL中dd::columns表结构转table过程以及应用
MySQL的dd表是用来存放表结构和各种建表信息的,客户端建的表都存在mysql.table和mysql.columns表里,还有一个表mysql.column_type_elements比较特殊,用来存放SET和ENUM类型的字段集合值信息。看一下下面这张表的mysql.columns表和mysql.column_type_elements信息。为了缩短显示长度,这里只展示几个重要的值。
GreatSQL社区
2023/02/23
8690
Mysql执行计划(大章)
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道Mysql是如何处理你的SQL语句的。分析你的查询语句或者表结构的性能瓶颈
彼岸舞
2020/09/30
7910
MySQL 索引与性能调优
索引用于快速找出在某个列中有一特定值的行,如果不使用索引MySQL必须从第l条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,MySQL能快速到达某个位置去搜寻数据文件,而不必查看所有数据,可加快数据查询的查询速度提高效率,索引可在创建表时增加,也可动态调整已有表.
王 瑞
2022/12/28
2.4K0
MySQL 索引与性能调优
MySQL 案例:摸不准的查询优化器与索引
近期有用户在咨询查询的问题,发现一个比较典型的案例,SQL 语句无法选择正确的索引,导致查询效率偏低,正好借这个案例来学习一下查询优化器的知识。所使用的的 SQL 语句、数据以及表结构均已脱敏,
王文安@DBA
2022/02/28
1.1K0
MySQL 案例:摸不准的查询优化器与索引
MySQL的实战系列:大字段如何优化
除特别注明外,本站所有文章均为慕白博客原创,转载请注明出处来自https://geekmubai.com/programming/747.html
慕白
2018/09/21
5.4K0
MySQL的实战系列:大字段如何优化
MySQL 8.0新特性:函数索引
之前的文章中分别介绍了MySQL 8.0在索引方面的新特性--隐藏索引 和 降序索引,详细内容可查看之前的文章内容;
SEian.G
2021/04/15
1.2K0
【干货】MySQL索引与优化实践
索引的目的在于提高查询效率,其功能可类比字典,通过该索引可以查询到我们想要查询的信息,因此,选择建立好的索引十分重要
搜云库技术团队
2019/10/17
8860
创建索引,这些知识应该了解
在 MySQL 中,基本上每个表都会有索引,有时候也需要根据不同的业务场景添加不同的索引。索引的建立对于数据库高效运行是很重要的,本篇文章将介绍下创建索引相关知识及注意事项。
MySQL技术
2021/04/13
3170
Python操作MySQL数据库
在MYSQL中,运行INSERT INTO 插入语句中的字段是否一定要把该表的字段全部填上? 例如表tab_name有(col1,col2,col3,col4)4个字段。 只填你需要添的,就要把列
周小董
2019/03/25
1.7K0
MySQL 8.0 之不可见列
可以看到,我们的SQL里面创建了一个表t2的字段有id、name和age,其中,age字段设置了不可见属性。
AsiaYe
2021/06/09
1.6K0
MySQL 8.0 之不可见列
当谈 SQL 优化时谈些什么?
孙银行
2017/04/24
5.9K1
当谈 SQL 优化时谈些什么?
MySQL 执行计划深入解读
使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是 如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。
没有故事的陈师傅
2021/11/15
7000
MySQL 执行计划深入解读
MySQL数据类型DECIMAL详解
当我们需要存储小数,并且有精度要求,比如存储金额时,通常会考虑使用DECIMAL字段类型,可能大部分同学只是对DECIMAL类型略有了解,其中的细节还不甚清楚,本篇文章将从零开始,为你讲述DECIMAL字段类型的使用场景及方法。
MySQL技术
2019/12/25
41.5K0
MySQL锁等待与死锁问题分析
在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重。本篇文章我们一起来学习下什么是锁等待及死锁,出现此类问题又应该如何分析处理呢?
MySQL技术
2021/04/13
2.1K3
mysql建立联合索引_mysql之联合索引
create index `sindex` on `test` (`aaa`,`bbb`,`ccc`);
全栈程序员站长
2022/09/06
5.4K0
你确定真正理解联合索引和最左前缀原则?
前文已经说了explain命令的大部分参数,接着图解: EXPLAIN 实战-1这篇文章把explain的key_len参数分享完,接着分享最左前缀原则,建立如下的表,其中name列和address列都建立了索引
Java识堂
2019/08/13
8320
MySQL客户端工具的使用与MySQL SQL语句
数据库配置文件为:/etc/my.cnf和/etc/my.cnf.d目录下的配置文件
Alone-林
2022/08/20
4.2K0
相关推荐
MySQL字段默认值设置详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验