文章目录
简介
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)