c++调用python实现图片ocr识别

 更新时间:2023年09月05日 08:19:39   作者:方方洛  
所谓c++调用python,实际上就是在c++中把整个python当作一个第三方库引入,然后使用特定的接口来调用python的函数或者直接执行python脚本,本文介绍的是调用python实现图片ocr识别,感兴趣的可以了解下

一、简介

本文来使用c++调用python实现图像的ocr。

所谓c++调用python,实际上就是在c++中把整个python当作一个第三方库引入,然后使用特定的接口来调用python的函数或者直接执行python脚本。

文章中使用的操作系统是windows10,visual stdio 2022 c++编译环境是Release x64。

二、具体实现

1.python 部分的 ocr 代码

我们首先要保证 python 代码能够正常运行,因此要先安装 python 的第三方库。

pip install paddlepaddle-gpu paddleocr opencv-python

如果文件目录中有中文,比如出现用户名为中文的情况,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 函数来实现我们 python 部分的主体逻辑。因为只是作为一个例子,所以逻辑并没有那么复杂。在 ocrImage 函数内,我们使用 opencv 将图片读入内存,然后传递给 ocr.ocr 函数,获取识别后的所有文本。接着将文本中间间隔空格拼接,之后返回,这么写主要是供 cpp 调用,便于演示。

我们本次所识别的图片是下面这张:

paddleocr 是按行识别文字的,打印每个识别结果(t[1][0])的结果是:

如果所要识别的文本是英文和数字,那么推荐在初始化 PaddleOCR 的时候使用 en(英文),这样准确率几乎可以达到100%。虽然语言选择 ch(中文)也可以识别英文和数字,但是在识别英文和数字准确率会大幅下降,会出现把 6 识别成 9 的情况,因为 6 倒过来看是9。

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

首先初始化一个 c++ 空项目,将调试属性改变为Release 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 环境,需要添加python39_d.lib。

如果更改了调试属性,则需要重新引入之前没有添加的第三方库。

3.c++ 中调用 python

创建一个 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 函数中,我们首先使用 Py_SetPythonHome 设置了 python 包的目录,然后使用 Py_Initialize 初始化了 python 的解释器。

接下来在 c++ 里运行了两行 python 脚本设置了 python 的工作目录,如果在上面 ocr 的 python 代码中读入图片使用的是相对地址,那么相对的就是此处设置的工作目录,即 项目根目录/项目名称 文件夹下。

再往后使用 PyImport_Import 引入 名称为 ocr 的 py 脚本,获取 ocr 中名为 ocrImage 的函数,使用 PyObject_CallObject 调用该函数,获取返回值,打印输出。

最终结果如下:

到此这篇关于c++调用python实现图片ocr识别的文章就介绍到这了,更多相关c++ python图片ocr内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++字符串和数字的去重操作和鞍点的寻找

    C++字符串和数字的去重操作和鞍点的寻找

    大家好,本篇文章主要讲的是C++字符串和数字的去重操作和鞍点的寻找,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • OpenCV基于距离变换和分水岭实现图像分割

    OpenCV基于距离变换和分水岭实现图像分割

    图像分割是根据灰度、颜色、纹理和形状等特征,把图像分成若干个特定的、具有独特性质的区域。本文将基于距离变换和分水岭实现图像分割,需要的可以了解一下
    2022-09-09
  • VC++实现程序开机启动运行的方法

    VC++实现程序开机启动运行的方法

    这篇文章主要介绍了VC++实现程序开机启动运行的方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • 详解C语言数据结构之栈

    详解C语言数据结构之栈

    这篇文章主要为大家介绍了C语言数据结构之栈,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言18个必背经典程序

    C语言18个必背经典程序

    这篇文章主要分下工的是18个C语言必背的经典程序,下面文章我们就来看看实例,需要的小伙伴可以参考一下哟,希望对你有所帮助
    2021-10-10
  • C++中关于set删除的一些坑

    C++中关于set删除的一些坑

    这篇文章主要介绍了C++中关于set删除的一些坑,因为这个问题浪费了很多的时间,所以想着分享出来给大家,方便同样遇到这个问题的朋友们,有需要的朋友们下面来一起看看吧。
    2017-02-02
  • C++ 中assert()函数用法总结

    C++ 中assert()函数用法总结

    这篇文章主要介绍了C++ 中assert()函数用法总结的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++中的并行与并发基础与使用详解

    C++中的并行与并发基础与使用详解

    对于多线程来说,这两个概念有很大部分是重叠的。对于很多人来说,它们的意思没有什么区别。其区别主要在于关注点和意图方面(差距甚微)。这两个词都是用来对硬件在同时执行多个任务的方式进行描述的术语,不过并行更加注重性能
    2023-02-02
  • C++ 程序抛出异常后执行顺序说明

    C++ 程序抛出异常后执行顺序说明

    这篇文章主要介绍了C++ 程序抛出异常后执行顺序说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • c语言常量定义规则知识点总结

    c语言常量定义规则知识点总结

    在本篇文章里小编给大家整理的是关于c语言常量定义规则知识点总结,需要的朋友们可以学习下。
    2020-03-03

最新评论