一、图片文字识别功能

在之前的的文章中,引入了ocr识别引擎,也在线程内实现了调用引擎进行识别。基本功能都有了,就可以把功能和UI组织在一起了。

关于图片文字识别的功能,UI分两部分,左侧实现屏幕截图、打开图片、图片展示的功能。

右侧是选择OCR引擎,选择语言,文字提取以及提取后的简单处理的功能。

二、功能描述

1、屏幕截图

屏幕截图功能和下面链接的实现一致。

音视频学习 - Qt6.3.1版本下实现屏幕截图功能Qt项目中,实现屏幕截图功能的模块详细实现(可通用)_guaiwenshang889的博客-CSDN博客_qt实现窗口截图。(2)showEvent方法主要修改了获取设备像素比,免得再高分辨率设备下截图有问题。基本和参考的博客差不多,主要修改了ScreenWidget和showEvent方法。QDesktopWidget被废弃了,使用QGuiApplication替代。代码中的p是最底层窗口的指针,先从最底层将窗口最小化,然后再显示截图层。(1)ScreenWidget方修改了获取屏幕大小的方式。https://skydance.blog.csdn.net/article/details/126789405

2、打开图片

//选择图片
filePath = QFileDialog::getOpenFileName(this, tr("选择图片"), ".", tr("Image Files(*.jpg *.png)"));//加载图片
QImage* image = new QImage;
image->load(filePath);//对图片进行缩放展示
QPixmap picScale = QPixmap::fromImage(*image).scaled(ui->label->width(), ui->label->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);//在UI上展示图片
ui->label->setPixmap(picScale);

3、文字提取

这里主要是把图片路径传递给ocr识别线程,然后ocr线程识别的过程中会调用getRecognitionText函数,识别完成会调用recognitionFinish函数。

void TextRecognition::on_pushButton_2_clicked()
{if(filePath.isEmpty()){QString dlgTitle = "提示";QString strInfo = QString::fromStdString("没有选择图片");QMessageBox::information(this, dlgTitle, strInfo, QMessageBox::Ok, QMessageBox::NoButton);return;}ui->textEdit->setText("");//实例化loading窗口loading = new LoadingDialog(this);loading->setVisible(true);//启动线程m_thread  =  new MyThreadForTextRecognition;m_thread->init(filePath.toStdString(), QString("%1\\screen_action.jpg").arg(qApp->applicationDirPath().replace("/", "\\")).toStdString(),ui->comboBox->currentIndex(), ui->checkBox_3->isChecked(), ui->comboBox_2->currentIndex());connect(m_thread, &MyThreadForTextRecognition::getRecognitionText,this,&TextRecognition::getRecognitionText);connect(m_thread, &MyThreadForTextRecognition::recognitionFinish,this,&TextRecognition::recognitionFinish);m_thread->start();
}

4、槽函数

getRecognitionText函数接收到识别的结果之后,会根据checkbox选项是否删除空格和换行,对文字进行处理。

recognitionFinish函数被调用后会关闭loading。

void TextRecognition::getRecognitionText(std::string outText)
{if(outText.empty()){QString dlgTitle = "提示";QString strInfo = QString::fromStdString("解析失败");QMessageBox::information(this, dlgTitle, strInfo, QMessageBox::Ok, QMessageBox::NoButton);return ;}std::string str3 = outText;qDebug() << "识别结果:" << str3.c_str();//循环处理字符串,主要是为了删除一些,不过需要仔细考虑int index = 0;if (!str3.empty()){//如果是中文//if(get_Choise_Language().rfind("chi", 0) == 0)if(ui->checkBox_2->isChecked()){//删除换行符str3.erase(std::remove(str3.begin(), str3.end(), '\n'), str3.end());}if(ui->checkBox->isChecked()){//循环删除所有空格while ((index = str3.find(' ', index)) != std::string::npos){str3.erase(index, 1);}}}QString str(str3.c_str());ui->textEdit->append(str + '\n');//delete [] outText;
}/*** @brief TextRecognition::recognitionFinish* 识别完成*/
void TextRecognition::recognitionFinish()
{loading->setVisible(false);
}

5、效果图

