0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DLL文件的创建和测试程序

OpenCV学堂 来源:OpenCV学堂 2023-08-03 11:17 次阅读

前言

创建DLL有几种不同的方式,最简单直接的的方式就是通过VS自带的动态链接库(DLL)项目,把相关的功能封装成一个类,然后导出几个接口方法,编译成功以后生成DLL文件,就可以在其他地方跟正常的第三方库配置之后一样调用了。

01创建DLL

首先打开VS创建一个DLL空项目,打开VS的桌面向导如下:

d8ae4768-3111-11ee-9e74-dac502259ad0.png

创建DLL链接库项目

d8e07594-3111-11ee-9e74-dac502259ad0.png

然后在头文件中添加mytest.h文件,添加代码如下:

#pragmaonce

#ifdef_DLL_EXPORTS
#defineDLL_API_declspec(dllexport)
#else
#defineDLL_API_declspec(dllimport)
#endif

#include

//=========导出函数C++调用接口============
classDLL_APIMyTestDLL{
public:
intaddData(inta,intb);
~MyTestDLL();
};
然后在源文件中添加mytest.cpp文件,添加代码如下:
#define_DLL_EXPORTS
#include

MyTestDLL::~MyTestDLL(){
std::cout<< "destory instance done!" << std::endl;
}

int MyTestDLL::addData(int a, int b) {
    int sum = 0;
    sum = a + b;
    std::cout << "sum: " << sum << std::endl;
    return sum;
}
编译运行成功,显示如下:

d8fc02fa-3111-11ee-9e74-dac502259ad0.png

02DLL测试程序

创建测试程序,来测试DLL。新建一个控制台空项目,在源文件中添加main.cpp文件,然后添加如下代码:

#include"opencv2/opencv.hpp"
#include"mytest.h"

intmain(intargc,char**argv){
std::cout<< "test mydll..." << std::endl;
    std::shared_ptrmydll(newMyTestDLL());
intsum=mydll->addData(3,5);
std::cout<< "DLL invoke result : " << sum << std::endl;
    return 0;
}
运行结果如下:

d9291146-3111-11ee-9e74-dac502259ad0.png

d964e144-3111-11ee-9e74-dac502259ad0.png

YOLOv8对象检测DLL测试

采用相同的方法,基于ONNXRUNTIME深度学习模型库框架, 我对以前ONNXRUNTIME + YOLOv8对象检测C++代码稍作修改,封装了一个YOLOv8对象检测推理类为DLL,支持C++与C#接口调用。客户端调用代码如下:

#include"yolov8_infer.h"
#include
#include

