当前位置:   article > 正文

Linux离线文字识别 C++ 调用easyocr_python easyocr c++

python easyocr c++

easyocr是一个python文字识别库,支持80种语言。直接用python调用的话,还是很简单的,代码量很少,对用户友好满分。如果需要C++调用,需要用到c-python。这块千万别去chatgpt,有很多坑。

0,github:GitHub - JaidedAI/EasyOCR: Ready-to-use OCR with 80+ supported languages and all popular writing scripts including Latin, Chinese, Arabic, Devanagari, Cyrillic and etc.1,测试及支持语言列表:Jaided AI: EasyOCR demo

2,安装

如果需要GPU版本的easyocr,需要先安装GPU版本的torch库等(这块比较复杂)。如果只是需要CPU版本的easyocr的话,直接一句指令安装即可:

pip3 install easyocr -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn

3,python调用直接识别文件

  1. import easyocr
  2. reader = easyocr.Reader(['en'])
  3. result = reader.readtext('/home/huahua/lpr_eng.jpg)
  4. print(result)

4,python调用识别mat

  1. import easyocr
  2. import cv2
  3. reader = easyocr.Reader(['en'])
  4. img = cv2.imread('/home/huahua/lpr_eng.jpg')
  5. result = reader.readtext(img)
  6. print(result)

5,python调用增加可选参数白名单

  1. import easyocr
  2. import cv2
  3. reader = easyocr.Reader(['en'])
  4. img = cv2.imread('/home/huahua/lpr_eng.jpg')
  5. result = reader.readtext(img, allowlist='ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890')
  6. print(result)

6,C++调用直接识别文件

  1. #include <Python.h>
  2. #include <iostream>
  3. //编译:g++ -o callEasyOcr callEasyOcr.cpp -I /usr/include/python3.8 -lpython3.8
  4. int main() {
  5. // 初始化Python解释器
  6. Py_Initialize();
  7. // 导入EasyOCR模块
  8. PyObject* pModule = PyImport_ImportModule("easyocr");
  9. if (pModule != NULL) {
  10. std::cout<<"PyImport_ImportModule easyocr success!"<<std::endl;
  11. // 获取EasyOCR类
  12. PyObject* pClass = PyObject_GetAttrString(pModule, "Reader");
  13. if (pClass != NULL && PyCallable_Check(pClass)) {
  14. std::cout<<"PyObject_GetAttrString Reader success!"<<std::endl;
  15. // 准备参数
  16. PyObject* langs = PyList_New(2);
  17. PyList_SetItem(langs, 0, PyUnicode_FromString("ch_sim"));
  18. PyList_SetItem(langs, 1, PyUnicode_FromString("en"));
  19. PyObject* pArgs = PyTuple_New(1);
  20. PyTuple_SetItem(pArgs, 0, langs);
  21. // 创建EasyOCR对象
  22. PyObject* pInstance = PyObject_CallObject(pClass, pArgs);
  23. if (pInstance != NULL) {
  24. std::cout<<"PyObject_CallObject pClass success!"<<std::endl;
  25. // 调用EasyOCR对象的readtext方法
  26. PyObject* pResult = PyObject_CallMethod(pInstance, "readtext", "(s)", "/home/huahua/lpr_ch_en.jpg");
  27. if (pResult != NULL) {
  28. std::cerr << "Call readtext success" << std::endl;
  29. // 解析结果
  30. int resultSize = PyList_Size(pResult);
  31. for(int i=0;i<resultSize;i++)
  32. {
  33. PyObject *listItem = PyList_GetItem(pResult,i);
  34. Py_ssize_t listItemsize = PyTuple_Size(listItem);
  35. for (Py_ssize_t i = 0; i < listItemsize; ++i) {
  36. PyObject* tupleItem = PyTuple_GetItem(listItem, i);
  37. if (tupleItem != NULL && PyUnicode_Check(tupleItem)) {
  38. const char* text = PyUnicode_AsUTF8(tupleItem);
  39. std::cout << text << std::endl;
  40. }
  41. }
  42. }
  43. Py_DECREF(pResult);
  44. } else {
  45. std::cerr << "Call croppedImage failed" << std::endl;
  46. PyErr_Print();
  47. }
  48. // 释放EasyOCR对象
  49. Py_DECREF(pInstance);
  50. } else {
  51. std::cerr << "Failed to create instance" << std::endl;
  52. PyErr_Print();
  53. }
  54. // 释放EasyOCR类
  55. Py_DECREF(pClass);
  56. } else {
  57. std::cerr << "Class not found" << std::endl;
  58. PyErr_Print();
  59. }
  60. // 释放EasyOCR模块
  61. Py_DECREF(pModule);
  62. } else {
  63. PyErr_Print();
  64. std::cerr << "Module not found" << std::endl;
  65. }
  66. // 清理Python解释器
  67. Py_Finalize();
  68. return 0;
  69. }

7,C++调用识别mat

  1. #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
  2. #include <Python.h>
  3. #include <numpy/arrayobject.h>
  4. #include <opencv2/opencv.hpp>
  5. #include <iostream>
  6. #include <unistd.h>
  7. #include <time.h>
  8. //编译:g++ -o easyocr-opencv easyocr-opencv.cpp -I /usr/include/python3.8 -I /home/huahua/.local/lib/python3.8/site-packages/numpy/core/include -lpython3.8 `pkg-config --cflags --libs opencv4`
  9. //读取图片
  10. cv::Mat readPictureFile(char* filePath)
  11. {
  12. // 1. 读取整个图片
  13. cv::Mat originalImage = cv::imread(filePath, cv::IMREAD_COLOR); // 替换为您的输入图片路径
  14. if (originalImage.empty())
  15. {
  16. std::cerr << "Could not open or find the image" << std::endl;
  17. }
  18. return originalImage;
  19. }
  20. int main() {
  21. // 初始化Python解释器
  22. Py_Initialize();
  23. import_array();//使用numy数组传入图片数据要加的
  24. // 加载EasyOCR模块
  25. PyObject* easyocr_module = PyImport_ImportModule("easyocr");
  26. if (easyocr_module == NULL) {
  27. std::cerr << "Failed to import easyocr module" << std::endl;
  28. PyErr_Print();
  29. return 1;
  30. }
  31. // 获取EasyOCR的Reader类
  32. PyObject* reader_class = PyObject_GetAttrString(easyocr_module, "Reader");
  33. if (reader_class == NULL || !PyCallable_Check(reader_class)) {
  34. std::cerr << "Failed to get easyocr Reader class" << std::endl;
  35. PyErr_Print();
  36. Py_XDECREF(easyocr_module);
  37. return 1;
  38. }
  39. // 准备参数
  40. PyObject* langs = PyList_New(2);
  41. PyList_SetItem(langs, 0, PyUnicode_FromString("ch_sim"));
  42. PyList_SetItem(langs, 1, PyUnicode_FromString("en"));
  43. PyObject* pArgs = PyTuple_New(1);
  44. PyTuple_SetItem(pArgs, 0, langs);
  45. // 创建Reader对象
  46. PyObject* reader_instance = PyObject_CallObject(reader_class, pArgs);
  47. if (reader_instance == NULL) {
  48. std::cerr << "Failed to create easyocr Reader instance" << std::endl;
  49. PyErr_Print();
  50. Py_XDECREF(easyocr_module);
  51. Py_XDECREF(reader_class);
  52. return 1;
  53. }
  54. // 加载并读取截图数据为OpenCV的Mat对象,假设截图数据已经存储在cv::Mat对象image中
  55. cv::Mat originalImage = readPictureFile("//home/huahua/lpr_croppedImage.jpg");//读文件
  56. cv::Mat croppedImage;cv::cvtColor(originalImage, croppedImage, cv::COLOR_BGR2RGB);
  57. // 将OpenCV的Mat对象转换为numpy数组对象
  58. npy_intp dims[] = {croppedImage.rows, croppedImage.cols, croppedImage.channels()};
  59. PyObject *numpy_array = PyArray_SimpleNewFromData(3, dims, NPY_UINT8, croppedImage.data);//记得加import_array();不然会段错误
  60. // 调用OCR识别
  61. printTime("readtext begin");
  62. PyObject* pResult = PyObject_CallMethod(reader_instance, "readtext", "(O)", numpy_array);
  63. printTime("readtext end");
  64. Py_XDECREF(numpy_array);
  65. if (pResult == NULL) {
  66. std::cerr << "Failed to call easyocr readtext method" << std::endl;
  67. PyErr_Print();
  68. } else {
  69. std::cerr << "Call success" << std::endl;
  70. // 解析结果
  71. int resultSize = PyList_Size(pResult);
  72. for(int i=0;i<resultSize;i++)
  73. {
  74. PyObject *listItem = PyList_GetItem(pResult,i);
  75. Py_ssize_t listItemsize = PyTuple_Size(listItem);
  76. for (Py_ssize_t i = 0; i < listItemsize; ++i) {
  77. PyObject* tupleItem = PyTuple_GetItem(listItem, i);
  78. if (tupleItem != NULL && PyUnicode_Check(tupleItem)) {
  79. const char* text = PyUnicode_AsUTF8(tupleItem);
  80. std::cout << text << std::endl;
  81. }
  82. }
  83. }
  84. }
  85. Py_DECREF(pResult);
  86. // 释放资源
  87. Py_XDECREF(easyocr_module);
  88. Py_XDECREF(reader_class);
  89. Py_XDECREF(reader_instance);
  90. // 清理Python解释器
  91. Py_Finalize();
  92. return 0;
  93. }

特征:库加载的时候需要的时间和硬件资源比较多,基本CPU要跑满。

优势:会自动下载新的语言包(需要网络)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/524743
推荐阅读
相关标签
  

闽ICP备14008679号