ctypes实现numpy和OpenCV Mat之间的数据交互

这篇具有很好参考价值的文章主要介绍了ctypes实现numpy和OpenCV Mat之间的数据交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、目的

将c/c++编译成动态链接库,通过python调用,实现常见变量比如int,字符串之间的交互,以及np.ndarray和cv::Mat间的交互. 更简单的方式参考:pybind11实现numpy和OpenCV Mat的数据交互-CSDN博客

2 步骤

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

cmake_minimum_required(VERSION 3.10)
project(test)
add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})
add_library(myplugins SHARED ${PROJECT_SOURCE_DIR}/test.cpp)
target_link_libraries(myplugins ${OpenCV_LIBS})

新建test.cpp

#include <opencv2/opencv.hpp>
#include <string>
using namespace std;

#if defined(_MSC_VER)
#define API __declspec(dllimport)
#else
#define API
#endif  // API_EXPORTS

typedef struct test
{
    /* data */
    int ages;
    std::string name;
    cv::Mat pic;
} Person;

extern "C" API void * init(int age_,  char * name_ptr, unsigned char *src_data, int rows, int cols)
{
    Person *handle = new Person();
    std::string name_ = name_ptr;
    handle->ages = age_;
    handle->name = name_;
    handle->pic = cv::Mat(rows, cols, CV_8UC3, src_data);
    return (void*) handle;
}

extern "C" API int get_ages(void* handle_)
{
    Person * handle = (Person*)handle_;
    return handle->ages;
}

extern "C" API char* get_name(void* handle_)
{
    Person * handle = (Person*)handle_;
    return (char*)handle->name.c_str();
}

extern "C" API void get_pic(void* handle_, int rows, int cols, unsigned char* out_data)
{
    Person * handle = (Person*)handle_;
    cv::imshow("raw", handle->pic);
    cv::waitKey();
    //数据处理
    //....
    
    //返回结果
    memcpy(out_data, handle->pic.data, rows*cols*3);
}

新建test.py,具体转换见代码注释

from ctypes import *
import cv2
import numpy as np
import numpy.ctypeslib as npct

#加载链接库
lib = CDLL('./build/libmyplugins.so')

#定义函数的输入类型和输出类型
lib.get_ages.restype = c_int
lib.get_ages.argtypes = [c_void_p] #输入句柄(指针)
lib.get_name.restype = c_void_p #返回char*
lib.get_name.argtypes = [c_void_p] #输入句柄(指针)

img = cv2.imread("oil-bin-1.png") #修改成自己的图片
ages = 23
name = bytes("kitty", "utf-8") #要对应c函数中的char*,需要转为二进制

(rows, cols) = (img.shape[0], img.shape[1])
image_type = npct.ndpointer(dtype = np.uint8, ndim = 3, shape = img.shape, flags="C_CONTIGUOUS") #指定numpy图片的格式

lib.init.restype = c_void_p #返回句柄(指针)
lib.init.argtypes = [c_int, c_void_p, image_type, c_int, c_int]

#将np格式的图片传递到c
hd = lib.init(c_int(ages), c_char_p(name), img, c_int(rows), c_int(cols))

print(lib.get_ages(hd)) #返回整数,直接打印
name = c_char_p(lib.get_name(hd)).value #返回char*, 需要转换
print(name.decode('utf-8')) #解码成字符串

##第一种读取图片的方式,使用ndpointer指定图片类型
out_image = np.zeros_like(img).astype(np.uint8) #需要先开辟内存
lib.get_pic.argtypes = [c_void_p, c_int, c_int, image_type]
lib.get_pic(hd, c_int(rows), c_int(cols), out_image)
cv2.imshow("out1", out_image)

##第二种读取图片的方式,不使用ndpointer指定图片类型
out_image = np.zeros_like(img).astype(np.uint8) #需要先开辟内存
lib.get_pic.argtypes = [c_void_p, c_int, c_int, c_void_p] #句柄(指针),rows,cols, 图片指针
lib.get_pic(hd, c_int(rows), c_int(cols), out_image.ctypes.data_as(POINTER(c_ubyte)))

cv2.imshow("out2", out_image)
cv2.waitKey()

3、测试

将上述3个文件放到同一个目录,然后在命令行中进入到该目录,依次运行,会弹出图片,单击图片,按任意键即可文章来源地址https://www.toymoban.com/news/detail-808219.html

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

