记录一下项目中遇到的bug
首先是char*作为函数参数时,它是不会被直接赋值的,需要在函数内构建一个char*,在用memcpy函数拷贝给输入的char*。
VS导出DLL,在h文件里加上这样子的头定义
#ifndef PDDETECT
#define PDDETECT
//宏定义导出
#ifdef PDDETECTDLL__
#define PDDETECTDLL __declspec(dllexport)//导出
#else
#define PDDETECTDLL __declspec(dllimport)//导入
#endif
然后对需要导出的函数加上extern "C" PDDETECTDLL即可,注意extern "C"必须要加,不然动态调用的时候会找不到该函数,另一个做法是用def文件导出函数,作用和extern "C"一样。
在调用的时候,动态调用不需要h和lib文件,直接在调用的CPP里加上函数定义。
typedef bool(*DpDetect)(MV3D_LP_DEPTH_DATA* , char* , int& , bool& );
然后再调用的函数里
HINSTANCE pdDll = LoadLibrary(L"pdDetect.dll");
HINSTANCE pdDll = LoadLibrary(L"pdDetect.dll");
if (pdDll==NULL) {
cout << "调用失败" << endl;
}
DpDetect detect_dp = (DpDetect)GetProcAddress(pdDll, "detect_dp");
CsDetect detect_cs = (CsDetect)GetProcAddress(pdDll, "detect_cs");
ClDetect detect_cl = (ClDetect)GetProcAddress(pdDll, "detect_cl");
if (detect_dp == NULL || detect_cs == NULL || detect_cl==NULL)
{
cout << "cant get func" << endl;
}
只要函数提取成功,就可以直接用DLL里的这个函数了。
静态调用就和正常调用其他库类似,加上h和lib,然后include h文件,直接调用函数即可。
说起来,DLL这件事去年就干过,但是忘记得差不多了,还是要多记录才行。
这里额外提一句,对于深度学习模型打包成DLL后,如果调用了GPU一定要及时释放内存,不然就会报错,
DetectorItem->init_model(model_param, model_bin);
objects = DetectorItem->detect_model(matImg);
DetectorItem->~Detector();
还有图像cv::Mat和char*之间的相互转换
//char* to cv::Mat
cv::Mat matImg = cv::Mat(nInHight, nInWide, CV_8UC3, pInClData);
//cv::Mat to char*
//方法一
unsigned char* ucImg = img.data;
char* uImg = (char*)ucImg;
//方法二,推荐用方法2,nOutSize就是图像的尺寸,如果是灰度图就是H*W,RGB图就是H*W*3
memcpy(pOutClData, (char*)matImg.data, nOutSize);