1. 画像テキスト認識機能
前回の記事でocr認識エンジンを紹介し、認識用のスレッドにも呼び出しエンジンを実装しました。基本的な機能が揃っているので、機能とUIをまとめて整理できます。
画像とテキスト認識の機能については、UIが2つに分かれており、左側はスクリーンショット、画像を開く、画像表示の機能を実現しています。
右側はOCRエンジンの選択、言語の選択、テキストの抽出と抽出後の簡単な処理の機能。
2.機能説明
1.スクリーンショット
スクリーンショット関数は、以下にリンクされている実装と同じです。
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 関数が認識結果を受け取った後、チェックボックス オプションがスペースと改行を削除するかどうかに従って、テキストを処理します。
認識完了関数が呼び出された後、読み込みが閉じられます。
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);
}