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

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

智能推荐

BZOJ1013 [JSOI2008] 球形空间产生器sphere-程序员宅基地

Description  有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。Input  第一行是一个整数n(1<=N=10)。接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点后...

mysql5.7刷脏报错_MySQL 5.7: Page Cleaner的刷脏问题_十吾十吾的博客-程序员宅基地

之前我已经写过一篇博客,讨论过在flush LRU_LIST/FLUSH_LIST时,5.7对其做的优化,总的来说,就是使用类似Hazard Pointer的方式,避免在flush的过程中重复扫描LIST,将时间复杂度从O(N*N)下降到了O(N)。有兴趣的同学可以翻阅下这篇博客: http://mysqllover.com/?p=1031本文的目的主要是补充下5.7目前所做的多个page cle..._mysql5.7 innodb_page_cleaners

10、苹果图标由来(乔布斯和比尔盖斯的故事)+利纳斯+Linux图形界面-程序员宅基地

历史回顾CP/M——》DOS比尔盖茨计算机科学之父—图灵(×××,被监禁,吃了涂了有毒的的苹果自杀):乔布斯用咬了一口的苹果的原因,因为他非常崇拜图灵的,以此纪念图灵。当时乔布斯用的是Unix(苹果系统现在也是Unix,并且是BSD架构的,直接跑在硬件上的系统,所以性能要比安卓的要好)历史介绍比尔盖茨盗用了乔布斯的图形界面,原来比尔盖茨的还是DOS界面,有图形界面了,他就想:谁还用我的DOS呢,..._乔布斯的ios系统的图标由来

python图像几何变换_Python实现图像几何变换-程序员宅基地

Python实现图像几何变换本文实例讲述了Python实现图像几何变换的方法。分享给大家供大家参考。具体实现方法如下:import Imagetry:im=Image.open('test.jpg')#out = im.resize((128, 128)) #改变大小#out = im.rotate(45) #45°旋转#out = im.transpose(Image.FLIP_LEFT_RIG...

imagick php的扩展的安装和使用-程序员宅基地

为什么80%的码农都做不了架构师?>>> ..._epel 安装 imagick

hjr-C++:VS2015+OpenCV3.1+Qt5-程序员宅基地

OpenCV安装程序常用数据结构QtQt+VS环境配置Qt结构OpenCVOpenCV是一个做图像处理的库,可以用C++,Java,Python来写图像处理的程序,比如图像滤波,变换,检测之类的,我们主要用vs2015+OpenCV3.1做图像处理。安装下载安装OpenCV,需要注意的是OpenCV版本要与vs版本对应,判断方法是\openc...

随便推点

chi2test,matlab里的卡方检验_matlab卡方检验函数-程序员宅基地

代码来源是https://ww2.mathworks.cn/matlabcentral/fileexchange,完整代码如下:function [p, Q]= chi2test(x) % Usage: [p, Q]= chi2test(x)% % The chi-squared test. % % Given a number of samples this function tests the hypothesis that the samples are % independent._matlab卡方检验函数

MD5解密工具_md5离线解密工具-程序员宅基地

记录一下md5解密工具:md5解密_md5离线解密工具

Android Studio导入第三方类库的方法-程序员宅基地

本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比Eclipse好用吧,反正以前没有java开发经验,索性就从android studio开始学,以前一直是做.net的开发,最近使用了Eclipse,Android Studio之后发现Visual studio.net正式太好用了..._android studio导入第三方类库

U-SQL 介绍 —— 大数据处理语言-程序员宅基地

微软宣布了新的 Azure 数据湖(Azure Data Lake)服务,该服务被用于云分析,包括了一个超大规模信息库;一个在 YARN 上建立的新的的分析服务,该服务允许数据开发者和数据科学家分析全部的数据;还有 HDInsight,一个全面管理 Hadoop、Spark、Storm 和 HBase 的服务。Azure 数据湖分析包括 U-SQL,这个...

假短信截图在线生成器_工资到账提醒短信原来可以这样玩-程序员宅基地

我们不难发现不少小伙伴都喜欢在朋友圈晒自己生活点滴,当然其中不乏晒自己或他人工资到账短信截图的,毕竟谁不想装逼秀一秀了,那工资到账短信截图可以作假吗?在我们身边肯定有喜欢装逼的朋友,她们会时不时的在朋友圈晒一晒爱车,晒一晒转账单等等。后来经过小编调查了解到,不仅是我这位朋友喜欢装逼,小编我相信生活中还有很多的类似的人,只要有机会就会立刻吹装一波现在网上有很多这种专门生成银行转账的短信截图..._手机短信截图生成器

web前端入门到实战:HTML-video标签_html video 预加载-程序员宅基地

​一、video标签1.作用:播放视频2.格式:<video src="视频地址“>3.可添加的属性:(1)autoplay="autoplay"代表可以在页面中自动播放,不可被用户中断(2)controls="controls”用于显示视频的控制条(3)poster="地址“用于播放视频之前显示什么东西(图片)(4)loop="loop"循环播放该视频(一般广告就是这么..._html video 预加载