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

    文章

    113

    浏览量

    45016
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148494
  • 封装
    +关注

    关注

    123

    文章

    7278

    浏览量

    141096
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • 动态链接库
    +关注

    关注

    0

    文章

    10

    浏览量

    7040

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

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

收藏 人收藏

    评论

    相关推荐

    C语言创建dll及Labview实现调用

    本帖最后由 silverze 于 2017-3-20 16:05 编辑 本文将详细记录使用C语言创建一个dll文件,然后在Labview中进行调用的过程。一、目标用C语言创建
    发表于 03-20 16:05

    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

    dinput8.dll下载 (dinput8.dll文件修复)

     dinput8.dll文件丢失了怎么办,下载一个然后到到:C:WINDOWSsystem32 目录下就可以了。 dinput8 - dinput8.dll - DLL
    发表于 11-28 14:17 804次下载
    dinput8.<b class='flag-5'>dll</b>下载 (dinput8.<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 8663次阅读

    如何用pb编写dll文件

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

    mfc71.dll是什么

    mfc71.dll是什么 mfc71.dll是Microsoft基础类( MFC )在创建Microsoft Visual Studio所使用的应用功能模块,此mfc71.dll并非
    发表于 11-28 15:17 2251次阅读
    mfc71.<b class='flag-5'>dll</b>是什么

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

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

    labview软定时dll文件下载

    labview软定时dll文件
    发表于 01-22 13:46 6次下载

    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 31次下载
    使用LabVIEW调用<b class='flag-5'>DLL</b><b class='flag-5'>文件</b>的方法

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

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

    DLL简介

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