std::stringlabel_map="D:/python/yolov5-7.0/classes.txt";
intmain(intargc,char**argv){
std::stringnames="10:bike";
intpos=names.find_first_of(":");
std::cout<< names.substr(0, pos) << " -->>"<< names.substr(pos + 1) << std::endl;
    std::vectorclassNames;
std::ifstreamfp(label_map);
std::stringname;
while(!fp.eof()){
getline(fp,name);
if(name.length()){
classNames.push_back(name);
}
}
fp.close();
//std::shared_ptrdetector(newYOLOv5ORTDetector());
std::shared_ptrdetector(newYOLOv8ORTDetector());
detector->initConfig("D:/python/my_yolov8_train_demo/yolov8n.onnx",640,640,0.25f,0.5);
cv::VideoCapturecapture("D:/images/video/sample.mp4");
cv::Matframe;
std::vectorresults;
while(true){
boolret=capture.read(frame);
if(frame.empty()){
break;
}
int64start=cv::getTickCount();
detector->detect(frame,results);
floatfps=static_cast(cv::getTickFrequency())/(cv::getTickCount()-start);
cv::putText(frame,cv::format("FPS:%.2f",fps),cv::Point(50,50),cv::FONT_HERSHEY_SIMPLEX,1.0,cv::Scalar(255,0,255),2,8);
for(DetectResultdr:results){
cv::Rectbox=dr.box;
cv::putText(frame,classNames[dr.classId],cv::Point(box.tl().x,box.tl().y-10),cv::FONT_HERSHEY_SIMPLEX,.5,cv::Scalar(0,0,0));
}
cv::imshow("YOLOv8+ONNXRUNTIME-DLL导出演示",frame);
charc=cv::waitKey(1);
if(c==27){//ESC退出
break;
}
//resetfornextframe
results.clear();
}

return0;
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • dll
    dll
    +关注

    关注

    0

    文章

    115

    浏览量

    45430
  • 接口
    +关注

    关注

    33

    文章

    8610

    浏览量

    151212
  • 封装
    +关注

    关注

    126

    文章

    7912

    浏览量

    142986
  • C++
    C++
    +关注

    关注

    22

    文章

    2109

    浏览量

    73663
  • 动态链接库
    +关注

    关注

    0

    文章

    11

    浏览量

    7066

原文标题:手把手教你 封装DLL类 给客户端调用

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LABVIEW 创建DLL 文件 字符串连接

    `想利用labview 创建dll 文件程序很简单,就是把两个字符串连接起来。DLL 文件
    发表于 05-23 12:27

    LabVIEW中DLL文件创建过程和编程结果

    ,并给出了编程结果。本文提供的程序创建方法可推广应用于其他DLL文件的开发。关键词:动态链接库; LabVIEW; 自动测量; 仪器控制 Building and Applicatio
    发表于 05-15 07:24

    怎么为dll创建文件

    >或者,我可以导入没有标题的DLL吗?除非它是VEE识别的组件库。>是否有可能为奇怪的DLL创建一个>头文件,我不知道?你可以用dumpbin或depends来轻松获得函数名。参数列表
    发表于 10-21 15:48

    comres.dll下载 (comres.dll文件病毒)

    描述:comres.dll是系统的动态链接库文件。   文件路径: C:WINDOWSsystem32comres.dll   备份文件路径
    发表于 11-28 14:12 113次下载
    comres.<b class='flag-5'>dll</b>下载 (comres.<b class='flag-5'>dll</b><b class='flag-5'>文件</b>病毒)

    usp10.dll下载 (usp10.dll文件)

      usp10.dll是什么?usp10.dll是字符显示脚本应用程序接口相关文件。如果出现"没有找到usp10.dll"
    发表于 11-28 15:04 238次下载
    usp10.<b class='flag-5'>dll</b>下载 (usp10.<b class='flag-5'>dll</b><b class='flag-5'>文件</b>)

    如何编写dll文件

    如何编写dll文件:可以用几种语言来实现,如delphi编写dll,pb编写dll文件,java 编写d
    发表于 01-16 10:20 8878次阅读

    如何用pb编写dll文件

    如何用pb编写dll文件 在Windows CE中,所有的驱动程序都以dll形式存在。Dll文件
    发表于 01-16 10:24 4343次阅读

    Delphi教程之取得和修改文件创建和修改日期

    Delphi教程之取得和修改文件创建和修改日期,很好的Delphi资料,快来下载吧。
    发表于 04-11 15:59 6次下载

    创建基于DLL的Proteus仿真模型

    创建基于DLL的Proteus仿真模型,希望对大家有所帮助!一起学习。
    发表于 04-13 14:29 43次下载

    Arduino板是什么如何使用IDE软件创建和上传Arduino程序到Arduino板

    本章我们将研究Arduino板和IDE软件,我们要用IDE软件创建和上传Arduino程序到Arduino板(Arduino用草图表示程序,我们还是继续用程序这个传统术语)。我们会学到
    发表于 05-14 18:11 4次下载
    Arduino板是什么如何使用IDE软件<b class='flag-5'>创建和</b>上传Arduino<b class='flag-5'>程序</b>到Arduino板

    使用LabVIEW调用DLL文件的方法

    DLL(动态链接库)文件是 Dynamic Link Library 的缩写形式,是一种允许程序共享执行特殊任务所必需的代码和其他资源的可执行文件。其多数情况下是带有
    发表于 10-29 08:00 33次下载
    使用LabVIEW调用<b class='flag-5'>DLL</b><b class='flag-5'>文件</b>的方法

    FreeRTOS任务如何创建和删除?

    在FreeRTOS移植到Cortex-M3硬件平台的文章中,我们已经见过任务创建API,但那篇文章的重点在于如何移植FreeRTOS,本文将重点放在任务的创建和删除API函数上面。 任务创建和删除
    的头像 发表于 03-11 18:08 2933次阅读

    如何创建和使用LabVIEW中的LLB文件

    如何创建和使用LabVIEW中的LLB文件
    发表于 11-22 16:12 0次下载

    DLL简介

    DLL 劫持 DLL 简介 在 Windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即 DLL
    的头像 发表于 05-22 15:51 1512次阅读
    <b class='flag-5'>DLL</b>简介

    如何使用TSMaster调用外部DLL/LIB程序

    调用外部DLL/LIB程序在用户自定义开发过程中,常常会遇到需要调用外部DLL/LIB程序文件的需求,这些文件可能是用户自己编写的,也可能是
    的头像 发表于 08-16 09:36 1385次阅读
    如何使用TSMaster调用外部<b class='flag-5'>DLL</b>/LIB<b class='flag-5'>程序</b>