【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3

2023-05-16

目录

0. 前言

1. 准备工作

1.1 yolo_cpp_dll.dll和yolo_cpp_dll.lib的获取

1.2 pthreadGC2.dll和pthreadVC2.dll的获取

1.3 yolo_v2_class.hpp的获取

1.4 设置opencv环境变量(若已经设置可忽略)

2. C++新项目的创建

2.1 创建一个C++新项目(略)

2.2 在新项目文件夹内创建两个新文件夹

2.3 在新项目文件夹内(这里是project1)放好提前准备的链接库等文件

2.4 编写源代码

3. 测试结果

4. 出现的问题

5. 后续目标


0. 前言

在正文之前,默认大家完成了win10系统下,基于darknet框架的yolov3目标检测。若对此部分有疑问,可以参考这篇博文,讲的非常好!

1. 准备工作

当完成了基本工作(前言所述内容)后,准备好以下文件:

1.1 yolo_cpp_dll.dll和yolo_cpp_dll.lib的获取

①在D:\darknet-master\darknet-master\build\darknet路径下,修改yolo_cpp_dll.vcxproj文件(以记事本打开,将CUDA 11.1全部修改为自己电脑的CUDA版本,我的是CUDA 10.1)

②以vs2019打开yolo_cpp_dll.sln进行编译生成

③继续打开darknet下的x64文件夹,会发现此时在x64文件夹下生成了yolo_cpp_dll.dllyolo_cpp_dll.lib

1.2 pthreadGC2.dll和pthreadVC2.dll的获取

在1.1步骤之前,在x64文件夹下同样是直接存在的,所以不用再获取了(参考上张图片)。

1.3 yolo_v2_class.hpp的获取

在D:\darknet-master\darknet-master\include的路径下,直接获取

1.4 设置opencv环境变量(若已经设置可忽略)

双击系统变量—>Path,新建两个opencv环境变量。

2. C++新项目的创建

2.1 创建一个C++新项目(略)

2.2 在新项目文件夹内创建两个新文件夹

分别是params(存放cfg、names等文件)、test(存放测试用的jpg图片和avi视频等文件)

在params中,存放coco.names、yolov3.cfg、yolov3.weights,这些文件都可以直接在darknet/x64找到

 在test中,存放一些测试图片,这里就不展示了,想检测什么放什么。

2.3 在新项目文件夹内(这里是project1)放好提前准备的链接库等文件

2.4 编写源代码

若以上步骤严格执行,这里是可以不用做大的修改,只需要在opencv链接库哪一行,将opencv修改为自己下载的opencv版本号即可另外,test文件夹内还有有检测图片,我这里是dog.jpg。

例如:我这里是opencv3.4.6版本,我用opencv_world346.lib就可以。

#include <iostream>

#ifdef _WIN32
#define OPENCV
#define GPU
#endif

#include "yolo_v2_class.hpp" //引用动态链接库中的头文件
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"

#pragma comment(lib, "opencv_world346.lib") //引入OpenCV链接库
#pragma comment(lib, "yolo_cpp_dll.lib") //引入YOLO动态链接库

//以下两段代码来自yolo_console_dll.sln
void draw_boxes(cv::Mat mat_img, std::vector<bbox_t> result_vec, std::vector<std::string> obj_names,
	int current_det_fps = -1, int current_cap_fps = -1)
{
	int const colors[6][3] = { { 1,0,1 },{ 0,0,1 },{ 0,1,1 },{ 0,1,0 },{ 1,1,0 },{ 1,0,0 } };

	for (auto& i : result_vec) {
		cv::Scalar color = obj_id_to_color(i.obj_id);
		cv::rectangle(mat_img, cv::Rect(i.x, i.y, i.w, i.h), color, 2);
		if (obj_names.size() > i.obj_id) {
			std::string obj_name = obj_names[i.obj_id];
			if (i.track_id > 0) obj_name += " - " + std::to_string(i.track_id);
			cv::Size const text_size = getTextSize(obj_name, cv::FONT_HERSHEY_COMPLEX_SMALL, 1.2, 2, 0);
			int const max_width = (text_size.width > i.w + 2) ? text_size.width : (i.w + 2);
			cv::rectangle(mat_img, cv::Point2f(std::max((int)i.x - 1, 0), std::max((int)i.y - 30, 0)),
				cv::Point2f(std::min((int)i.x + max_width, mat_img.cols - 1), std::min((int)i.y, mat_img.rows - 1)),
				color, CV_FILLED, 8, 0);
			putText(mat_img, obj_name, cv::Point2f(i.x, i.y - 10), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.2, cv::Scalar(0, 0, 0), 2);
		}
	}
	if (current_det_fps >= 0 && current_cap_fps >= 0) {
		std::string fps_str = "FPS detection: " + std::to_string(current_det_fps) + "   FPS capture: " + std::to_string(current_cap_fps);
		putText(mat_img, fps_str, cv::Point2f(10, 20), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.2, cv::Scalar(50, 255, 0), 2);
	}
}

