欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++調(diào)用python實(shí)現(xiàn)圖片ocr識(shí)別

 更新時(shí)間:2023年09月05日 08:19:39   作者:方方洛  
所謂c++調(diào)用python,實(shí)際上就是在c++中把整個(gè)python當(dāng)作一個(gè)第三方庫引入,然后使用特定的接口來調(diào)用python的函數(shù)或者直接執(zhí)行python腳本,本文介紹的是調(diào)用python實(shí)現(xiàn)圖片ocr識(shí)別,感興趣的可以了解下

一、簡介

本文來使用c++調(diào)用python實(shí)現(xiàn)圖像的ocr。

所謂c++調(diào)用python,實(shí)際上就是在c++中把整個(gè)python當(dāng)作一個(gè)第三方庫引入,然后使用特定的接口來調(diào)用python的函數(shù)或者直接執(zhí)行python腳本。

文章中使用的操作系統(tǒng)是windows10,visual stdio 2022 c++編譯環(huán)境是Release x64。

二、具體實(shí)現(xiàn)

1.python 部分的 ocr 代碼

我們首先要保證 python 代碼能夠正常運(yùn)行,因此要先安裝 python 的第三方庫。

pip install paddlepaddle-gpu paddleocr opencv-python

如果文件目錄中有中文,比如出現(xiàn)用戶名為中文的情況,paddleocr 就無法運(yùn)行。

from paddleocr import PaddleOCR
import cv2
?
ocr = PaddleOCR(use_angle_cls=True, lang="en")
?
def ocrImage():
 ? ?image = cv2.imread('./images/images.jpg')
 ? ?text = ocr.ocr(image, cls=True)[0]
 ? ?res = ""
 ? ?for t in text:
 ? ? ? ?// t[0] 中記錄了識(shí)別目標(biāo)在圖片中的位置
 ? ? ? ?// t[1][0] 記錄的是識(shí)別目標(biāo)的文本
 ? ? ? ?res = res + t[1][0] + " "
 ? ?return res

我們先引入 paddleocr 和 opencv,然后初始化ocr,再定義一個(gè) ocrImage 函數(shù)來實(shí)現(xiàn)我們 python 部分的主體邏輯。因?yàn)橹皇亲鳛橐粋€(gè)例子,所以邏輯并沒有那么復(fù)雜。在 ocrImage 函數(shù)內(nèi),我們使用 opencv 將圖片讀入內(nèi)存,然后傳遞給 ocr.ocr 函數(shù),獲取識(shí)別后的所有文本。接著將文本中間間隔空格拼接,之后返回,這么寫主要是供 cpp 調(diào)用,便于演示。

我們本次所識(shí)別的圖片是下面這張:

paddleocr 是按行識(shí)別文字的,打印每個(gè)識(shí)別結(jié)果(t[1][0])的結(jié)果是:

如果所要識(shí)別的文本是英文和數(shù)字,那么推薦在初始化 PaddleOCR 的時(shí)候使用 en(英文),這樣準(zhǔn)確率幾乎可以達(dá)到100%。雖然語言選擇 ch(中文)也可以識(shí)別英文和數(shù)字,但是在識(shí)別英文和數(shù)字準(zhǔn)確率會(huì)大幅下降,會(huì)出現(xiàn)把 6 識(shí)別成 9 的情況,因?yàn)?6 倒過來看是9。

2.在c++中引入Python.h

首先初始化一個(gè) c++ 空項(xiàng)目,將調(diào)試屬性改變?yōu)镽elease x64。接著在 visual stdio 中點(diǎn)擊項(xiàng)目->項(xiàng)目名稱+屬性。點(diǎn)擊 VC++ 目錄,在包含目錄中添加:

C:\Users\xxx\AppData\Local\Programs\Python\Python39\include

在庫目錄中添加:

C:\Users\xxx\AppData\Local\Programs\Python\Python39\libs

也就是找到 python 的安裝位置,分別引入python下的 include 和 libs 文件夾。我所使用的 python 版本是 3.9。

接著點(diǎn)擊展開鏈接器->輸入。在附加依賴項(xiàng)中添加 python39.lib,如果是 debug 環(huán)境,需要添加python39_d.lib。

如果更改了調(diào)試屬性,則需要重新引入之前沒有添加的第三方庫。

3.c++ 中調(diào)用 python

創(chuàng)建一個(gè) main.cpp 文件,寫入以下代碼

