首页 > 编程语言 >使用 C++ 调用 YOLOv3 模型进行物体检测

使用 C++ 调用 YOLOv3 模型进行物体检测

时间:2024-12-05 10:10:46浏览次数:9  
标签:调用 YOLOv3 int frame YOLO C++ net data

  1. 环境准备
    首先,确保你已经安装了以下工具:

OpenCV:用于图像处理。
Darknet:用于 YOLO 模型的推理。
C++ 编译器:如 g++。
2. 安装 Darknet
克隆 Darknet 仓库并进入目录:

bash

git clone https://github.com/pjreddie/darknet.git
cd darknet
使用 Makefile 编译 Darknet(如果使用 GPU 支持,记得修改 Makefile,启用 GPU 和 CUDNN):

bash

make
下载 YOLOv3 的预训练权重文件:

bash

wget https://pjreddie.com/media/files/yolov3.weights
3. 使用 C++ 进行物体检测
接下来我们编写一个简单的 C++ 程序,使用 YOLOv3 模型进行物体检测。

C++ 程序 (yolo_detect.cpp)
cpp

include

include <opencv2/opencv.hpp>

include <opencv2/dnn.hpp>

using namespace std;
using namespace cv;
using namespace cv::dnn;

// 加载 YOLO 模型文件
const String modelConfiguration = "cfg/yolov3.cfg"; // YOLO 配置文件路径
const String modelWeights = "yolov3.weights"; // YOLO 权重文件路径
const String classesFile = "cfg/coco.names"; // 类别文件,包含检测物体的类别名称

vector classNames;

// 加载类别文件
void loadClassNames(const string& filename) {
ifstream classFile(filename);
string line;
while (getline(classFile, line)) {
classNames.push_back(line);
}
}

// 加载 YOLO 模型
Net loadYOLOModel() {
// 加载 YOLO 配置文件和权重文件
Net net = readNetFromDarknet(modelConfiguration, modelWeights);
return net;
}

// 物体检测函数
void detectObjects(Mat& frame, Net& net) {
Mat blob;
// 将图像转换为 blob(神经网络的输入格式)
blobFromImage(frame, blob, 1/255.0, Size(416, 416), Scalar(), true, false);

// 将 blob 设置为网络输入
net.setInput(blob);

// 获取网络的所有输出层
vector<String> outNames = net.getUnconnectedOutLayersNames();
vector<Mat> outs;
net.forward(outs, outNames);

// 解析 YOLO 输出
for (size_t i = 0; i < outs.size(); ++i) {
    float* data = (float*)outs[i].data;
    for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols) {
        // 获取每个框的概率
        float confidence = data[4];
        if (confidence > 0.5) {
            // 计算类别
            int classID = -1;
            float maxClassProb = -1;
            for (int k = 5; k < outs[i].cols; ++k) {
                if (data[k] > maxClassProb) {
                    maxClassProb = data[k];
                    classID = k - 5;
                }
            }

            // 如果类别有效,画出矩形框
            if (classID >= 0) {
                int x = (int)(data[0] * frame.cols);
                int y = (int)(data[1] * frame.rows);
                int w = (int)(data[2] * frame.cols);
                int h = (int)(data[3] * frame.rows);

                // 绘制边界框
                rectangle(frame, Point(x, y), Point(x + w, y + h), Scalar(0, 255, 0), 2);

                // 在框上写上类别名
                putText(frame, classNames[classID], Point(x, y - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 2);
            }
        }
    }
}

}

int main() {
// 加载类别名称
loadClassNames(classesFile);

// 加载 YOLO 模型
Net net = loadYOLOModel();

// 打开视频或摄像头
VideoCapture cap("test.jpg");  // 可以换成视频路径或者摄像头索引(0 为默认摄像头)
if (!cap.isOpened()) {
    cerr << "Error: Cannot open video stream or image." << endl;
    return -1;
}

// 循环读取每一帧
while (true) {
    Mat frame;
    cap >> frame;  // 读取一帧

    if (frame.empty()) {
        break;  // 如果没有帧则退出
    }

    // 检测物体
    detectObjects(frame, net);

    // 显示结果
    imshow("YOLO Object Detection", frame);

    // 按下 'q' 键退出
    if (waitKey(1) == 'q') {
        break;
    }
}

return 0;

}
4. 编译和运行
确保你已经安装了 OpenCV 和 C++ 编译器。
编译 C++ 程序:
bash更多内容访问ttocr.com或联系1436423940

g++ -o yolo_detect yolo_detect.cpp pkg-config --cflags --libs opencv4
运行程序:
bash

