赞
踩
延续上一篇Yolov5 动态链接库DLL导出(tensorrt版本——C++调用)文章内容,这里将yolov5源码封装成动态链接库的方式供其他平台调用,例如可使用labview调用函数,既能实现检测识别功能,又可以利用labview的特性,快速搭建界面,实现图形化编程。这里针对labview对函数重新打包封装,可供labview接口识别调用。
延续上一篇的工程目录,在工程目录下的Detection.cpp文件中添加如下代码,创建YOLOV5*指针供后续封装函数使用:
Connect connect;
YOLOV5* yolo_dll = connect.Create_YOLOV5_Object();
添加如下封装函数:
_declspec(dllexport) int yolov5_initial(const char* engine_path)
{
yolo_dll->Initialize(engine_path, 0);
return 0;
}
形参为yolov5s.engine权重文件的路径
添加如下封装函数:
_declspec(dllexport) int yolov5_Detect(int rows, int cols, unsigned __int8* imageR, unsigned __int8* imageG, unsigned __int8* imageB, const char* classlable[100], cv::Rect* boxes[100]) { cv::Mat img; std::vector<cv::Rect> Boxes; std::vector<const char*> ClassLables; cv::Mat srcImageR(rows, cols, CV_8U, &imageR[0]); cv::Mat srcImageG(rows, cols, CV_8U, &imageG[0]); cv::Mat srcImageB(rows, cols, CV_8U, &imageB[0]); cv::Mat merger_array_src[] = { srcImageB,srcImageG,srcImageR }; merge(merger_array_src, 3, img); yolo_dll->Detecting(img, Boxes, ClassLables); for (size_t i = 0; i < ClassLables.size(); i++) { classlable[i] = ClassLables[i]; } for (size_t i = 0; i < Boxes.size(); i++) { boxes[i] = &Boxes[i]; } return Boxes.size(); }
说明:
1).输入图片格式转换(可参考原博客文档)
int rows, int cols, unsigned __int8* imageR, unsigned __int8* imageG, unsigned __int8* imageB
以上参数为了将labview图片与C++中的cv::Mat 图片格式进行转换,labview中将RGB图像拆分成RGB三个二维数组,和图片的imagesize(rows,cols)一并传入dll函数,opencv再利用内部函数将图片复原
2).识别信息输出
const char* classlable[100], cv::Rect* boxes[100]
利用两个指针数组,将识别结果(识别标签和识别框)输出给labview使用。
3).返回 Boxes.size()的大小,供labview解析指针数据使用
4).提供思路供参考,实际使用根据需求完善封装代码
4.添加好以上代码后重新生成解决方案,以下目录中找到dll备用
关键数据类型配置
注意:和C++中封装函数的接口数据类型必须匹配,否则运行labview软件直接卡死退出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。