前言
創(chuàng)建DLL有幾種不同的方式,最簡(jiǎn)單直接的的方式就是通過VS自帶的動(dòng)態(tài)鏈接庫(DLL)項(xiàng)目,把相關(guān)的功能封裝成一個(gè)類,然后導(dǎo)出幾個(gè)接口方法,編譯成功以后生成DLL文件,就可以在其他地方跟正常的第三方庫配置之后一樣調(diào)用了。
01創(chuàng)建DLL
首先打開VS創(chuàng)建一個(gè)DLL空項(xiàng)目,打開VS的桌面向?qū)缦拢?/p>
創(chuàng)建DLL鏈接庫項(xiàng)目
然后在頭文件中添加mytest.h文件,添加代碼如下:
#pragmaonce #ifdef_DLL_EXPORTS #defineDLL_API_declspec(dllexport) #else #defineDLL_API_declspec(dllimport) #endif #include然后在源文件中添加mytest.cpp文件,添加代碼如下://=========導(dǎo)出函數(shù)C++調(diào)用接口============ classDLL_APIMyTestDLL{ public: intaddData(inta,intb); ~MyTestDLL(); };
#define_DLL_EXPORTS #includeMyTestDLL::~MyTestDLL(){ std::cout<"destory?instance?done!"?< 編譯運(yùn)行成功,顯示如下:
02DLL測(cè)試程序
創(chuàng)建測(cè)試程序,來測(cè)試DLL。新建一個(gè)控制臺(tái)空項(xiàng)目,在源文件中添加main.cpp文件,然后添加如下代碼:
#include"opencv2/opencv.hpp" #include"mytest.h" intmain(intargc,char**argv){ std::cout<"test?mydll..."?<mydll(newMyTestDLL()); intsum=mydll->addData(3,5); std::cout<"DLL?invoke?result?:?"?< 運(yùn)行結(jié)果如下:
YOLOv8對(duì)象檢測(cè)DLL測(cè)試
采用相同的方法,基于ONNXRUNTIME深度學(xué)習(xí)模型庫框架, 我對(duì)以前ONNXRUNTIME + YOLOv8對(duì)象檢測(cè)C++代碼稍作修改,封裝了一個(gè)YOLOv8對(duì)象檢測(cè)推理類為DLL,支持C++與C#接口調(diào)用。客戶端調(diào)用代碼如下:
#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<>"<classNames; std::ifstreamfp(label_map); std::stringname; while(!fp.eof()){ getline(fp,name); if(name.length()){ classNames.push_back(name); } } fp.close(); //std::shared_ptr detector(newYOLOv5ORTDetector()); std::shared_ptr detector(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::vector results; 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導(dǎo)出演示",frame); charc=cv::waitKey(1); if(c==27){//ESC退出 break; } //resetfornextframe results.clear(); } return0; } 審核編輯:湯梓紅
-
dll
+關(guān)注
關(guān)注
0文章
116瀏覽量
46207 -
接口
+關(guān)注
關(guān)注
33文章
9005瀏覽量
153786 -
封裝
+關(guān)注
關(guān)注
128文章
8694瀏覽量
145559 -
C++
+關(guān)注
關(guān)注
22文章
2119瀏覽量
75361 -
動(dòng)態(tài)鏈接庫
+關(guān)注
關(guān)注
0文章
11瀏覽量
7141
原文標(biāo)題:手把手教你 封裝DLL類 給客戶端調(diào)用
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
LABVIEW 創(chuàng)建DLL 文件 字符串連接
LabVIEW中DLL文件的創(chuàng)建過程和編程結(jié)果
怎么為dll創(chuàng)建頭文件?
comres.dll下載 (comres.dll文件病毒)

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

如何編寫dll文件
如何用pb編寫dll文件
mfc71.dll是什么

Delphi教程之取得和修改文件的創(chuàng)建和修改日期
創(chuàng)建基于DLL的Proteus仿真模型
Arduino板是什么如何使用IDE軟件創(chuàng)建和上傳Arduino程序到Arduino板

FreeRTOS任務(wù)如何創(chuàng)建和刪除?
DLL簡(jiǎn)介

如何使用TSMaster調(diào)用外部DLL/LIB程序

評(píng)論