./yolo_detect
5. 程序说明
加载 YOLO 模型: 我们使用 cv::dnn::readNetFromDarknet 来加载 YOLOv3 的配置和权重文件。
物体检测: 在 detectObjects 函数中,我们将图像转换为模型可以接受的输入格式(blob),然后通过 net.forward() 进行推理,得到检测结果。我们从每个检测框中提取置信度,并在图像中绘制边界框。
OpenCV 显示图像: 使用 imshow 展示检测结果,按 q 键退出。
6. 结果展示
运行程序后,YOLO 模型会自动检测图像中的物体,并显示带有边界框的图像。

标签:调用,YOLOv3,int,frame,YOLO,C++,net,data
From: https://www.cnblogs.com/ocr12/p/18587944

相关文章

  • 接口调用频率太高,如何做好接口的限制呢?
    前端限制接口调用频率主要为了防止用户误操作或恶意攻击导致服务器压力过大。以下几种方法可以实现:1.节流(Throttling):原理:在一定时间内,只允许一个请求发出,忽略后续的请求直到时间窗口结束。适用场景:按钮点击提交、搜索框输入联想等。实现方式:functionthrottle(fu......
  • 使用 PHP 调用 YOLO 模型进行物体检测
    环境准备首先,需要安装以下工具:Darknet:一个开源的深度学习框架,支持YOLO等物体检测模型。PHP:确保你已安装PHP环境。OpenCV:用于图像处理,确保PHP支持图像处理扩展。2.安装Darknet首先,克隆Darknet并编译它:bashgitclonehttps://github.com/pjreddie/darknet.gitc......
  • [C++]常用的windows控制台操作
    目录一、光标1.隐藏光标2.移动光标二、窗口大小1.调整大小2、固定大小三、颜色1.cmd命令2.直接printf颜色四、控制台1.标题一些常用的控制台操作!注意:该文章全程需要:Windows.h头文件,因为使用了Windows的API一、光标1.隐藏光标voidHideCursor(){ CONSOLE_CURSOR_I......
  • 【编程】C++ 中逻辑与运算符 `&&` 具有短路求值的特性在assert中的应用
    关于assert在C++中使用条件&&字符串格式的示例以及对其宏定义解析的相关说明:1.assert基本介绍及示例使用在C++中,assert是一个宏定义,它位于<cassert>头文件(在C中是<assert.h>)中,用于在程序开发阶段进行调试检查。它的基本语法形式是assert(表达式),当......
  • 物体检测(YOLO)示例:使用 Rust 调用 Python 进行物体检测
    在本示例中,我们将展示如何使用Rust调用Python脚本来完成YOLO物体检测任务。我们将通过Rust的std::process::Command调用Python脚本,并传递输入图像以进行检测。环境准备首先,您需要安装以下工具:更多内容访问ttocr.com或联系1436423940Rust语言:从Rust官网安装R......
  • 编程入门与进阶:从网页设计到C++算法,青少年编程的完美指南【文末推荐好书】
    文章目录一、编程入门:从网页设计开始1.1学习HTML:网页的骨架1.2学习CSS:网页的外观设计1.3学习JavaScript:网页的互动功能二、编程进阶:学习C++算法2.1学习C++基础:语法与数据结构2.2学习算法与数据结构2.3解决实际问题:编程竞赛与项目实践三、编程学习的心态与技巧3.1......
  • 【C++】关于 Visual Studio 的使用技巧(保姆级教程)
    目录fliter视图输出文件位置设置查看预处理结果将目标文件转换为可读的汇编自定义程序入口调试时查看变量在内存中的具体值查看代码的反汇编fliter视图visualstudio默认是filter视图(中文为筛选器)项目下的是filter而非硬盘目录里实际的文件夹,这时新建的也是filter想要查看......
  • linux下使用Devhelp添加c++帮助手册
    首先需要两个资源:devhelp和https://zh.cppreference.com/的帮助文档一、准备1.安装devhelpsudoaptinstalldevhelp2.下载https://zh.cppreference.com/的html版本的帮助文档下载以html开头的压缩包 二、将帮助文档解压并将文件放入devhelp目录下1.帮助文档解压后目......
  • C++多线程之异步编程机制
    在C++11及以后的标准中,std::promise和std::future是用于在异步编程场景中实现线程间通信的重要工具。它们可以用来传递异步操作的结果,或者在任务完成时通知等待的线程。下面我将详细解释std::promise和std::future的实现机制,并提供一些使用场景和示例代码。实现机制std::pro......
  • c++中报错:未定义标识符“string” (含解决方法)
    敲代码的时候编译器一直报错如下:解决方案如下1.检查是否引入了头文件,示例如下#include<string>//注意:c语言中的头文件是<string.h>不要搞混了,c++这里没有.h后缀2.是否在代码中指定这个string属于std命名空间示例一:在引入头文件后直接加入这一行usingnamespacestd;......