#include<iostream>
#include<Python.h>
#include<string>
?
using namespace std;
?
int main() {
    Py_SetPythonHome(L"C:\Users\xxx\AppData\Local\Programs\Python\Python39");
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
?
    PyObject* pName = PyUnicode_FromString("ocr");
    PyObject* pyModule = PyImport_Import(pName);
?
    if (!pyModule) {
        cout << "Cannot found pyModule!" << endl;
        return 0;
    }
    PyObject* ocrFunc = PyObject_GetAttrString(pyModule, "ocrImage");
    PyObject* pyReturnValue = PyObject_CallObject(ocrFunc, NULL);
    char* res = NULL;
    PyArg_Parse(pyReturnValue, "s", &res);
    string tag(res);
    cout << tag << endl;
    return 0;
};

我們先引入了iostream、Python.h、string,使用了命名空間std。在 main 函數(shù)中,我們首先使用 Py_SetPythonHome 設(shè)置了 python 包的目錄,然后使用 Py_Initialize 初始化了 python 的解釋器。

接下來在 c++ 里運(yùn)行了兩行 python 腳本設(shè)置了 python 的工作目錄,如果在上面 ocr 的 python 代碼中讀入圖片使用的是相對(duì)地址,那么相對(duì)的就是此處設(shè)置的工作目錄,即 項(xiàng)目根目錄/項(xiàng)目名稱 文件夾下。

再往后使用 PyImport_Import 引入 名稱為 ocr 的 py 腳本,獲取 ocr 中名為 ocrImage 的函數(shù),使用 PyObject_CallObject 調(diào)用該函數(shù),獲取返回值,打印輸出。

最終結(jié)果如下:

到此這篇關(guān)于c++調(diào)用python實(shí)現(xiàn)圖片ocr識(shí)別的文章就介紹到這了,更多相關(guān)c++ python圖片ocr內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Sublime Text 3 實(shí)現(xiàn)C語言代碼的編譯和運(yùn)行(示例講解)

    Sublime Text 3 實(shí)現(xiàn)C語言代碼的編譯和運(yùn)行(示例講解)

    下面小編就為大家?guī)硪黄猄ublime Text 3 實(shí)現(xiàn)C語言代碼的編譯和運(yùn)行(示例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出

    C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出

    這篇文章主要介紹了C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出,C語言的語句用來向計(jì)算機(jī)系統(tǒng)發(fā)出操作指令。一條語句編寫完成經(jīng)過編譯后產(chǎn)生若干條機(jī)器指
    2022-07-07
  • C++中 string 中的常用方法使用心得

    C++中 string 中的常用方法使用心得

    這篇文章主要介紹了C++中 string 中的常用方法使用心得,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++ const的使用及this指針常方法(面試最愛問的this指針)

    C++ const的使用及this指針常方法(面試最愛問的this指針)

    這篇文章主要介紹了C++ const的使用,this指針,常方法(面試最愛問的this指針),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • VC++創(chuàng)建msi文件的方法

    VC++創(chuàng)建msi文件的方法

    這篇文章主要介紹了VC++創(chuàng)建msi文件的方法,對(duì)于應(yīng)用程序的開發(fā)有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • 一篇文章帶你了解C++(STL基礎(chǔ)、Vector)

    一篇文章帶你了解C++(STL基礎(chǔ)、Vector)

    這篇文章主要為大家詳細(xì)介紹了C++ STL基礎(chǔ),vector向量容器使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • C語言實(shí)現(xiàn)注冊登錄系統(tǒng)

    C語言實(shí)現(xiàn)注冊登錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)注冊登錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • c++ 數(shù)組定義及初始化詳解

    c++ 數(shù)組定義及初始化詳解

    這篇文章主要介紹了c++ 數(shù)組定義及初始化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)

    C語言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)

    一般的情況,子進(jìn)程自己運(yùn)行完后,執(zhí)行exit 或者return 后,父進(jìn)程wait.  waitpid收回子進(jìn)程,但子進(jìn)程是一個(gè)循環(huán)等待狀態(tài)不主動(dòng)退出,父進(jìn)程可以采用文中介紹的幾種方法,需要的朋友可以參考下
    2023-10-10
  • C++中多線程的執(zhí)行順序如你預(yù)期嗎

    C++中多線程的執(zhí)行順序如你預(yù)期嗎

    這篇文章主要為大家詳細(xì)介紹一下C++中多線程的執(zhí)行順序的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++多線程有一定幫助,需要的可以參考一下
    2022-10-10

最新評(píng)論