pybind11实现numpy和OpenCV Mat的数据交互

1、编译安装pybind11

下载源代码:https://github.com/pybind/pybind11,

文档:https://pybind11.readthedocs.io/en/stable/compiling.html

解压后进入到命令行,如果有conda环境,就先进入想要的conda环境,再运行下面的指令

mkdir build
cd build
cmake ..
make -j8
sudo make install

2 编译动态链接库

新建CMakeLists.txt,如下,需要安装opencv,安装教程参考Ubuntu 18.04 安装opencv4.2.0,如果遇到IPPICV问题参考解决编译opencv时,卡在IPPICV

cmake_minimum_required(VERSION 3.4...3.18)
project(test LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11)#使用这个命令的前提是pybind11, make install过
find_package(pybind11 REQUIRED)
find_package(OpenCV)#添加头文件,CMAKE_SOURCE_DIR是CMakeLists.txt所在的位置
include_directories(${CMAKE_SOURCE_DIR}/ ${OpenCV_INCLUDE_DIRS})#添加CPP文件, PROJECT_NAME = test
pybind11_add_module(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/test.cpp)#指定动态链接库的位置
# link_directories(/home/hnty/SDK/iRaySDK/dev/bin)#指定编译依赖库,PUBLIC是必须的参数,也可以换成其他关键字
target_link_libraries(${PROJECT_NAME} PUBLIC pthread ${OpenCV_LIBS})#指定安装位置,表示编译的结果安装在 ${CMAKE_INSTALL_PREFIX}/site-packages 目录下,能够直接在python代码中导入
#make install 命令先编译后安装,一步到位
# set(CMAKE_INSTALL_PREFIX /home/hnty/miniconda3/envs/dev/lib/python3.7/)
# install(TARGETS ${PROJECT_NAME} DESTINATION site-packages)

新建test.cpp如下:

#include <opencv2/opencv.hpp>
#include <pybind11/numpy.h>
#include <pybind11/pybind11.h>namespace py = pybind11;
using namespace cv;typedef struct test
{/* data */int ages;std::string name;cv::Mat pic;
} Person;Person handle;//py::array_t<uint8_t> 表示np.ndarray
void setData(int ages, std::string &name, py::array_t<uint8_t>& img)
{handle.ages = ages;handle.name = name;//np.ndarray -> opencv matauto rows = img.shape(0);auto cols = img.shape(1);auto channels = img.shape(2);auto type = CV_8UC3;handle.pic = cv::Mat(rows, cols, type, (unsigned char*)img.data());
}py::dict getData()
{// 在cpp中可以直接使用python内置的数据类型,还是很方便的py::dict pydata;pydata["name"] = handle.name;pydata["ages"] = handle.ages;auto rows = handle.pic.rows;auto cols = handle.pic.cols;auto channels = handle.pic.channels();//opencv mat -> np.ndarray//py::array_t<uint8_t> 表示np.ndarraypy::array_t<uint8_t> output_img(py::buffer_info(handle.pic.data, sizeof(uint8_t), //itemsizepy::format_descriptor<uint8_t>::format(), 3, // ndimstd::vector<size_t> {rows, cols , channels}, // shapestd::vector<size_t> {cols * sizeof(uint8_t)*3, sizeof(uint8_t)*3, sizeof(uint8_t)} // strides));pydata["pic"] = output_img;return pydata;
}PYBIND11_MODULE(test, m) {m.doc() = "pybind11 example plugin"; // optional module docstringm.def("getData", &getData, "A function which adds two numbers");m.def("setData", &setData, "test func");
}

新建test.py:

from build import testimport cv2
import numpy as npimg = cv2.imread("oil-bin-1.png") #换成你自己的图片
ages = 23
name = "kitty"test.setData(ages, name, img)res = test.getData()
print(res['name'], res['ages'])
cv2.imwrite("output.png", res["pic"])

3、测试

将上述3个文件放到同一个目录,然后在命令行中进入到改目录,依次运行。会生成output.png

mkdir build
cd build
cmake ..
make
cd ..
python test.py

文件夹格式如下:

4、总结

使用pybind11相比ctypes方法ctypes实现python和c之间的数据交互-CSDN博客,更加简单、易用。但ctypes的优势在于不用额外配置库,python内置了。

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

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

相关文章

Poi实现根据word模板导出-文本段落篇

最近在做word模板导出的需求&#xff0c;本来意为是很简单&#xff0c;做起来才发现细节上有很多东西处理起来还是比较麻烦的&#xff08;客户要求太多&#xff01;&#xff01;&#xff01;&#xff09; 因此我把涉及到基于word模板导出的这部分整理了一下&#xff0c;大家直…

2024年,前端开发者,不妨看看鸿蒙开发

从大环境也好&#xff0c;行业发展也好&#xff0c;过去10年的前端技术晋级路径已经彻底失效。我在去年看了一眼考公的职位&#xff0c;没有任何一个岗位可以由前端胜任&#xff0c;而如果在后端领域比较资深的话&#xff0c;进可以做技术咨询&#xff0c;退可以考架构公务编。…

【基于 InternLM 和 LangChain 搭建你的知识库】学习笔记

学习参考文档【基于 InternLM 和 LangChain 搭建你的知识库】 学习参考链接【书生・浦语大模型实战营第三课作业(基础进阶)】 理论 实战 收集原始数据 收集2018年-2020年几年间的优秀数学建模论文 修改脚本文件&#xff0c;测试文件 作业 复现课程知识库助手搭建过程 La…

PDF文件的创建时间可以修改吗?分享你一个简单的小技巧

