c++調(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)行(示例講解)
下面小編就為大家?guī)硪黄猄ublime Text 3 實(shí)現(xiàn)C語言代碼的編譯和運(yùn)行(示例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出
這篇文章主要介紹了C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出,C語言的語句用來向計(jì)算機(jī)系統(tǒng)發(fā)出操作指令。一條語句編寫完成經(jīng)過編譯后產(chǎn)生若干條機(jī)器指2022-07-07C++ const的使用及this指針常方法(面試最愛問的this指針)
這篇文章主要介紹了C++ const的使用,this指針,常方法(面試最愛問的this指針),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04一篇文章帶你了解C++(STL基礎(chǔ)、Vector)
這篇文章主要為大家詳細(xì)介紹了C++ STL基礎(chǔ),vector向量容器使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-08-08C語言實(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