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