std::vector<std::string> objects_names_from_file(std::string const filename) {
	std::ifstream file(filename);
	std::vector<std::string> file_lines;
	if (!file.is_open()) return file_lines;
	for (std::string line; getline(file, line);) file_lines.push_back(line);
	std::cout << "object names loaded \n";
	return file_lines;
}

int main()
{
	std::string names_file = "C:\\Users\\zzp\\Desktop\\Project1\\params\\coco.names";
	std::string cfg_file = "C:\\Users\\zzp\\Desktop\\Project1\\params\\yolov3.cfg";
	std::string weights_file = "C:\\Users\\zzp\\Desktop\\Project1\\params\\yolov3.weights";
	Detector detector(cfg_file, weights_file, 0); //初始化检测器
	//std::vector<std::string> obj_names = objects_names_from_file(names_file); //调用获得分类对象名称
	//或者使用以下四行代码也可实现读入分类对象文件
	std::vector<std::string> obj_names;
	std::ifstream ifs(names_file.c_str());
	std::string line;
	while (getline(ifs, line)) obj_names.push_back(line);
	//测试是否成功读入分类对象文件
	for (size_t i = 0; i < obj_names.size(); i++)
	{
		std::cout << obj_names[i] << std::endl;
	}

	cv::VideoCapture capture;
	capture.open("C:\\Users\\zzp\\Desktop\\Project1\\test\\dog.jpg");
	if (!capture.isOpened())
	{
		printf("文件打开失败");
	}
	cv::Mat frame;
	while (true)
	{
		capture >> frame;
		std::vector<bbox_t> result_vec = detector.detect(frame);
		draw_boxes(frame, result_vec, obj_names);
		cv::namedWindow("test", CV_WINDOW_NORMAL);
		cv::imshow("test", frame);
		cv::waitKey(0);
	}
	return 0;
}

3. 测试结果

4. 出现的问题

在测试前,出现了一个问题

 解决办法:完美解决

5. 后续目标

