这里主要通过python调用c++深度学习模型,传入图片,c++处理,并返回结果,python接收结果,这个过程的接口如何设计转换。

python端代码接口


# 定义dll返回的结果类型,这里应该和c++中定义的返回结构体一一对应
class Result_process(Structure):_fields_ = [('count', c_int),('ID', c_int),('score',c_float),('x', c_float),('y', c_float),('width',c_float),('height',c_float),]# 这里初始化模型参数,需要向c++的dll传入字符串即模型的路径,字符串必须转换为字节类型的才能传入
class model:def __init__(self, engineFile_path, onnx_path):self.engineFile_path = engineFile_pathself.onnx_path = onnx_pathdef init(self):# 初始化,加载模型,可以不用加bdll= ctypes.cdll.LoadLibrary('.//src//model_c++.dll')  # 字符串需要加b,针对可变字符串必须使用ctypes.create_string_buffer进行转换,否则报错#path = b"D://VScode_prj//tkjc//src//model.onnx"chr1=ctypes.create_string_buffer(self.onnx_path)#chr1=ctypes.create_string_buffer(path)# 把转换后的字符串进行初始化,这里的初始化就是加载模型,传入模型的字符串ret = dll.Init(chr1)if ret == -1:print("-----模型初始化失败--------")return ret# 这里把dll的推理函数拿出self.process = dll.process# 声明输入的数据类型self.process.argtypes=[c_char_p,c_int,c_int,c_int]# 声明返回结果的类型self.process.restype = POINTER(Result_process * 1000)def infer(self, src):if src is None:print("----图片为空----")return -1cols = src.shape[1]rows = src.shape[0]channels = 0if 3==len(src.shape):channels = 3    # 这里是把图片数据转换为dll可识别的类型src = np.asarray(src, dtype=np.uint8) # 这里就获取图片数据的指针src1 = src.ctypes.data_as(c_char_p)# 传入图片数据,因为只有指针不行,因此需要图片的宽高和通道数,dll才能准换为c++可处理的数据,c++拿到图片后处理并返回结果struct_res = self.process(src1, rows, cols, channels)data = dict()#print("------开始获取数据--------")for i in range(struct_res.contents[0].count):ID=struct_res.contents[i].IDscore=struct_res.contents[i].scorex=struct_res.contents[i].xy=struct_res.contents[i].ywidth=struct_res.contents[i].widthheight=struct_res.contents[i].height#print("ID:{}, score:{}, x:{}, y:{}, width:{}, height:{}".format(ID, score, x, y, width, height))data[ID] = [score, x, y, width, height]return data

c++端接口设计

接口设计:

//这里是返回结果定义的结构体,和python端口定义的是一一对应的
typedef struct
{int count = 0; //当前帧的目标个数int ID = 0;//当前目标的IDfloat score = 0;//当前目标的评分//cv::Rect_<float> box_tlbr;//目标的左上角和右下角坐标,这里考虑使用python调用,使用简单数据类型float x = 0.0;float y = 0.0;float width = 0.0;float height = 0.0;
}SingleObjectResult;/
//整体需要转换为c类型,因为python只支持c类型的代码和参数
extern "C" {//c++的版本的深度学习模型应该是一个类,如果不知道深度学习如何使用类操作,建议看看yolov5的c++版本实现//定义一个模型类的变量Model tracks;//这里是初始化接口函数,python调用的初始化函数就是来源这里extern "C" _declspec(dllexport) int Init(char* onnx_path){printf("-----开始初始化-----");string str1;str1 = onnx_path;std::cout << str1.c_str() << endl;return tracks.Init(str1.c_str());}//这里推理函数,python调用的推理函数也是来源这里//传入的是uchar类型的指针,该指针就是指向python传入的图片数据extern "C" _declspec(dllexport) SingleObjectResult* process(uchar * frame_data, int height, int width, int channels){//printf("-----开始检测-----");/*string str2;str2 = video_path;std::cout << str2.c_str() << endl;*/return tracks.processs(frame_data, height, width, channels);}
}

一些关键函数:

//解析从python传送过来图片数据,先把内存的图片数据转换为opencv类型的数据,共后面的处理
//这里处理方法很多,但是建议使用opencv提供的构造函数直接转换,这样效率高
Mat Model::readfrombuffer(uchar* frame_data, int height, int width, int channels)
{//Mat img(height, width, CV_8UC3);Mat img = Mat(height, width, CV_8UC3, frame_data);return img;
}

c++主要函数实现

//初始化类函数,主要初始化模型的加载
int Model::Init(const std::string& onnx_path) {//这里替换你自己的初始化程序即可detconfig.model_file = onnx_path;//truedet = DetectorFactory::create_object(detconfig);if (!det->init()){std::cout << "\n模型初始化失败,请检查传入模型的路径: " << onnx_path << endl;return -1;}config.conf_thres = 0.4f;config.K = 500;config.track_buffer = 30;std::cout << "模型加载成功,初始化完成" << std::endl;return 1;
}//推理函数
SingleObjectResult* Model::processs(uchar* frame_data, int height, int width, int channels)
{//定义一个返回结构体,这里为了避免系统自动释放内存,因此申请内存SingleObjectResult* Result = new SingleObjectResult[1000];Mat frame = readfrombuffer(frame_data, height, width, channels);if (frame.empty()){std::cout << "-----该帧出错,视频有问题-----" << std::endl;return Result;}det->get_detection(frame, vec_db, vec_features);std::vector<std::shared_ptr<STrack>> tracks = jde->update(vec_db, vec_features);//提取跟踪信息int count = tracks.size();int index = 0;for (auto& tr : tracks){//检测框//cv::Rect_<float> loc = tr->to_tlwh_rect();DETECTBOX ret = tr->to_tlwh_box();//检测IDint ID = tr->track_id;//检测得分float score = tr->score;//当前帧号int frame_id = tr->frame_id;Result[index].count = count;Result[index].ID = ID;Result[index].score = score;Result[index].x = ret[0];Result[index].y = ret[1];Result[index].width = ret[2];Result[index].height = ret[3];index += 1;}return Result;
}

