python c++混合编程-cmake

利用cmake将c++文件编译成.so库文件,通过import调用

    • 简单调用
    • 高级用法-调用c++项目

简单调用

创建trypybind.cpp文件

#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;
using namespace std;
//绑定一个函数
int main()
{ cout<<"hello world!!!"<<endl;return 0;
}
PYBIND11_MODULE(tryPybind, m) {m.def("main", &main);
}

PYBIND11_MODULE(trypybind, m) {
m.def(“main”, &main);
}
trypybind,库名,

import trypybind

“main”, &main意思是将c++ 中的main函数绑定到 python中可以引用的函数main上。

PYBIND11_MODULE( 模块名, 模块实例对象 ){m.doc() = "pybind11 example";   //可选,说明这个模块是做什么的//封装的具体操作。这些操作包括普通的函数的封装,类的访问等下面用不同例子来说明问题m.def( "给python调用方法名"&实际操作的函数, "函数功能说明" ). //其中函数功能说明为可选
}

编译步骤:

  1. 创建CMakeLists.txt
# 版本号无关轻重
cmake_minimum_required(VERSION 3.21)
# 项目名称
project(trypybind)
# 指定python解释器的位置
set(PYTHON EXECUTABLE "/usr/bin/python")
# 添加pybind11到项目
add_subdirectory(extern/pybind11)
Pybind11_add_module(trypybind trypybind.cpp)
  1. clone pybind11库;
mkdir extern
cd extern
git clone https://github.com/pybind/pybind11.git
  1. 编译;
mkdir build && cd build
cmake ..&& make

编译成功生成tryPybind.cpython-38-x86_64-linux-gnu.so文件
4. 引用;
创建try.py文件

import trypybind
trypybind.main()

高级用法-调用c++项目

有项目文件如下:
trypybind.cpp
salt.cpp
salt.h

trypybind.cpp

#include <pybind11/pybind11.h>
#include <iostream>
namespace py = pybind11;
#include <opencv2/opencv.hpp>
#include"salt.h"
using namespace cv;
using namespace std;
//绑定一个函数
int main()
{ Mat image1 = imread("test.jpg");  //读取图像;if (image1.empty()){cout << "读取错误" << endl;return -1;}Salt(image1, 5000); //加入5000个噪声点imwrite("test_salt.jpg", image1); //保存图像return 0;
}
PYBIND11_MODULE(trypybind, m) {m.def("main", &main);
}

salt.h

#include<iostream>
#include<opencv2/opencv.hpp>
#include <random>  //随机数头文件
using namespace cv;
using namespace std;
void Salt(Mat image, int n); //n:加入噪声点数

salt.cpp

#include "salt.h"
void Salt(Mat image, int n)
{//随机数生成器default_random_engine generater;uniform_int_distribution<int>randomRow(0, image.rows - 1);uniform_int_distribution<int>randomCol(0, image.cols - 1);int i, j;for (int k = 0; k < n; k++){i = randomCol(generater);j = randomRow(generater);if (image.channels() == 1){   // cout<<image.at<uchar>(j, i)<<endl;image.at<uchar>(j, i) = 255;}else if (image.channels() == 3){// cout<<static_cast<int>(image.at<Vec3b>(j, i)[0])<<endl;// cout<<static_cast<int>(image.at<Vec3b>(j, i)[1])<<endl;// cout<<static_cast<int>(image.at<Vec3b>(j, i)[2])<<endl;image.at<Vec3b>(j, i)[0] = 255;image.at<Vec3b>(j, i)[1] = 255;image.at<Vec3b>(j, i)[2] = 255;}}
}

CMakeLists.txt

# 版本号无关轻重
cmake_minimum_required(VERSION 3.21)
# 项目名称
project(trypybind)
# 添加opencv依赖
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# 指定python解释器的位置
set(PYTHON EXECUTABLE "/usr/bin/python")
# 添加pybind11到项目
add_subdirectory(extern/pybind11)
SET(SOURCES${CMAKE_CURRENT_SOURCE_DIR}/trypybind.cpp${CMAKE_CURRENT_SOURCE_DIR}/salt.h${CMAKE_CURRENT_SOURCE_DIR}/salt.cpp
)
# pybind11的一个cmake函数 将trypybind.cpp编译成一个C++模块,并绑定python,生成一个python可导入的拓展模块,"trypybind"即为模块名
Pybind11_add_module(trypybind  ${SOURCES})
target_link_libraries(trypybind PRIVATE ${OpenCV_LIBS} )

步骤与简单调用一样

clone pybind11库
mkdir build && cd build
cmake .. && make编译

编译完成生成tryPybind.cpython-38-x86_64-linux-gnu.so文件,即可通过python引用
参考:使用pybind11实现python调用c++实现的opencv代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试 跨域理解

2 实现 2-1 JSONP 实现 2-2 nginx 配置 2-2 vue 开发中 webpack自带跨域 2 -3 下载CORS 插件 或 chrome浏览器配置跨域 2-4 通过iframe 如&#xff1a;aaa.com 中读取bbb.com的localStorage 1)在aaa.com的页面中&#xff0c;在页面中嵌入一个src为bbb.com的iframe&#x…

vscode ctrl+左键不能转到定义修理

找到C_Cpp: Intelli Sense Engine&#xff0c;改成disable&#xff0c;再改成默认就可以了原来是当前的工作目录不包括函数定义的文件&#xff0c;调整一下工作目录即可。或者&#xff0c; "includePath": [ "${workspaceFolder}/**", …

云原生环境中的自动化测试成功案例分析

在云原生环境中,DevOps通过结合云原生技术和持续集成/持续部署(CI/CD)流程,实现了软件的快速交付和质量保证。自动化测试是DevOps实践中的重要组成部分,它能够提高测试的效率和覆盖率,从而加速软件的交付周期并确保软件质量[3][5][13]。 成功案例之一是视野数科利用SAE和…