将在QT中进行封装,还在学习QT中……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3 的相关文章

  • 导入 _imaging 时 DLL 加载失败:

    我正在尝试运行我的 Python 程序 这些是我要导入的模块 从 tkinter 导入 从 functools 导入部分将 numpy 导入为 np 导入 matplotlib matplotlib use TkAgg 从 matplotl
  • find_library 选择静态库而不是共享库

    This 之前曾被问过 https stackoverflow com questions 3537588 issue on using cmake with msys mingw linking dll files using devil
  • 如何在 Inno Setup 中将 VCL 样式应用到基于 DLL 的表单?

    我正在将 Inno Setup Unicode 与我在 Delphi XE2 中编写的一组 DLL 一起使用 DLL 具有在安装向导 安装过程中显示的 VCL 形式 我已经尝试过实施 VCL 样式 https code google com
  • 在 Visual Studio 外部启动时程序运行速度较慢

    我注意到我的程序有一些奇怪的行为 我使用 Visual Studio Professional 2013 Update 1 用 C 编写它 它由一个 exe 应用程序组成 该应用程序链接多个 DLL 并调用这些 DLL 中定义的函数 在我的
  • 创建非托管常规 MFC DLL 并从托管 C++ .NET 应用程序调用它时出现问题

    我有几个关于 DLL 的问题 我尝试了很多 但无法获得完整的图片 大多数示例都是用 C 等编写的 使用 VS2005 中的向导 我创建了一个非托管 MFC 常规 DLL 由于剩余代码 必须是 MFC 然后我尝试将其导入 VS2005 管理的
  • VB6 应用程序调用 .NET DLL OutOfMemory 异常

    我们有一个调用 NET DLL 的 VB6 应用程序 有时 在 VB6 应用程序运行很长时间并多次调用 NET 代码后 NET 方面会抛出 OutOfMemory 异常 即使计算机上有足够的可用内存 VB6 的内存空间也远未达到极限 NET
  • C++ tbb_debug.dll 丢失

    我是 openCV 的新手 我尝试遵循一些教程 一切工作正常 直到我包含 opencv2 imgproc imgproc hpp 并使用 filter2D 函数 当我启动我的程序时 出现以下错误 程序无法启动 因为您的计算机缺少 tbb d
  • 不使用 Obfuscator 的 DLL 加密

    事实上 我被分配了一项任务来保护我的 DLL 这样 如果我将我的软件部署到任何系统 就没有人可以修改或读取我的 DLL 你能帮我如何在不使用混淆器的情况下对其进行加密吗 您将需要软件来执行此操作 以下是您可能需要考虑的一些软件 Eazfus
  • 为什么这个类库dll没有从app.config获取信息

    我正在开发一个自定义 HttpHandler 为此我编写了一个 C 类库并编译为 DLL 作为其中的一部分 我有一些目录位置 我不想在应用程序中硬编码 所以我尝试将其放入我之前使用过的 app config 中 在此之前 只需构建应用程序配
  • python37.dll 未链接到可执行文件中

    我用 python 扩展了 c 但可执行文件无法在未安装 python 的系统上运行 include C python h int main Py Initialize PyRun SimpleString print hello worl
  • Inno Setup 无法导入 DLL

    我没有运气将 Delphi DLL 导入 Inno Setup Unicode 该DLL有一个简单的过程 procedure Foo stdcall begin end exports Foo 该 DLL 包含在安装程序源中 并添加到文件列
  • C# 调用返回结构的 C++ DLL 函数

    我有一个 C dll 它定义了一个结构体和一个 dll 调用 如下所示 typedef const char FString typedef struct FString version FString build no FString b
  • AutoCAD 插件开发示例

    我对开发 AutoCAD 插件感兴趣 并试图了解几种不同类型的 AutoCAD 插件文件之间的关系 随 AutoCAD 插件一起提供的托管 DLL ARX 文件 https fileinfo com extension arx附带 Auto
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • dependency walker 在正确运行的系统上给我错误

    我的系统上缺少 dll 我有以下消息 无法加载文件或程序集 mydll dll 或其依赖项之一 当然 mydll 存在于此 它很可能是它所依赖的另一个 dll 我下载了 dependency walker 来检查它可能是什么 我首先在另一个
  • 如何从 dll 导出 C++ 类? [复制]

    这个问题在这里已经有答案了 我有一个有两个重载函数的类 如何从 dll 导出它以及如何由其他 C 类使用它 我的班级是这样的 define DECLDIREXP declspec dllexport define DECLDIRIMP de
  • 无法从 ASP.NET 调用 DLL

    您好 我有一个 C Dll 它将与 cobol 应用程序交互 我们想通过互联网将数据发送到cobol 所以我创建了一个 C DLL 它将调用 C DLL 当我执行控制台应用程序时 它工作正常 但是当我尝试从 ASP NET 调用相同的 DL
  • 在 C# 中通过 C DLL 使用数组和指针

    我对 C 非常陌生 上周才开始学习 我有一个用 C 编写的自定义 DLL 具有以下函数 DLLIMPORT void test function double test 我想要做的是从 C 获取数组 test 的指针 因此 如果在 DLL
  • 如何使用 java/vb 脚本调用自定义 ActiveX dll 中的方法

    我使用 VB6 创建了一个 ActiveX dll 并使用打包和部署向导将其打包 生成了一个 cab 文件和一个演示 HTML 页面 此 ActiveX dll 包含一个 simgle 方法 该方法返回字符串且不接受任何参数 我遇到的麻烦是
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL

