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文件名要一致哦
相关文章推荐
- 【转】利用Boost.Python将C++代码封装为Python模块
- 利用Boost.Python将C++代码封装为Python模块
- 利用Boost.Python将C++代码封装为Python模块
- Boost-python封装Cpp代码供Python调用
- 如何在C++代码中调用python代码(MinGW+Boost.Python)
- 查看python调用c++代码的代码实现位于那个cpp文件
- 如何在C++代码中调用python代码(MinGW+Boost.Python)
- android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)
- android jni方式调用c++代码并在其它app中使用生成的.so文件
- Linux下利用SWIG完成Python对使用OpenCV的C++文件的调用
- C/C++ 生成的.so文件,python 用ctypes调用
- Python调用采用Boost Python封装的c++(2)
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- 通过SWIG封装C/C++代码被Python调用
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- 用boost封装C++的库供Python调用
- linux 下python 调用C++ .so如何debug c++代码
- 解决python模块调用时代码中使用相对路径访问的文件,提示文件不存在的问题
- linux 下python 调用C++ .so如何debug c++代码
- Python调用采用Boost Python封装的c++