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

智能推荐

js如何判断数据类型null_js判断null类型-程序员宅基地

文章浏览阅读2.8k次。null类型是一个只有一个值得数据类型,这个值为nullnull表示一个空对象指针所以我们在用typeof来检测null的数据类型时返回值为Objectvar a = null;console.log(typeof a); //Object如果在定义一个 变量时,是用于将来保存对象的,那么我们最好将这个变量的值赋值为null.那么问题来了,js如何准确判断数据类型null呢?o..._js判断null类型

AVFoundation(四)滤镜视频录制流程_avfoundation拍摄视频-程序员宅基地

文章浏览阅读530次。https://www.jianshu.com/p/4701d006b514核心思路1. GPUImageVideoCamera 采集视频: CMSampleBufferRef 采集音频:CMSampleBufferRef2. 渲染滤镜:filter3. 输出: 显示 GPUI..._avfoundation拍摄视频

线性代数笔记12:二次型与函数极值_二次型极大值点-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏27次。这一节我们将看见,如何将数值函数用矩阵表示,并使用正定矩阵来指示函数的极值。二次型定义:对nnn维实向量xxx及nnn阶实对称矩阵AAA,称以下数值函数为一个实二次型(quadratic form),为一个二次齐次多项式。f(x)=xTAx=∑i=1n∑j=1naijxixjf(x)=xTAx=∑i=1n∑j=1naijxixjf(x) = x^TAx = \sum\limi..._二次型极大值点

OpenWrt软路由安装可道云_openwrt 可道云-程序员宅基地

文章浏览阅读2.3w次,点赞2次,收藏15次。昨天买了个新3刷了OPenWrt固件,使用了一周体验了下真香。什么是软路由?答:传统路由器只能进行简单的上网设置内存小不支持定制,但是软路由有大内存可以在里面安装各种各样的软件来进行自定义操作,不仅仅可以拥有传统路由器的上网功能也可以拥有,类似于在路由器里面装一个虚拟机比如Centos或者安装一个NAS以及各种黑科技的操作,所以我为啥不花一个传统路由器的钱来购买一个很舒服的软路由呢?因..._openwrt 可道云

Wireshark嗅探和协议分析_wireshark嗅探分析-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏35次。一、实验目的1、初步掌握Wireshark的使用方法,熟悉其基本设置,尤其是Capture Filter和Display Filter 的使用。2、通过对Wireshark抓包实例进行分析,实现捕捉DHCP、ARP、FTP、HTTP等协议的数据包;理解TCP/IP协议中多种协议的数据结构、会话连接建立和终止的过程;了解FTP、HTTP等协议明文传输特性,增强安全意识。二、实验原理2..._wireshark嗅探分析

Testin云测试平台_pad云测试平台-程序员宅基地

文章浏览阅读7.6k次,点赞3次,收藏23次。测试平台Testin云测试平台是一个基于真实终端设备环境,基于自动化测试技术的7x24云端服务.Testin在云端部署了千余款测试终端,并开放这些智能终端给全球移动开发者进行测试,开发者只需在Testin平台提交自己的App应用,选择需要测试的网络、机型,便可进行在线的自动化测试,无须人工干预,自动输出含错误、报警等测试日志、UI截图、内存/CPU/启动时间等在内的标准测试报告。三大特性1..._pad云测试平台

随便推点

霸屏浏览器-程序员宅基地

文章浏览阅读1.3k次。源代码在后文,大家一起学习。霸屏浏览器的作用,就是让客户机仅提供Web访问功能,屏蔽其它所有功能,即不允许客户机退出浏览器界面,或者是使用客户机的其它功能,也不允许关机、重启命令。常常用于触摸屏浏览器、自助机浏览器。注意:部分操作系统因为优化和修改,导致该软件需要用管理员权限运行:安装后右击桌面的图标-&gt;点属性-&gt;点兼容性-&gt;勾选以管理员身份运行此程序。软件信息软件授权:免费软件软件类....................._霸屏浏览器

java类型转换工具类Convert_convertbytebuffer-程序员宅基地

文章浏览阅读8.8k次。import java.math.BigDecimal;import java.math.BigInteger;import java.nio.ByteBuffer;import java.nio.charset.Charset;import java.text.NumberFormat;import java.util.Set;import com.ruoyi.common.util..._convertbytebuffer

javascript通用工具_javascript 通用 工具-程序员宅基地

文章浏览阅读361次。$(function() { /** * 自动生成分页 * * @data 为分页实体 * @suffix 分页标签后缀 * @pageTargetId 分页打印的目标ID * @statisticsTargetId 统计数据的目标ID * */ function printPage(data, suffix, pageTargetId, statisti_javascript 通用 工具

6D位姿估计的理解及BOP数据集参数说明_位姿估计数据集-程序员宅基地

文章浏览阅读6.1k次,点赞5次,收藏49次。6D姿态估计的理解及BOP数据集参数说明一、6D姿态姿态估计在百度上搜会出现“姿态估计问题就是确定某一三维目标物体的方位指向问题”的解释,但是具体来讲确定某一三维目标物体的方位指向问题到底是什么意思呢?首先,6D表示6个自由度,3个自由度的位移(Translation)和3个自由度的空间旋转(Rotation)..._位姿估计数据集

项目成功经验分享:敏捷与看板的完美结合_销售管理如何应用敏捷看板-程序员宅基地

文章浏览阅读356次。看板(Kanban)最初是由日本丰田公司(Toyota)研发的,它在日语里意思是“信号卡片”。这种方法依赖于看板卡片,表明重新订购某些物资的需求。看板被视为精益生产系统,因其避免了时间和资源浪费。简而言之,看板让企业“至精至简”。许多项目经理将看板的概念连同敏捷方法一块使用。看板的妙处在于“按需”生产,客户通过生产设备订购“拉动式”产品。这一理念取代了传统的方法——根据预计需求生产大量产品并将产品储存起来。在软件开发的背景下,这种客户需求驱动系统的理念与敏捷非常契合。敏捷项目管理把原先.._销售管理如何应用敏捷看板

mac启动本地redis_Mac安装Redis-程序员宅基地

文章浏览阅读1k次。安装Homebrew如果已经安装可以忽略,没有安装的请查看小明之前写好的文章 mac安装homebrew使用Homebrew安装Redis (1) 安装命令 brew install redis (2) 查看软件安装及配置文件位置 Homebrew安装的软件会默认在/usr/local/Cellar/路径下;redis的配置文件redis.conf存放在/usr/local/etc路径下。 (3)..._mac 本地启动redis