c++調(diào)用python實現(xiàn)圖片ocr識別
一、簡介
本文來使用c++調(diào)用python實現(xiàn)圖像的ocr。
所謂c++調(diào)用python,實際上就是在c++中把整個python當(dāng)作一個第三方庫引入,然后使用特定的接口來調(diào)用python的函數(shù)或者直接執(zhí)行python腳本。
文章中使用的操作系統(tǒng)是windows10,visual stdio 2022 c++編譯環(huán)境是Release x64。
二、具體實現(xiàn)
1.python 部分的 ocr 代碼
我們首先要保證 python 代碼能夠正常運行,因此要先安裝 python 的第三方庫。
pip install paddlepaddle-gpu paddleocr opencv-python
如果文件目錄中有中文,比如出現(xiàn)用戶名為中文的情況,paddleocr 就無法運行。
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] 中記錄了識別目標(biāo)在圖片中的位置
? ? ? ?// t[1][0] 記錄的是識別目標(biāo)的文本
? ? ? ?res = res + t[1][0] + " "
? ?return res我們先引入 paddleocr 和 opencv,然后初始化ocr,再定義一個 ocrImage 函數(shù)來實現(xiàn)我們 python 部分的主體邏輯。因為只是作為一個例子,所以邏輯并沒有那么復(fù)雜。在 ocrImage 函數(shù)內(nèi),我們使用 opencv 將圖片讀入內(nèi)存,然后傳遞給 ocr.ocr 函數(shù),獲取識別后的所有文本。接著將文本中間間隔空格拼接,之后返回,這么寫主要是供 cpp 調(diào)用,便于演示。
我們本次所識別的圖片是下面這張:

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

如果所要識別的文本是英文和數(shù)字,那么推薦在初始化 PaddleOCR 的時候使用 en(英文),這樣準(zhǔn)確率幾乎可以達(dá)到100%。雖然語言選擇 ch(中文)也可以識別英文和數(shù)字,但是在識別英文和數(shù)字準(zhǔn)確率會大幅下降,會出現(xiàn)把 6 識別成 9 的情況,因為 6 倒過來看是9。
2.在c++中引入Python.h
首先初始化一個 c++ 空項目,將調(diào)試屬性改變?yōu)镽elease x64。接著在 visual stdio 中點擊項目->項目名稱+屬性。點擊 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。

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

如果更改了調(diào)試屬性,則需要重新引入之前沒有添加的第三方庫。
3.c++ 中調(diào)用 python
創(chuàng)建一個 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++ 里運行了兩行 python 腳本設(shè)置了 python 的工作目錄,如果在上面 ocr 的 python 代碼中讀入圖片使用的是相對地址,那么相對的就是此處設(shè)置的工作目錄,即 項目根目錄/項目名稱 文件夾下。
再往后使用 PyImport_Import 引入 名稱為 ocr 的 py 腳本,獲取 ocr 中名為 ocrImage 的函數(shù),使用 PyObject_CallObject 調(diào)用該函數(shù),獲取返回值,打印輸出。
最終結(jié)果如下:

到此這篇關(guān)于c++調(diào)用python實現(xiàn)圖片ocr識別的文章就介紹到這了,更多相關(guān)c++ python圖片ocr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sublime Text 3 實現(xiàn)C語言代碼的編譯和運行(示例講解)
下面小編就為大家?guī)硪黄猄ublime Text 3 實現(xiàn)C語言代碼的編譯和運行(示例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出
這篇文章主要介紹了C語言文字藝術(shù)之?dāng)?shù)據(jù)輸入輸出,C語言的語句用來向計算機系統(tǒng)發(fā)出操作指令。一條語句編寫完成經(jīng)過編譯后產(chǎn)生若干條機器指2022-07-07
C++ const的使用及this指針常方法(面試最愛問的this指針)
這篇文章主要介紹了C++ const的使用,this指針,常方法(面試最愛問的this指針),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
一篇文章帶你了解C++(STL基礎(chǔ)、Vector)
這篇文章主要為大家詳細(xì)介紹了C++ STL基礎(chǔ),vector向量容器使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-08-08
C語言實現(xiàn)父進(jìn)程主動終止子進(jìn)程的方法總結(jié)
一般的情況,子進(jìn)程自己運行完后,執(zhí)行exit 或者return 后,父進(jìn)程wait. waitpid收回子進(jìn)程,但子進(jìn)程是一個循環(huán)等待狀態(tài)不主動退出,父進(jìn)程可以采用文中介紹的幾種方法,需要的朋友可以參考下2023-10-10

