返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >python调用c++动态库dll时的参数传递问题怎么解决
  • 427
分享到

python调用c++动态库dll时的参数传递问题怎么解决

2023-06-29 21:06:06 427人浏览 八月长安
摘要

本篇内容介绍了“python调用c++动态库dll时的参数传递问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!stringC++生

本篇内容介绍了“python调用c++动态库dll时的参数传递问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

string

C++生成dll代码:

#include <iOStream>extern "C" __declspec(dllexport) int get_str_length(char *str);int get_str_length(char *in_str){std::string str(in_str);return str.length();}

将VS_create_dll.dll放在与Python相同文件夹下。
python调用代码

import ctypes as Cdll = C.cdll.LoadLibrary('VS_create_dll.dll')#4.1 传入字符串调用demo 方法一p_str = C.c_char_p(b'hello')#或p_str =  b'hello'str_length2 = dll.get_str_length(p_str)print("传入字符串调用demo 方法一:")print (str_length2)#4.1 传入字符串调用demo 方法二get_str_length = dll.get_str_lengthget_str_length.argtypes = [C.c_char_p]get_str_length.restype = C.c_intstr_length3 = get_str_length(p_str)print("传入字符串调用demo 方法二:")print (str_length3)

cv::Mat

python中OpenCV存储一幅图像的数据类型是array,而在C++中opencv存储一幅图像的数据类型是Mat,这两者之间的转换需要通过unsigned char * 来完成。

数据类型对应关系

python: C.POINTER(C.c_ubyte)C++:unsigned char *

python中将array转换成C.POINTER(C.c_ubyte)(对应C++中的unsigned char *)的方法

import ctypes as Cimport cv2img = cv2.imread('ROI0.png')#将img转换成可被传入dll的数据类型img.ctypes.data_as(C.POINTER(C.c_ubyte))

C++中将unsigned char* 转换成Mat的方法

假设传入的变量为unsigned char *src_data

Mat src = Mat(rows,cols,CV_8UC3,src_data);

C++中opencv提供了通过unsigned char*构造Mat类型的api,这个API还需要行数、列数、通道数等信息。
因此python调用dll时,不仅要将src_data传入,还需要将rows,cols等信息传入。

C++中将Mat转换成unsigned char *的方法

src.data

C++中opencv提供了将Mat转换成unsigned char *的API,即Mat.data

C++中将unsigned char*复制的方法

memcp(ret_data,src.data,rows*cols*3);

python中将C.POINTER(C.c_ubyte)(对应C++中的unsigned char *)转换成array的方法

#声明并初始化变量import numpy as npimport cv2ret_img = np.zeros(dtype=np.uint8, shape=(rows, cols, 3))#call dll,ret_img.ctypes.data_as(C.POINTER(C.c_ubyte))作为参数传入cv2.imshow("result",ret_img )

由于在python中ret_img本身就是array类型的,只是在调用dll时将其作为形参转换成了C.POINTER(C.c_ubyte),因此ret_img不需要转换。

C++生成dll代码:

#include "stdafx.h"#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;using namespace std;extern "C" __declspec(dllexport) void draw_circle(int rows, int cols, unsigned char *src_data, unsigned char *ret_data);void draw_circle(int rows, int cols, unsigned char *src_data , unsigned char *ret_data){//将unsigned char转换成MatMat src = Mat(rows, cols, CV_8UC3, src_data);//在图像上画一个蓝色的圆circle(src, Point(60, 60), 10, Scalar(255, 0, 0));//将Mat转换成unsigned charmemcpy(ret_data, src.data, rows*cols * 3);}

python

import ctypes as Cimport cv2import numpy as npdll = C.cdll.LoadLibrary("draw_circle.dll")img = cv2.imread('ROI0.png')(rows, cols) = (img.shape[0], img.shape[1])ret_img = np.zeros(dtype=np.uint8, shape=(rows, cols, 3))dll.draw_circle(rows, cols, img.ctypes.data_as(C.POINTER(C.c_ubyte)), ret_img.ctypes.data_as(C.POINTER(C.c_ubyte)))cv2.imshow("src with circle",ret_img)cv2.waiTKEy(0)

“python调用c++动态库dll时的参数传递问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: python调用c++动态库dll时的参数传递问题怎么解决

