QT 事例 1 - OCR ツール ソフトウェアをゼロから作成する (7) スクリーンショット/画像表示/テキスト認識

1. 画像テキスト認識機能

        前回の記事でocr認識エンジンを紹介し、認識用のスレッドにも呼び出しエンジンを実装しました。基本的な機能が揃っているので、機能とUIをまとめて整理できます。

        画像とテキスト認識の機能については、UIが2つに分かれており、左側はスクリーンショット、画像を開く、画像表示の機能を実現しています。

         右側はOCRエンジンの選択、言語の選択、テキストの抽出と抽出後の簡単な処理の機能。

2.機能説明

1.スクリーンショット

        スクリーンショット関数は、以下にリンクされている実装と同じです。

オーディオとビデオの学習 - Qt 6.3.1 バージョンでのスクリーンショット機能の実装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 関数が認識結果を受け取った後、チェックボックス オプションがスペースと改行を削除するかどうかに従って、テキストを処理します。

        認識完了関数が呼び出された後、読み込みが閉じられます。

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. レンダリング

おすすめ

転載: blog.csdn.net/bashendixie5/article/details/127157171