PDF文件的创建时间能修改吗&#xff1f; PDF文件的创建时间是指该文件首次被创建或生成的日期和时间。这个时间被存储在PDF文件的元数据中&#xff0c;可以通过某些软件查看和修改。 在某些情况下&#xff0c;我们需要将PDF文件的创建时间修改为特定的日期和时间。例如&#…

如何使用Java采集汽车之家车辆配置参数信息

目录 一、引言 二、采集工具选择 三、采集流程设计 1、确定采集目标 2、确定采集URL 3、发送HTTP请求 4、解析HTML页面 5、CSS选择器或jQuery选择器。 6、异常处理和日志记录 四、代码实现示例 五、结果与分析 六、结论 随着互联网的普及和信息技术的不断发展&…

人人都在用的PDF软件,也要接入ChatGPT了

随着人工智能技术的不断进步和发展&#xff0c;Chatbot技术的应用已经逐渐从娱乐和社交领域扩展到了更多的实际场景中。在办公软件领域&#xff0c;聊天机器人已经成为了提升工作效率、减少人力投入的重要工具&#xff0c;多家头部企业都在探讨将AI接入到软件及应用中的使用方案…

ctfshow元旦水友赛 misc 以假换真wp

记录一下根据官方wp的复现过程 目录 1.解压2.得到新的压缩包3.明文攻击4.上传baidu.jpg至百度网盘得到flag 1.解压 1&#xff09;下载题目&#xff0c;得到一个名为6.zip的文件 2&#xff09;尝试直接用360解压&#xff0c;发现需要密码 3&#xff09;那就常规思路用010打…

便携式VCI汽车售后诊断仪的优点

汽车诊断工具的优点主要包括以下几个方面&#xff1a; 故障检测智能化:汽车诊断I具通过与车辆的紧密连接,能够实时获取车辆的数据流Q参数和诊断信息,实现故障检测的智能化和精确化。快速诊断:汽车诊断I具能够在短时间内完成对车辆的全面检测,提供准确的故障诊断Q结果,帮助维修…

后端杂七杂八系列篇三

后端杂七杂八系列篇三 ① Spring Event用法① 同步代码的用法① 自定义事件② 定义监听器③ 定义发布者④ 发布消息后&#xff0c;接口收到消息 ② 异步代码的用法① 开启异步② 自定义事件③ 自定义监听器(推荐使用 EventListener 注解)&#xff0c;使用Async注解④ 定义发布者…

存储卷(数据卷)—主要是nfs方式挂载

1、定义 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;一旦容器被删除&#xff0c;数据会丢失。k8s基于控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态会恢复到原始状态。一旦回到原始状态&#xff0c;后天编辑的文件…

写一个判断鼠标进入方向切换图片的效果

直接看代码&#xff1a; <template><div class"mainrouter centerWindi"><div ref"mouse" class"mouse" mouseenter"handleMouse"></div></div> </template> <script setup> import { onMo…

erlang/OTP 平台(学习笔记)(四)

Erlang语言精要 Erlang shell 相较于日常惯用的系统&#xff0c;Erlang系统是一套更富交互性的环境。使用大部分编程语言时&#xff0c;要么把程序编译成OS可执行文件后运行&#xff0c;要么用解释器来执行一堆脚本文件或编译后的字节码文件。无论哪种情况&#xff0c;都是让…

LeetCode:82. 删除排序链表中的重复元素 II(C++、Java)

目录 82. 删除排序链表中的重复元素 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 链表遍历&#xff1a; 实现代码与解析&#xff1a; 82. 删除排序链表中的重复元素 II 题目描述&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复…

美颜技术对比:如何根据项目选择不同的美颜SDK?

各位开发者应该非常清楚&#xff0c;为了在项目中取得最佳效果&#xff0c;选择合适的美颜SDK至关重要。本篇文章&#xff0c;笔者将通过对比不同美颜SDK的关键特性&#xff0c;帮助开发者根据项目需求做出明智的选择。 一、技术原理对比 不同的美颜SDK可能采用不同的技术原理…

汽车线束的汽配企业MES管理系统解决方案

随着科技的飞速发展和环保需求的日益提升&#xff0c;新能源汽车在全球范围内崭露头角&#xff0c;成为未来出行的主导力量。在这股浪潮中&#xff0c;中国凭借其强大的研发实力和市场敏锐度&#xff0c;迅速崛起为新能源汽车领域的佼佼者。而作为汽车数字化控制与智能化应用的…

Unity中URP下的SimpleLit顶点着色器

文章目录 前言顶点着色器1、GPU Instance 相关2、顶点输入数据相关3、雾效混合因子4、对 uv 进行 Tilling 和 Offset 的应用 及 把顶点的坐标信息传给输出结构体5、把法线相关的结果&#xff0c;传给输出结构体6、光照贴图相关7、额外灯相关计算8、阴影相关 前言 在上一篇文章…

elementui-树形控件实现子节点右侧添加图标和数据,鼠标放上去显示文字

1、代码 <el-treev-loading"nameLoding":data"data"node-key"id":highlight-current"true"empty-text"暂无数据":props"defaultPropsIndex"default-expand-all:filter-node-method"filterNodeIndex"…

LeetCode 226. 翻转二叉树

226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,…

redis 从0到1完整学习 (十八):阻塞/非阻塞 IO

文章目录 1. 引言2. redis 源码下载3. I/O 模型3.1 阻塞 I/O3.2 非阻塞 I/O 4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;red…

jetlinks 规则编排中的函数节点使用 js 脚本格式化输出当前系统时间的坑

网上搜到的都是类似如下这种&#xff1a; // 获取当前时间 var date new Date();// 格式化输出当前时间 var year date.getFullYear(); var month date.getMonth(); var day date.getDate(); var hour date.getHours(); var minute date.getMinutes(); var second date.…