Python调用C++代码(含OpenCV cv::Mat转换 传输数据)

简介

Python因为编写简单、易用而被广泛使用,但是其效率比较低下。尤其是在计算机视觉、图像处理领域,C++调用GPU,相对于Python可能是10倍以上的提速。一些开源的算法通常是使用C++来实现。经常会有需求需要快速用Python实现一个项目,然后其中要调用一段C++代码。

本方法使用了一个开源库,pyboostcvconverter,这个C++库被编译后,会生成.so,在.so路径下,就可以用Python通过import pbcvt来调用其中编写的转换方法。

因项目需求,在Python中会读取到图像,图像是numpy.ndarray类型的,而C++的函数的参数是用cv::Mat类型的,怎么进行这两者的转换也是关键。这个库将Python的numpy.ndarray转成C++的cv::Mat,C++函数返回的cv::Mat又会被转成Python的numpy.ndarray

库结构 + 添加你的函数

在pyboostcvconverter/src目录下有4个文件:

  • pyboost_cv2_converter.cpp
  • pyboost_cv3_converter.cpp
  • pyboost_cv4_converter.cpp
  • python_module.cpp (关键代码,需要添加代码的地方)

python_module.cpp中添加相应内容,便可以添加Python可以调用的C++函数。

#define PY_ARRAY_UNIQUE_SYMBOL pbcvt_ARRAY_API
 
#include <boost/python.hpp>
#include <pyboostcvconverter/pyboostcvconverter.hpp>
#include <opencv2/opencv.hpp>
//添加相应用到的头文件

namespace pbcvt {
   
 
    using namespace boost::python;
 
/**
 * @brief Example function. Basic inner matrix product using explicit matrix conversion.
 * @param left left-hand matrix operand (NdArray required)
 * @param right right-hand matrix operand (NdArray required)
 * @return an NdArray representing the dot-product of the left and right operands
 */
    PyObject *dot(PyObject *left, PyObject *right) {
   
 
        cv::Mat leftMat, rightMat;
        leftMat = pbcvt::fromNDArrayToMat(left);
        rightMat = pbcvt::fromNDArrayToMat(right);
        auto c1 = leftMat.cols, r2 = rightMat.rows;
        // Check that the 2-D matrices can be legally multiplied.
        if (c1 != r2)
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python调用C++并传递cv::Mat据,可以使用OpenCV库将cv::Mat转换C++中的Mat类型。下面是一个示例代码,展示了如何在Python调用一个接受cv::Mat据的C++: 假设我们有一个C++,它接受一个cv::Mat类型的图像据: ```c++ #include <iostream> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> void my_function(cv::Mat& image) { cv::imwrite("output.jpg", image); } ``` 现在,我们可以在Python中使用OpenCV库来读取一张图像,并将其转换cv::Mat类型的据,然后将其传递给这个C++。下面是示例代码: ```python import cv2 import numpy as np import ctypes # 加载C++编译后的动态链接库 lib = ctypes.cdll.LoadLibrary('./libexample.so') # 定义函类型 lib.my_function.argtypes = [ctypes.c_void_p] # 读取一张图像,并将其转换cv::Mat类型的据 image = cv2.imread('input.jpg') image_data = np.ascontiguousarray(image) image_data_ptr = image_data.ctypes.data_as(ctypes.c_void_p) # 将cv::Mat类型的据传递给C++ lib.my_function(image_data_ptr) ``` 在上面的示例代码中,我们首先使用`cdll.LoadLibrary()`函加载C++编译后的动态链接库。接着,我们使用`argtypes`属性定义了C++的参类型,其中`ctypes.c_void_p`表示无类型指针。然后,我们使用OpenCV库读取一张图像,并使用`np.ascontiguousarray()`函将图像转换为连续的内存块。最后,我们使用`ctypes.c_void_p`类型将图像据的内存地址传递给C++`my_function()`。 需要注意的是,在传递cv::Mat据时,需要确保图像据是连续的。如果图像据不是连续的,需要使用`np.ascontiguousarray()`函将其转换为连续的内存块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值