【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测

本方法采用darknet自带的yolo_cpp_dll.dll来实现在c++代码中调用darknet;

1.下载darknet项目:

github地址:[https://github.com/AlexeyAB/darknet](https://github.com/AlexeyAB/darknet)

2.Visual Studio 编译 darknet

打开darknet主目录下 build\darknet 目录,打开yolo_cpp_dll.sln文件
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第1张图片
打开项目属性:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第2张图片
检测CUDA C/C++ 路径:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第3张图片
加载 opencv路径(包含目录,库目录,链接器-输入-附加依赖项)
具体操作可参考: VS2015安装opencv3.4.5步骤

然后点击生成,最后可以在x64文件夹下找到最新生成一些文件:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第4张图片

3.C++项目调用darknet:

目前以QT项目为例:
3.1 项目中需要添加yolo_v2_class.hpp,在 darknet\include 目录下可以找到:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第5张图片

3.2 在项目目录下添加:yolo_cpp_dll.dllyolo_cpp_dll.lib
然后可在yolo_v2_class.hpp 里添加:#pragma comment(lib, "yolo_cpp_dll")

3.3在QT的pro文件中添加相关链接:

LIBS +=  -L$$quote(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.0/lib/x64) -lcublas -lcuda -lcudadevrt -lcudart -lcudart_static -lOpenCL \ #cuda路径
		 -L$${PWD} -lyolo_cpp_dll \	#yolo_cpp_dll.lib路径

3.4 调用yolo_v2_class.hpp的Detector类
源码:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第6张图片

4.简单实例:再C++中调用darknet-yolo

预先准备:
yolo_v2_class.hpp(下载的darknet包里找)
yolo_cpp_dll.dll(yolo_cpp_dll.sln编译生成)
yolo_cpp_dll.lib(yolo_cpp_dll.sln编译生成)

最简化版

#include "yolo_v2_class.hpp"
#include "opencv2/opencv.hpp"

int main()
{
    //cfg 文件路径
    std::string cfg_file = "D:\\workspace\\qt_project\\yolo_demo\\yolov3.cfg";
    //weight 文件路径
     std::string weights_file = "D:\\workspace\\qt_project\\yolo_demo\\yolov3.weights";
    // 图像路径
     std::string image_file  = "D:\\workspace\\qt_project\\yolo_demo\\dog.jpg";
     //设置yolo阈值
     float thresh = 0.5;

     // 创建检测对象
    Detector my_detector(cfg_file,weights_file,0);
    //yolo检测
    std::vector<bbox_t> result_vec = my_detector.detect(image_file,thresh);

    //简单显示检测结果
    cv::Mat image = cv::imread(image_file);
    //遍历bbox_t结构体
    for(std::vector<bbox_t>::iterator iter=result_vec.begin();iter!=result_vec.end();iter++)
    {
        //画检测框
        cv::Rect rect(iter->x,iter->y,iter->w,iter->h);
        cv::rectangle(image, rect, cv::Scalar(255,0,0), 2);
    }
    //显示效果图
    cv::imshow("result",image);
    cv::waitKey(0);

    return 0;
}

最终效果:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第7张图片

QT.pro文件需要添加yolo_cpp_dll的链接库地址:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第8张图片

demo项目结构:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第9张图片
demo文件结构:
【darknet-yolo系列】Windows下在c++中调用darknet-yolo进行检测_第10张图片

6.进阶版:

在实际的项目中,通常会把检测独立出来作为一个类,实现多样性的功能,会在以后的一章讲解,静待链接。

你可能感兴趣的:(darknet)