随机推荐

  • c++ 关于error LINK2005: XXXX已经在 .obj 中定义“的问题

    代码很多的时候出现这个问题很棘手 xff0c 小号大量时间来排查问题 xff0c 所以一边学习一边记录学习中出现的问题 原因 xff1a 是因为编程习惯的问题 xff0c 直接在头文件 h中直接定义了变量或者函数 xff0c 然后A cpp
  • 使用vs2019将libtorch或者网络打包成dll

    最近在搞一个程序 xff0c 需要把libtorch打包成dll xff0c 让别人使用 xff0c 在网上找了好久都没只有找到合适的答案 xff0c 最后在一个博主大哥那里找到了 xff0c 很是感激这位大哥与我们分享自己的经验 xff0
  • 【无标题】 libtorch C++ vs2017 debug模式可以正确加载模型,release模式错误

    转发 xff1a libtorch C 43 43 vs2017 debug模式可以正确加载模型 xff0c release模式错误 https blog csdn net weixin 43862688 article details 1
  • targetcli

    Linux IO LIO Target is an open source implementation of the SCSI target thathas become the standard one included in the
  • libtorch-加载预训练模型出现No such serialized submodule: ‘xxx‘

    今天在用libtorch训练得时候 xff0c 想用预训练模型加速训练 xff0c 居然报错 xff0c 以为是模型得问题 xff0c 然后重新训练了一个模型 xff0c 作为预训练模型 xff0c 还是报错 xff0c 一时找不到原因 x
  • QT学习之路-记事本

    1 在创建记事本之前先明白有哪些功能 xff1a 先创建一个菜单栏 xff0c 菜单栏是用来装各种功能的一个地方如上图所示 xff0c 文件 编辑所在的地方为菜单栏 xff0c span class token comment 创建菜单栏
  • yolov5-pytorch导出模型问题

    在官网提供的代码中 xff0c 很方便的可以把pytorch的模型转为libtorch的模型 xff0c 但是在转换前要明白自己转换后的模型是仅仅为了推理部署 xff0c 还是说用转换后的模型作为libtorch的预训练模型继续使用呢 xf
  • libtorch与pytorch索引张量值操作([:]与index)

    由于我最近在学习libtorch相关的东西 xff0c 所以就记录一下使用libtorch与pytorch一样对张量操作的语法 下面是我转载的一位大佬的文章 xff0c 这里只做技术探讨 xff0c 不做其他用途 想要学习的可以参考一下大佬
  • QT 报 QMetaObject::connectSlotsByName: No matching signal for on_btn_clicked()

    在QT中 xff0c 自己编写命名信号和槽的时候 xff0c 在用connect的时候报出以下错误 xff1a QMetaObject span class token double colon punctuation span conne
  • CRNN-模型转换问题Missing Errorin loading state_dict for CRNN

    在将CRNN pytorch模型转为libtorch模型的时候出现报错情况 xff0c Missing Errorin loading state dict span class token keyword for span CRNN 96
  • CRNN-libtorch模型推理的时候报错std:runtime_error

    使用libtorch模型推理的时候出现报错std runtime error 这里报错的情况一般是数据不同步的问题 xff0c 也就是说我们的模型是在gpu上 xff0c 而数据是在cpu上 xff0c 那么要做的一件事就是检查forwar
  • 数据集txt格式划分为多个txt文件夹

    简单记录一下数据标签txt格式划分为多个文件 xff0c 通常我们标注号的标签 xff0c 都是在一个txt文件夹中 xff0c 我们训练的时候需要把txt中的标签按照一定的比例划分为多个文件 xff0c 这里贴出划分为三个文件的代码 xf
  • 租用终端训练网络遇到的一些坑

    最近由于电脑配置和经济的问题 xff0c 想训练模型 xff0c 无奈只能选择在平台上训练了 xff0c 我使用的是AutoDL这个平台 xff0c 感觉还行 xff0c 还是挺划算 感兴趣或者需要的老铁可以点击蓝色字体进去尝试一下 接下来
  • CRNN-pytorch模型转libtorch模型踩坑记录

    这段时间一直在做CRNN文字识别的问题 xff0c 从pytorch中训练好的模型然后转到libtorch中去 xff0c 但是CRNN提供的代码没有转libtorch模型的部分 xff0c 于是就在网上到处乱找 xff0c 其中找到了这篇
  • 如何升级gcc版本

    下面将整个过程更新的过程写下来 xff0c 希望对有需要的人提供一些帮助 首先需要准备需要材料 xff1a gcc4 4 2版需要安装gmp4 2 0 43 和mpfr2 3 0 43 xff0c 到GMP的网站 xff08 http gm
  • 召回率与精确率的理解

    写在前面 识别精度主要由召回率 xff08 recall xff09 和精确率 xff08 precision xff09 两个指标决定 xff0c 在训练结束时可以通过re pre曲线来表示模型的准确度 xff0c 也可以根据二者之间的关
  • vs常见的错误集锦-error C4996: ‘wcstombs‘: This function or variable may be unsafe

    问题所在 xff1a 缺少宏定义 在使用wcstombs这个函数时遇到了题目所说的这个情况 xff0c 查找得知是缺少宏定义 xff0c 按照网上查找的问题 xff0c 在vs的配置中添加宏定义就行了 xff1b 在以下的位置 xff1a
  • Keil左侧Function列表无法显示(已解决)

    左侧的Functions框框会显示所有的库函数 xff0c 方便查找 查找的来源是工程所在的目录 如果把目录放得太深 xff0c 就会导致扫描不出来 在工程文件里面并列新建一个LIB文件夹用来存放 xff0c 把Inc和Src放进去 打开F
  • Linux服务器配置ulimit的常用参数介绍

    最近在小鸟云配置了一个Linux服务器 xff0c 实例是debian 7 5 系统 xff0c 在进行系统优化的过程中遇到一些有关Ulimit的事项 xff0c 整理了相关的参数介绍和配置介绍 xff0c 有需要可以简单看看 Ulimit
  • 【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3

    目录 0 前言 1 准备工作 1 1 yolo cpp dll dll和yolo cpp dll lib的获取 1 2 pthreadGC2 dll和pthreadVC2 dll的获取 1 3 yolo v2 class hpp的获取 1