到了这里,关于ctypes实现numpy和OpenCV Mat之间的数据交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV(三):Mat类数据的读取

    目录 1.Mat类矩阵的常用属性 2.Mat元素的读取 1.at方法读取Mat矩阵元素 at (int row,int col) 2.矩阵元素地址定位方式访问元素 3.Android jni demo 1.Mat类矩阵的常用属性 下面是一些Mat类的常用属性: rows: 返回Mat对象的行数。 cols: 返回Mat对象的列数。 dims: 返回Mat对象的维度数,通常为2(

    2024年02月10日
    浏览(41)
  • python opencv+tkinter 使用tkinter实现交互式图像处理工具

    tkinter 基本控件与使用 我们将学习如何使用Tkinter包编写一些图形用户界面程序。Tkinter是Python的一个标准包,因此我们并不需要安装它。我们将从创建一个窗口开始,然后我们在其之上加入一些小组件,比如按钮,复选框等,并使用它们的一些属性。话不多说,让我们开始吧

    2024年02月10日
    浏览(93)
  • 深度学习中实现PyTorch和NumPy之间的数据转换知多少?

    在深度学习中,PyTorch和NumPy是两个常用的工具,用于处理和转换数据。PyTorch是一个基于Python的科学计算库,用于构建神经网络和深度学习模型。NumPy是一个用于科学计算的Python库,提供了一个强大的多维数组对象和用于处理这些数组的函数。 在深度学习中,通常需要将数据从

    2024年02月05日
    浏览(47)
  • C++如何打印输出OpenCV的Mat对象的像素数据?

    直接上源码: ==默认风格== [111, 111, 166, 192, 251, 255, 255, 255, 255, 255;  111,  83,  93,  83, 102,  85, 255, 251, 255, 255;  111,  83, 111, 102, 111, 140, 255, 255, 255, 255;  111,  83, 111,  83, 111, 140, 255, 255, 255, 255;   83,  83, 111,  83, 111, 175, 255, 255, 255, 255;   83,  74,  93,  83, 111, 175, 255, 251, 255, 255;  

    2023年04月08日
    浏览(47)
  • 【opencv之cv::Mat数据深拷贝和浅拷贝探讨】

    很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用cv::Mat做图片处理的时候发现,这个数据类型存在深拷贝和浅拷贝的情况,遂想一探究竟。 假设这里原图数据为matSrc : copy方法 结果 matA = matSrc 浅拷贝 matB(matSrc ) 浅拷贝 matC = matSrc .cl

    2024年02月13日
    浏览(35)
  • python 数据、曲线平滑处理——基于Numpy.convolve实现滑动平均滤波——详解

    滑动平均滤波法 (又称: 递推平均滤波法 ),它把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。 N值的选取:流量,N=

    2024年02月09日
    浏览(50)
  • 基于python的matplotlib、numpy库实现的图形绘制(数据可视化)

    1.题目要求 编写程序,绘制正弦曲线和余弦曲线。 提示:利用numpy的linspace()、sin()或cos()函数生成样本数据、正弦或余弦值。 2.函数讲解及代码  3.运行图样 4.扩展 1.题目要求 已知实验中学举行了高二期中模拟考试,考试后分别计算了全体男生、女生各科的平均成绩,统计结

    2024年02月08日
    浏览(61)
  • 【设计模式】深入理解中介者模式,解耦对象之间的复杂交互,实现用户之间的消息传递,优化飞机之间的航线协调,构建高效的系统交互方式

    中介者模式是一种行为型设计模式,其核心思想是通过引入一个中介者对象来封装一组对象之间的交互。这种模式可以降低对象之间的耦合度,使得对象之间的交互更加灵活和可维护。 在现实世界中,我们经常会遇到需要协调多个对象之间交互的场景,例如聊天室中的用户之

    2024年01月23日
    浏览(40)
  • Mybatis实现JsonObject对象与JSON之间交互

    项目中使用PostGresql数据库进行数据存储,表中某字段为Json类型,用于存储Json格式数据。PG数据库能够直接存储Json算是一大特色,很多特定情境下使用直接存储Json字段数据能够大量节省开发时间,提高后台数据查询和转换效率。 如果我们有一个JSONObject属性的字段需要与数据

    2024年02月14日
    浏览(52)
  • 【Python】【OpenCV】【NumPy】图像和原始字节的转换

    学习完基础的图像算法,开始接触OpenCV学习: 灰度图中,一个像素点上的灰度级需要一个字节(byte,2^8,8 bit)进行存储,此时的灰度图是二维的。 而当我们需要转换为彩色图时,即三维,便会产生颜色通道(Channel),这个时候,一个像素点上的灰度级便会需要三个字节来

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包