python和c++之间的数据传输

本文介绍了一种使用Python和C++进行图像数据和数组数据交换的方法,重点在于如何将Python中的图像和数组数据转换为字符串指针,传递到C++进行处理,并通过结构体指针返回处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里记录如何将python中的图片和数组以字符串指针的形式传递到C++,C++如何获取这部分的数据,并在处理之后饭后两个值到python使用。
Python中的函数:

#将进行目标检测后的图片和目标距行框传入c++进行双目测距,C++通过结构体指针返回两个数(最小距离和最小距离对应的矩行框的位置索引)给python进行处理
def img_and_boxs_to_cpp(img_1,img_2,boxs):
    h, w = img_1.shape[0], img_1.shape[1]
    len_box = len(boxs)
    # 获取imageD_flip对象的数据指针
    img_1_data = np.asarray(img_1, dtype=np.float32)
    img_1_data = img_1_data.ctypes.data_as(ctypes.c_char_p)
    # 获取imageL_flip对象的数据指针
    img_2_data = np.asarray(img_2, dtype=np.uint8)
    img_2_data = img_2_data.ctypes.data_as(ctypes.c_char_p)
    #获取boxs对象指针
    boxs_data = np.asarray(boxs,dtype=np.float32)
    boxs_data = boxs_data.ctypes.data_as(ctypes.c_char_p)
    # 设置输出数据类型,与c++中返回值定义的类型一致
    dll.measureDistance.restype = ctypes.POINTER(StructPointer)
    # 调用dll里的方法(这里默认img_1和img_1的h、w一样),GetFromCpp()是C++用来接收并处理数据的函数,因为要返回两值,只能通过结构体指针来返回
    p = dll.GetFromCpp(h, w, img_1_data,img_2_data,len_box,boxs_data)
    #返回值1
    result_1 = p.contents.result_1
    #最小距离对应的矩行框位置索引
    result_2 = p.contents.result_2
    #条用dll中的方法来释放指针
    dll.release(p)
    return result_1,result_2

因为要接收两个返回值,而C++函数一般只能返回一个返回值,所以这里通过结构体指针来返回两个值,C++中要声明结构体,Python中也需要。

#声明结构体指针类,用于获取C++返回的多个数据
class StructPointer(Structure):
    _fields_ = [("result_1",c_double),("result_2",c_int)]

C++中的函数:

extern "C" StructPointer GetFromCpp(int height, int width, uchar* DM_imgDData, uchar* DM_imgLData,int len, uchar* boxs_data)       
	Mat boxs(len, 4, CV_32FC1, boxs_data);
	Mat DM_imgD(height, width, CV_32FC1, DM_imgDData);       //DM_imgDData传过来的图片数据是浮点型
	Mat DM_imgL(height, width, CV_8UC3, DM_imgLData);
                                      .
                                      .
                                      .
                                      .
	StructPointer p = (StructPointer)malloc(sizeof(StructPointerTest));
	p->result_1 = result_1;
	p->result_2 = result_2;
	return p;

}

extern “C” 声明的是Python可调用的so接口,关于python在windows和ubuntu下调用C++程序将另外记录。
同样,C++中要声明结构体,与Python对应

typedef struct StructPointerTest
{

	double result_1;
	int result_2;
}StructPointerTest,*StructPointer;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值