python调用c++深度学习模型生成的dll(传入图片,返回多个结果)相关推荐

  1. 怎么装python的keras库_matlab调用keras深度学习模型(环境搭建)

    matlab没有直接调用tensorflow模型的接口,但是有调用keras模型的接口,而keras又是tensorflow的高级封装版本,所以就研究一下这个--可以将model-based方法和le ...

  2. 为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...

    构建一个很棒的机器学习项目是一回事,但归根结底,你希望其他人能够看到你的辛勤工作.当然,你可以将整个项目放在GitHub上,但是怎么让你的祖父母也看到呢?我们想要的是将深度学习模型部署为世界上任何人都 ...

  3. C++调用Python文件,TensorFlow和PyTorch构建的深度学习模型,无法使用GPU的情况分析。

    C++调用Python深度学习模型,包含TensorFlow和PyTorch等构造的模型,然后使用GPU出现问题.包含C++调用Python函数,C++加载模型到GPU,GPU内存占用过大,计算完毕内 ...

  4. 吸烟行为检测系统(Python+YOLOv5深度学习模型+清新界面)

    摘要:吸烟行为检测软件用于日常场景下吸烟行为监测,快速准确识别和定位吸烟位置.记录并显示检测结果,辅助公共场所吸烟安全报警等.本文详细介绍吸烟行为检测系统,在介绍算法原理的同时,给出Python的实现 ...

  5. 血细胞智能检测与计数软件(Python+YOLOv5深度学习模型+清新界面版)

    摘要:血细胞智能检测与计数软件应用深度学习技术智能检测血细胞图像中红细胞.镰状细胞等不同形态细胞并可视化计数,以辅助医学细胞检测.本文详细介绍血细胞智能检测与计数软件,在介绍算法原理的同时,给出Pyt ...

  6. 智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)

    摘要:智能零售柜商品检测软件用于识别零售柜常见商品,检测商品名和位置以了解销售情况,为零售柜商品智能检测和自动销售提供检测功能.本文详细智能零售柜商品检测软件,在介绍算法原理的同时,给出Python的 ...

  7. 智能火焰与烟雾检测系统(Python+YOLOv5深度学习模型+清新界面)

    摘要:智能火焰与烟雾检测系统用于智能日常火灾检测报警,利用摄像头画面实时识别火焰与烟雾,另外支持图片.视频火焰检测并进行结果可视化.本文详细介绍基于智能火焰与烟雾检测系统,在介绍算法原理的同时,给出P ...

  8. 交通信号标志识别软件(Python+YOLOv5深度学习模型+清新界面)

    摘要:交通信号标志识别软件用于交通信号标志的检测和识别,利用机器视觉和深度学习智能识别交通标志并可视化记录,以辅助无人驾驶等.本文详细介绍交通信号标志识别软件,在介绍算法原理的同时,给出Python的 ...

  9. 人脸活体检测系统(Python+YOLOv5深度学习模型+清新界面)

    摘要:人脸活体检测系统利用视觉方法检测人脸活体对象,区分常见虚假人脸,以便后续人脸识别,提供系统界面记录活体与虚假人脸检测结果.本文详细介绍基于YOLOv5深度学习技术的人脸活体检测系统,在介绍算法原 ...

最新文章

  1. 十亿红包还不够,揭秘快手春节四大技术玩法:AI/AR/MR都被装进App,为了这个春晚真拼了...
  2. 动态规划--最长公共子序列
  3. mysql全表扫描和用索引的区别
  4. 附加到IIS进程调试页面
  5. Linux下部署MyEclipse开发环境
  6. new失败跟踪函数_关于针对class自定义new操作符失败的函数处理
  7. Ext动态加载Toolbar
  8. pycharm安装javascript插件_IDEA必备插件系列-Rainbow
  9. 公共代码参考(DisplayMetrics)
  10. MySQL数据库 资源
  11. SQL如何合并两列数据
  12. js工厂模式和单例模式
  13. 尚硅谷Maven2022----②单一架构案例
  14. 移动端百度强引蜘蛛SEO工具
  15. 支付宝提现要手续费吗?
  16. html+表格+左侧表头,HTML thead表格表头 标签
  17. MySQL 数据类型
  18. Quartz执行逻辑(三)QRTZ_FIRED_TRIGGERS表的作用
  19. android8 小米5s,终于来了!小米5s、小米5s Plus将提前升级Android 8.0!
  20. 西安计算机三本院校排名2015,2015年陕西三本院校排名

热门文章

  1. python sybase安装
  2. Matplotlib库-Python数据可视化
  3. Python数据分析(二):DataFrame基本操作
  4. 用python输出200以内的素数_Python练习题 008:打印101-200之间的所有素数
  5. html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形
  6. HTML语言中 blur()方法,jQuery的blur()方法怎么用?
  7. java编写万年历_怎么用JAVA编写万年历!
  8. mac apache php.ini,Mac自带的Apache使用详解
  9. 卸载MySql详细步骤
  10. tensorflow版本1.11.0