QT案例实战1 - 从零开始编写一个OCR工具软件 (7) 屏幕截图/图像展示/文字识别相关推荐

  1. QT案例实战1 - 从零开始编写一个OCR工具软件 (8) Pdf读取展示/截图/文字识别

    一.PDF读取展示功能 QT提供了pdf.PdfWidgets模块,需要安装模块,然后在项目的CMakeLists.txt文件内,添加如下代码,以便在项目中使用. 官方提供了完整的pdf展示示例,示例 ...

  2. QT案例实战1 - 从零开始编写一个OCR工具软件 (3)创建项目

    一.创建项目 打开Qt Creator,点击Create Project. 可以看到项目类型有应用.应用for python.类库等等,这里选择第一个QT应用,然后第二个栏中选择QT Weidgets ...

  3. QT案例实战1 - 从零开始编写一个OCR工具软件 (6) 关于QThread线程的使用

    一.为什么用线程 在这里将ocr识别的这个耗时的操作放在新线程内,这样是为了主线程/UI界面不会卡在那里没有响应.如果说不在乎用户体验,ocr识别也可以放在主线程,卡住就卡住,就是会被骂. 不过关于线 ...

  4. 从零开始编写一个上位机(串口助手)QT Creator + Python

    提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助.   绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简 ...

  5. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  6. 从零开始编写一个宠物识别系统(爬虫、模型训练和调优、模型部署、Web服务)

    心血来潮,想从零开始编写一个相对完整的深度学习小项目.想到就做,那么首先要考虑的问题是,写什么? 思量再三,我决定写一个宠物识别系统,即给定一张图片,判断图片上的宠物是什么.宠物种类暂定为四类--猫. ...

  7. Linux驱动开发(从零开始编写一个驱动程序)

    1.系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API:open.read.write.close等 (3)驱动源码中提供真正的open.read.write ...

  8. OCR之:Pytesseract端到端文字识别(包含源代码以及极为详细的解释)

    OCR之:Pytesseract端到端文字识别(包含源代码以及极为详细的解释) 提示:此博文详细描述如何使用Pytesseract进行OCR识别,包括基本操作,图像的预处理,角度识别,图像旋转,等等. ...

  9. python编程案例教程-quot;怎样编写一个教学案例quot;python编程案例教程电子教案...

    怎样编写一个教学案例 1.什么是教学案例 (案是论) 教育教学案例是含有解决某些疑难问题,某些原方法.策略运用的教育教学情境故事的描述,故事中渗透课程改革的思想和理念,展现在教育教学理论.方法指导下解 ...

最新文章

  1. 什么?你还在使用fastjson,性能太差了
  2. 安全日志的自动备份方法
  3. 用sql统计vintage,滚动率,迁移率,逾期率
  4. RIP协议无法适应网络环境
  5. iOS培训章节——C++函数的重载
  6. Shiro 编码/加密
  7. ABAP help click F1
  8. 使用Spring Security和jdbc的Spring Boot
  9. 克隆CentOS6虚拟机eth0被修改为eth1如何修改eth0
  10. dubbo-admin安装和简单使用
  11. rpath失效是怎么回事
  12. itop 导入AD用户
  13. videojs如何获取请求消息_WEB之基于HTTP协议的几种实时数据获取技术
  14. linux 关闭僵尸进程,linux下的僵尸进程处理办法
  15. 递推DP UVA 473 Raucous Rockers
  16. atan java_Java Math atan() 使用方法及示例
  17. 随机深林-特征重要性计算方式
  18. 前后端整合+Request(请求转发)+respon(重定向)+get+post+Filter过滤器
  19. 数据挖掘技术的算法与应用读书报告
  20. 另类解决部分黑苹果Monterey下蓝牙睡眠后启动异常缓慢的问题

热门文章

  1. 刚发布!新型病毒下,程序员可在家免费学习了!
  2. 计算机二级PS教学视频百度云,计算机二级ps考试题库完整教程文件.pdf
  3. 【epoll函数】epoll_create、epoll_ctl、epoll_wait
  4. distiller的另一个实例正忙于启动_PLC编程实例丨一步一步教你设计PLC控制电机转停反控制系统~...
  5. [转]win32基础编程知识
  6. aarch64-linux-gnu交叉编译器二进制方式安装
  7. 【SQL查询表中某一字段重复的数据】
  8. #pragma warning 启用和禁用warning
  9. 2023年音视频开发前景如何?音视频开发需要掌握哪些技术?
  10. 第35篇 网络(五)获取本机网络信息