2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > QT案例实战1 - 从零开始编写一个OCR工具软件 (7) 屏幕截图/图像展示/文字识别

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

时间:2022-12-01 16:14:10

相关推荐

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

一、图片文字识别功能

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

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

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

二、功能描述

1、屏幕截图

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。