python的numpy的数据如何转换为c++的cv::mat

背景介绍

需要将python 处理得到的numpy bgr24数据,通过接口传递给c++,并转换为cv::mat

方法

查了一些资料,
使用ndpointer 的方式测试性能不怎么好,自己摸索下快速传递的方法就是输入地址指针,c 接口定义:

int lib_Mat(int rows, int cols, int type, void* data)
{
	 cv::Mat frame = cv::Mat(rows, cols, CV_8UC3, data);
     return 0;
}

python 的调用方法:

def lib_Mat(rows:int, cols:int, type:int, data):

    libfc.lib_Mat.restype = c_int32
    libfc.lib_Mat.argtypes = (c_int32,c_int32,c_int32,c_void_p)

    return libfc.lib_Mat(rows,cols,type,data)

# frame 为bgr24的numpy 对象
lib_Mat(frame.shape[0],frame.shape[1],1,frame.__array_interface__['data'][0])

注意点

cv::mat 默认的存储格式bgr24,所以需要注意numpy对象的格式也是bgr24,否则需要在转为cv::mat后再进行一次RGB–>BGR的转换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中调用C++函数并传递cv::Mat数据,可以使用OpenCV库将cv::Mat数据转换C++中的Mat类型。下面是一个示例代码,展示了如何在Python中调用一个接受cv::Mat数据C++函数: 假设我们有一个C++函数,它接受一个cv::Mat类型的图像数据: ```c++ #include <iostream> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> void my_function(cv::Mat& image) { cv::imwrite("output.jpg", image); } ``` 现在,我们可以在Python中使用OpenCV库来读取一张图像,并将其转换cv::Mat类型的数据,然后将其传递给这个C++函数。下面是示例代码: ```python import cv2 import numpy as np import ctypes # 加载C++编译后的动态链接库 lib = ctypes.cdll.LoadLibrary('./libexample.so') # 定义函数参数类型 lib.my_function.argtypes = [ctypes.c_void_p] # 读取一张图像,并将其转换cv::Mat类型的数据 image = cv2.imread('input.jpg') image_data = np.ascontiguousarray(image) image_data_ptr = image_data.ctypes.data_as(ctypes.c_void_p) # 将cv::Mat类型的数据传递给C++函数 lib.my_function(image_data_ptr) ``` 在上面的示例代码中,我们首先使用`cdll.LoadLibrary()`函数加载C++编译后的动态链接库。接着,我们使用`argtypes`属性定义了C++函数的参数类型,其中`ctypes.c_void_p`表示无类型指针。然后,我们使用OpenCV库读取一张图像,并使用`np.ascontiguousarray()`函数将图像数据转换为连续的内存块。最后,我们使用`ctypes.c_void_p`类型将图像数据的内存地址传递给C++函数`my_function()`。 需要注意的是,在传递cv::Mat数据时,需要确保图像数据是连续的。如果图像数据不是连续的,需要使用`np.ascontiguousarray()`函数将其转换为连续的内存块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡在床板下_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值