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

这里记录如何将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;

你可能感兴趣的:(python和c++之间的数据传输)