Boost.Python3将C++代码封装为Python模块,并在Python中调用封装的动态库so文件cmake, boost, opencv3,numpy_将c++的代码封装为python库-程序员宅基地

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文件名要一致哦

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bengqian1670/article/details/89433094

智能推荐

基于javaweb+mysql的jsp+servlet电影票售票管理系统(java+jsp+servlet+javabean+mysql)_【java+jsp+mysql】订票系统-程序员宅基地

文章浏览阅读192次。基于javaweb+mysql的jsp+servlet电影票售票管理系统(java+jsp+servlet+javabean+mysql)运行环境Java≥8、MySQL≥5.7、Tomcat≥8开发工具eclipse/idea/myeclipse/sts等均可配置运行适用课程设计,大作业,毕业设计,项目练习,学习演示等功能说明后台:管理用户、影片、排片、影厅、订单、影评等前台:注册登录、查看排片、详情,选座、购票等后台前台技术框架JSP Servlet MySQL C3P0 DBUtil Tomcat J_【java+jsp+mysql】订票系统

【Flutter】AutomaticKeepAliveClientMixin解决Tab切换页面频繁build问题_flutter如何防止子view重新build-程序员宅基地

文章浏览阅读563次,点赞6次,收藏10次。Flutter中的PageView和TabBarView默认每次切换页面时都会重新构建(build)页面,这样虽然渲染了最新的UI,但是这种行为可能会导致性能问题,特别是页面中有复杂的布局和数据加载时。解决这个问题,可以用AutomaticKeepAliveClientMixin接口和它的wantKeepAlive方法。保持页面状态,避免每次切换都重新构建。_flutter如何防止子view重新build

输入一个正整数再输入n个整数逆序存放并输出_c语言多组测试,每组先输入一个不大于10的整数n 然后是n个整数,输出这n个整数中最-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏14次。【问题描述】输入一个正整数n(1<n<10),再输入n个整数,存入数组中,再将数组中的数,逆序存放并输出【输入形式】先输入一个整数n,再输入n个整数,用空格间隔【输出形式】输出n个整数,用空格间隔【样例输入】 51 2 3 4 5#include<stdio.h>int main(){ int n,a[10],z,i,j; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&..._c语言多组测试,每组先输入一个不大于10的整数n 然后是n个整数,输出这n个整数中最

Android RIL源码梳理(1) ——rild启动流程 ._android rild启动-程序员宅基地

文章浏览阅读1.6k次。一、RIL的基本架构Android RIL (Radio Interface Layer)提供了Telephony服务和Radio硬件之间的抽象层。RIL负责数据的可靠传输、AT命令的发送以及response的解析。一般的,应用处理器(AP)通过AT命令集与无线通讯模块(基带/BP)通信。通信的方式又分为主动请求的request(诸如拨号、发短信……),以及Modem主动上报的例如信号_android rild启动

uni-app-程序员宅基地

文章浏览阅读560次,点赞22次,收藏21次。uni-app 是一个基于 Vue.js 的跨平台应用开发框架。它允许开发者使用 Vue.js 的语法编写一次代码,然后将该代码发布到多个平台,包括但不限于微信小程序、H5、App 等。uni-app 提供了一套完整的开发工具链和组件库,使开发者能够快速构建跨平台的应用,并具备良好的性能和用户体验。视图容器首先,在components目录下创建一个新的.vue文件,作为自定义组件的文件。例如,可以创建一个名为的文件。在组件文件中,编写组件的模板部分,定义组件的结构和内容。

如何生成 .plist文件,plist文件制作教程_plist生成-程序员宅基地

文章浏览阅读8.1k次,点赞4次,收藏7次。如何生成 .plist文件,plist文件制作教程如何生成 plist文件plist文件制作教程准备好已经切分好的序列图打开软件按图提示操作选择位置保存生成的两个文件 plist png example前期准备软件:TexturePacker要制作的序列图1.准备好已经切分好的序列图2.打开软件3.按图提示操作选择位置保存生成的两个文件 *.plist *.png examp_plist生成

随便推点

pandas创建DataFrame的几种方式(建议收藏)_pandas新建一个dataframe-程序员宅基地

文章浏览阅读3.9w次,点赞25次,收藏148次。pandas创建DataFrame的几种方式如果你是一个pandas初学者,那么不知道你会不会像我一样。在学用列表或者数组创建DataFrame时理不清怎样用数据生成以及想要形状的的Dataframe,那么,现在,你不用自己琢磨了,我这里给你整理了一下,现在我们就来看看这三种生成Dataframe的方式。1.用传入列表或者数组创建DataFrame采用列表创建DataFramenums = [[i for i in range(3)] for _ in range(10)]numscol_pandas新建一个dataframe

HTML如何编写类似QQ聊天框,jQuery实现简易QQ聊天框-程序员宅基地

文章浏览阅读831次。本文实例为大家分享了jQuery实现简易QQ聊天框的具体代码,供大家参考,具体内容如下例子1*{list-style: none;margin: 0;padding: 0;}.box1{width: 500px;height: 480px;border: 1px solid #aaa;margin: 0 auto;margin-top: 20px;}.box{width: 500px;height..._pc端类似于qq的html聊天界面

知识图谱从入门到应用——知识图谱的知识表示:符号表示方法_知识图谱符号表示-程序员宅基地

文章浏览阅读1.2w次,点赞9次,收藏13次。在前面的文章中已经多次提到,知识图谱采用图的方式描述和表达知识,相比于简单图,能建模更加复杂的事物关系,但比起形式化逻辑,又免于复杂的逻辑约束,使得知识的获取过程变得更加容易。但在知识图谱的实际实践中,不同的应用场景会对知识的建模采用不同表达能力的图表示方法。例如有些应用场景仅采用最简单的无向图,通常适合于对建模要求不高,偏于数据挖掘类的应用场景。知识图谱表示应用最多的是有向标记图(Directed Labelled Graph)。_知识图谱符号表示

Android Studio APK在真机上运行的方法(1)-程序员宅基地

文章浏览阅读710次,点赞8次,收藏17次。这时候软件可能就会识别手机。如果以上方法不可行,又不想花太多时间去找问题,就可以采用安装安装包的方式。我们可以在每一个对应项目对应目录下面的app\build\outputs\apk\debug查找到软件自动生成的安装包。如果是新版的AS的话可能只会看到一个app-debug.apk,并没有什么网上说的app-debug-unaligned.apk什么的两个.apk结尾的文件,这都不要紧,可以把这个拿到手机上直接安装。

Unity 划线 - 使用Image实现划线_unity quest3 在image上画线-程序员宅基地

文章浏览阅读1w次,点赞11次,收藏38次。unity使用Image实现划线功能_unity quest3 在image上画线

获取表单内部元素的N种方法_提取所有表单元素的方法-程序员宅基地

文章浏览阅读3.1k次。今天讲讲获取表单元素的N种方法~以上是部分资料参考的地方:http://blog.csdn.net/h12kjgj/article/details/61624509先给出一个实例。输入数字1~10,弹出输入的数字,并计算该数字的阶乘;如果输入的数字不在该范围内,则输出“balabala自己编的一些话”源代码: function Count(){var i,r,_提取所有表单元素的方法

推荐文章

热门文章

相关标签