在全志V853平台上成功部署深度学习步态识别算法

北理工通信课题组辛喆同学在本科毕业设计《基于嵌入式系统的步态识别的研究》中&#xff0c;成功将深度步态识别算法GaitSet移植到全志V853开发板上。本研究在CASIA-B数据集上进行测试&#xff0c;正常行走状态下该系统的步态识别准确率达到了94.9%&#xff0c;背包行走和穿外套…

C++基于多设计模式下的同步异步日志系统day5

C基于多设计模式下的同步&异步日志系统day5 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&am…

scau:程序设计与算法基础 18104 练习使用多case解题

18104 练习使用多case解题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 多CASE的问题在般有3种情形&#xff1a;&#xff08;1&#xff09;有一个数字开始表明CASE数目&#xff1b;&#xff08;2&#xff09;以特殊标…

linux文件结构总结

/&#xff1a;根目录&#xff0c;所有的目录、文件、设备都在/之下&#xff0c;/就是Linux文件系统的组织者&#xff0c;也是最上级的领导者。 /bin&#xff1a;bin 就是二进制&#xff08;binary&#xff09;英文缩写。在一般的系统当中&#xff0c;都可以在这个目录下找到li…

C++:Vector的模拟实现

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一&#xff0c;前言 在学习string类的时候&#xff0c;我们可能会发现遍历的话下标访问特别香&#xff0c;比迭代器用的舒服&#xff0c;但是下标其实只能是支持连续的空间&#xff0c;他的使用是非常具有局限性的&am…

第 125 场 LeetCode 双周赛题解

A 超过阈值的最少操作数 I 排序然后查找第一个大于等于 k 的元素所在的位置 class Solution { public:int minOperations(vector<int> &nums, int k) {sort(nums.begin(), nums.end());return lower_bound(nums.begin(), nums.end(), k) - nums.begin();} };B 超过阈…

C++ 位运算OJ

目录 1、 191. 位1的个数 2、 338. 比特位计数 3、 461. 汉明距离 4、136. 只出现一次的数字 5、 260. 只出现一次的数字 III 6、面试题 01.01. 判定字符是否唯一 7、 268. 丢失的数字 8、 371. 两整数之和 9、 137. 只出现一次的数字 II 10、面试题 17.19. 消失的两个…

【C++】二叉树进阶面试题(上)

目录 1. 二叉树创建字符串 题目 分析 代码 2. 二叉树的分层遍历1 题目 分析 代码 3. 二叉树的分层遍历2 题目 分析 代码 4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 题目 分析 代码 5. 二叉树搜索树转换成排序双向链表 题目 分析 代码 1. …

使用GitHub API 查询开源项目信息

一、GitHub API介绍 GitHub API 是一组 RESTful API 接口&#xff0c;用于与 GitHub 平台进行交互。通过使用 GitHub API&#xff0c;开发人员可以访问和操作 GitHub 平台上的各种资源&#xff0c;如仓库、提交记录、问题等。 GitHub API 提供了多种功能和端点&#xff0c;以…

昇腾芯片解析:华为自主研发的人工智能处理器全面分析

在当今科技发展的浪潮中&#xff0c;昇腾芯片作为一种新兴的处理器&#xff0c;正引起广泛的关注和讨论。升腾芯片究竟是由哪家公司生产的&#xff1f;这个问题一直困扰着许多人。下面小编将全面介绍、分析升腾芯片的生产商及各类参数、应用&#xff0c;以便读者对其有更全面的…

Day26-进程管理核心知识2

Day26-进程管理核心知识2 1. top选项介绍2. 进程的三个杀手。2.1 kill2.2 killall 通过进程名字 kill processes by name2.3 pkill 通过进程名称(完整名称) 3. screen命令4. 什么是进程优先级&#xff1f;5. strace&#xff1a;跟踪进程的系统调用 * 1. top选项介绍 【语法格式…

【C++】函数入参 值传递和引用传递,与C语言的区别

在 C 中&#xff0c;函数的参数传递有值传递和引用传递两种方式。当函数的参数是 vector 类型时&#xff0c;可以选择使用 vector 或 vector& 作为参数类型&#xff0c;两者各有优劣&#xff1a; vector vect1&#xff1a;这种方式使用了值传递&#xff0c;即在函数调用时…

自学高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题解析

今天继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么小…

Dism修复Windows出错(错误代码0x800f081f,找不到源文件)的解决方法

一、环境 系统&#xff1a;Windows 10 二、Dism修复步骤 注&#xff1a;以下操作都需要管理员权限。修复过程需要联网。 2.1 dism扫描全部系统文件 DISM /Online /Cleanup-image /Scanhealth如果结果是“未检测到组件存储损坏 ”&#xff0c;说明完好&#xff0c;可以退出…

Maven终端命令生成Spring-boot项目并输出“helloworld“

1. 生成项目 mvn archetype:generate填写groupId和artifactId&#xff0c;其余默认即可 2. 修改pom.xml文件 将如下内容放入pom.xml文件内 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artif…

Conda笔记--移动Conda环境后pip使用异常的解决

1--概述 由于各种原因&#xff0c;需要将Anaconda转变为Minicoda&#xff0c;为了保留之前安装的所有环境&#xff0c;直接将anaconda3/envs的所有环境拷贝到Miniconda/envs中&#xff0c;但在使用移动后环境时会出现pip的错误&#xff1a;bad interpreter: No such file or di…

计算机网络-物理层-传输媒体

传输媒体的分类 导向型-同轴电缆 导向型-双绞线 导向型-光纤 非导向型