您的位置:首页 > 编程语言 > C语言/C++

Boost.Python3将C++代码封装为Python模块,并在Python中调用封装的动态库so文件cmake, boost, opencv3,numpy

2019-04-23 01:14 1271 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/bengqian1670/article/details/89433094

boost::python库是pyhon和c++相互交互的框架,可以在python中调用c++的类和函数等,也可以让c++调用python的类和方法。相比于ctype等,boost::python可以将C++代码更方便、快捷地移植到python模块当中,实现对python模块的扩充。
这里利用boostpython封装c++函数的几个小例子,将C++下的代码编译为动态库,并将生成的动态库命名为封装模块的名字。
编译boostpython https://blog.csdn.net/bengqian1670/article/details/89222006
我用的是python3 和 boost_1_69_0

opencv

c++函数中调用了opencv的库函数
interact.cpp

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <boost/python.hpp>

using namespace cv;

int main(){}
void visualize()
{
cv::Mat image;
image = cv::imread("in000001.jpg");
//cv::Mat GrayOriginal;
cvtColor(image, image, CV_BGR2GRAY);
image.convertTo(image, CV_64FC1, 1.0 / 255);
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);

// return image.at<cv::Vec3b>(2, 3)[0];
}

using namespace boost::python;
BOOST_PYTHON_MODULE(interact) // file name
{
def("visualize", visualize); //function name
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(interact)

FIND_PACKAGE(Boost COMPONENTS python)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
include_directories(SYSTEM ${Boost_INCLUDE_DIR})
include_directories(/home/ysy/anaconda3/envs/ysy/include/python3.6m)

link_libraries(${BOOST_LIBRARIES} ${PYTHON_LIBRARIES})

find_package( OpenCV REQUIRED )

add_library(interact SHARED interact.cpp)

set_target_properties(interact PROPERTIES PREFIX "")

target_link_libraries(interact ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} ${OpenCV_LIBS})

python传numpy参数给c++函数

在c++中使用python中numpy的数据类型,numpy从python传入c++函数,最后传回python
interact.cpp

#include<boost/python.hpp>
#include<boost/python/numeric.hpp>
#include<iostream>
using namespace boost::python;
void test_array(numeric::array &y, float value)
{
const tuple &shape= extract<tuple>(y.attr("shape"));
int h = extract<int>(shape[0]);    // extract<int> numpy数据转为c++类型的数据
int w = extract<int>(shape[1]);
for(int h_i=0;h_i<h;++h_i)
for(int w_i=0;w_i<w;++w_i)
y[make_tuple(h_i,w_i)]=h_i-w_i;
y[make_tuple(0,0)] = value;
}
BOOST_PYTHON_MODULE(array_test)
{
numeric::array::set_module_and_type("numpy", "ndarray");
def("test",&test_array);
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(interact)

FIND_PACKAGE(Boost COMPONENTS python)

FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
include_directories(SYSTEM ${Boost_INCLUDE_DIR})
include_directories(/home/ysy/anaconda3/envs/ysy/include/python3.6m)

link_libraries(${BOOST_LIBRARIES} ${PYTHON_LIBRARIES})

add_library(interact SHARED interact.cpp)

set_target_properties(interact PROPERTIES PREFIX "")
target_link_libraries(interact ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})

生成.so文件后在python中调用

参考这个
https://www.cnblogs.com/chenyliang/p/7474335.html
最后要注意一下库名和cpp文件名要一致哦

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: