linux系统上使用Python调用C++生成的.so动态链接库opencv

从环境配置开始,做一些参考链接,我是根据这些链接调试成功的。

在新服务器172.16.5.143的操作记录,CentOS

  1. 生成.so文件:ubuntu下将c++转换为so文件并利用python调用 - 水木清扬 - 博客园 (cnblogs.com)
  2. CentOS与ubuntu的指令有点区别sudo: apt-get:找不到命令_零°豆的博客-CSDN博客
  3. 在服务器上装OpenCV:总结:CentOS 安装opencv4.1.0的详细安装步骤 (更新VideoCapture)_verystory的博客-CSDN博客
  4. 直接用g++编译出现找不到opencv 就在后面加上这个人的这句话,

 -I /usr/local/include/opencv4 -L /usr/local/lib64 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_videoio -std=gnu++11

  1. 使用这个人的Python调用C++.so文件!!简单有用:python调用c++模块.so库, 互相回传数据(ctypes、pybind11) - 知乎 (zhihu.com)
  2. 执行g++报错: `GLIBCXX_3.4.26' not found 解决类似运行报错: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21‘ not found 的问题_吃素的施子的博客-CSDN博客

接下来是操作步骤:

成功使用Python调用.so运行的完整步骤:

  1. 首先编译cpp文件:
    g++ mydll.cpp -fpic -shared -o lib4cloudreg.so  -I /usr/local/include/opencv4 -L /usr/local/lib64 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_videoio -std=gnu++11

后面这些主要是OpenCV的环境问题,编译完会生成一个libmydll.so

  1. 修改Python代码中的图片地址:

  1. 执行python3 test.py

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过使用`ctypes`来实现Python调用C++代码的功能。具体来说,您需要编写C++函数并将其编译为共享(.so或.dll文件),然后使用`ctypes`Python中加载该调用该函数。 以下是一个简单的示例,演示如何使用`ctypes`Python调用C++函数,该函数使用OpenCV并返回一个`np.array`类型的图像: C++代码(mylib.cpp): ```c++ #include <opencv2/opencv.hpp> extern "C" { void process_image(unsigned char* data, int width, int height, int channels, unsigned char* output) { cv::Mat img(height, width, CV_MAKETYPE(CV_8U, channels), data); cv::Mat out_img; cv::cvtColor(img, out_img, cv::COLOR_BGR2GRAY); out_img.copyTo(cv::Mat(height, width, CV_MAKETYPE(CV_8U, 1), output)); } } ``` Python代码: ```python import ctypes import numpy as np import cv2 # Load shared library lib = ctypes.cdll.LoadLibrary('./mylib.so') # Define function arguments and return type lib.process_image.argtypes = [ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_ubyte)] lib.process_image.restype = None # Load input image img = cv2.imread('input.png') data = np.frombuffer(img.tobytes(), dtype=np.uint8) width, height, channels = img.shape # Allocate output buffer out_data = np.zeros((height, width), dtype=np.uint8) # Call C++ function lib.process_image(data.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)), width, height, channels, out_data.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))) # Convert output buffer to np.array out_img = np.frombuffer(out_data.tobytes(), dtype=np.uint8).reshape((height, width)) # Display output image cv2.imshow('Output', out_img) cv2.waitKey(0) ``` 在这个示例中,我们使用`ctypes`加载了名为`mylib.so`的共享,并定义了一个名为`process_image`的函数,该函数使用OpenCV将输入图像转换为灰度图像,并将结果保存到输出缓冲区中。然后,我们从Python中加载输入图像,并为输出图像分配一个缓冲区。最后,我们调用C++函数,并将输入和输出数据指针传递给该函数。最后,我们将输出缓冲区转换为`np.array`类型,并在OpenCV窗口中显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值