最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、簡介

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

所謂c++調(diào)用python,實際上就是在c++中把整個python當作一個第三方庫引入,然后使用特定的接口來調(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] 中記錄了識別目標在圖片中的位置
 ? ? ? ?// t[1][0] 記錄的是識別目標的文本
 ? ? ? ?res = res + t[1][0] + " "
 ? ?return res

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

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

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

如果所要識別的文本是英文和數(shù)字,那么推薦在初始化 PaddleOCR 的時候使用 en(英文),這樣準確率幾乎可以達到100%。雖然語言選擇 ch(中文)也可以識別英文和數(shù)字,但是在識別英文和數(shù)字準確率會大幅下降,會出現(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)文章

最新評論

嘉祥县| 红安县| 晋江市| 杭州市| 库尔勒市| 太白县| 大渡口区| 南木林县| 灵山县| 阿拉善盟| 鄢陵县| 田林县| 闸北区| 南汇区| 博罗县| 陆川县| 湘阴县| 黔江区| 两当县| 广水市| 东乡| 邵东县| 鸡泽县| 长宁县| 象州县| 孟村| 海门市| 封丘县| 滦平县| 天水市| 拜城县| 丰台区| 闸北区| 天台县| 汉源县| 喜德县| 石河子市| 三河市| 沧州市| 灵丘县| 浮梁县|