本文链接: https://lsjlt.com/news/326410.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python调用c++动态库dll时的参数传递问题怎么解决
    本篇内容介绍了“python调用c++动态库dll时的参数传递问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!stringC++生...
    99+
    2023-06-29
  • 关于python调用c++动态库dll时的参数传递问题
    目录stringcv::Matstring C++生成dll代码: #include <iostream> extern "C" __declspec(dllexport...
    99+
    2024-04-02
  • 关于C# 调用Dll 传递字符串指针参数的问题
    最近用c#写一个小软件,要调用VC写的dll,传递参数给dll,由于是非托管代码,所以调用起来有点麻烦,要把参数转换成非托管代码的指针参数,然后再传递给dllview plainco...
    99+
    2024-04-02
  • 解决Feign调用的GET参数传递的问题
    目录需求思考GET方式请求①GET方式请求②GET方式请求③需求 ​ 在消费方服务通过GET方式,访问服务提供方的接口,需要传递多参数,拆分成多个参数的方式访问,不太适合用在该场景,...
    99+
    2024-04-02
  • bat传递参数调用问题解决记录
    目录bat 传递参数1.问题描述:Syntax 1:Syntax 2:Syntax 3:2.问题描述:解决:bat 传递参数 调用bat时,传递参数有个小问题,记录一下。 1.问题描...
    99+
    2023-05-19
    bat 传递参数 bat 传参调用
  • 如何解决Feign调用的GET参数传递的问题
    这篇文章主要介绍了如何解决Feign调用的GET参数传递的问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何解决Feign调用的GET参数传递的问题文章都会有所收获,下面我们一起来看看吧。需求在消费方服务通...
    99+
    2023-06-29
  • C++ 函数调用反射技术:参数传递和返回值的动态访问
    c++++ 函数调用反射技术允许在运行时动态获取函数的参数和返回值信息。使用 typeid(decltype(...)) 和 decltype(...) 表达式可获取参数和返回值类型信息...
    99+
    2024-05-05
    函数调用 反射技术 c++
  • C#调用Dll传递字符串指针参数的方法是什么
    本篇内容主要讲解“C#调用Dll传递字符串指针参数的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#调用Dll传递字符串指针参数的方法是什么”吧!最近用c#写一个小软件,要调用VC写...
    99+
    2023-06-26
  • mybatisplus中的xml对象参数传递问题怎么解决
    这篇“mybatisplus中的xml对象参数传递问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mybatisp...
    99+
    2023-07-04
  • 怎么解决php传递页面参数乱码问题
    本篇内容主要讲解“怎么解决php传递页面参数乱码问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决php传递页面参数乱码问题”吧!php传递页面参数乱码的解决办法:1、打开相应的PHP代...
    99+
    2023-06-22
  • 如何解决使用@PathVariable传递参数报错404的问题
    这篇文章给大家分享的是有关如何解决使用@PathVariable传递参数报错404的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目录@PathVariable传递参数报错404restFul风格传参, 参数...
    99+
    2023-06-25
  • Vue怎么解决router传递params参数在页面刷新时数据丢失问题
    本文小编为大家详细介绍“Vue怎么解决router传递params参数在页面刷新时数据丢失问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么解决router传递params参数在页面刷新时数据丢...
    99+
    2024-04-02
  • 解决SpringCloud Feign传对象参数调用失败的问题
    SpringCloud Feign传对象参数调用失败 不支持GET请求方式 使用Apache HttpClient替换Feign原生httpclient @...
    99+
    2024-04-02
  • 如何解决使用feign传递参数类型为MultipartFile的问题
    这篇文章主要介绍如何解决使用feign传递参数类型为MultipartFile的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!feign传递参数类型为MultipartFilefeign默认是不支持多媒体文件类型...
    99+
    2023-06-29
  • vue中如何解决使用element组件时事件想要传递其他参数的问题
    小编给大家分享一下vue中如何解决使用element组件时事件想要传递其他参数的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2024-04-02
  • C++中的动态规划子序列问题怎么解决
    今天小编给大家分享一下C++中的动态规划子序列问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、子序列(不连续)...
    99+
    2023-07-05
  • python解决数据库写入时float自动变为整数的问题
    目录数据库写入时float自动变为整数问题问题描述问题解决方案float所表示的范围数据库写入时float自动变为整数问题 问题描述 今天用python插入数据到mysql时遇到个问...
    99+
    2024-04-02
  • 数据库update时出现的问题怎么解决
    这篇文章主要介绍了数据库update时出现的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇数据库update时出现的问题怎么解决文章都会有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • SQL数据库连接超时时间已到的问题怎么解决
    这篇文章主要介绍“SQL数据库连接超时时间已到的问题怎么解决”,在日常操作中,相信很多人在SQL数据库连接超时时间已到的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL数据库连接超时时间已到的...
    99+
    2023-07-06
  • 数据库导入导出时报ORA-01843的问题怎么解决
    这篇文章主要介绍“数据库导入导出时报ORA-01843的问题怎么解决”,在日常操作中,相信很多人在数据库导入导出时报ORA-01843的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库导入导出...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作