yolov5 C++环境搭建

安装依赖包:

pip install onnx

模型转化:

python export.py --weights yolov5s.pt --include onnx

opencv版本要求:4.5以上

安装部署器:opencv 4.8.0

opencv编译下载:

git clone https://github.com/opencv/opencv.git

bash 复制代码
cd opencv

git checkout 4.8.0

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=Release \

-D CMAKE_INSTALL_PREFIX=/usr/local \

-D OPENCV_GENERATE_PKGCONFIG=ON \

-D BUILD_EXAMPLES=OFF \

-D BUILD_TESTS=OFF \

-D BUILD_PERF_TESTS=OFF \

..

make -j$(nproc)


sudo make install

代码:

CMakeLists.txt

bash 复制代码
cmake_minimum_required(VERSION 3.10)
project(yolov5_cpp)

set(CMAKE_CXX_STANDARD 11)
set(OpenCV_DIR /usr/local/lib/cmake/opencv4)

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(yolo main.cpp)
target_link_libraries(yolo ${OpenCV_LIBS})

main.cpp

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>

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

const float CONF_THRESHOLD = 0.25f;
const float NMS_THRESHOLD = 0.45f;  // 去重框关键

vector<string> class_names = {
    "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck",
    "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
    "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra",
    "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
    "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove",
    "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
    "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
    "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
    "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse",
    "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink",
    "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier",
    "toothbrush"
};

int main() {
    string model_path = "yolov5s.onnx";
    Net net = readNet(model_path);

    Mat img = imread("bus.jpg");
    int h = img.rows;
    int w = img.cols;

    Mat blob = blobFromImage(img, 1 / 255.0, Size(640, 640), Scalar(), true, false);
    net.setInput(blob);

    Mat pred;
    net.forward(pred, net.getUnconnectedOutLayersNames()[0]);

    vector<Rect> boxes;
    vector<float> confs;
    vector<int> classIds;

    float* data = (float*)pred.data;
    for (int i = 0; i < 25200; i++) {
        float conf = data[4];
        if (conf < CONF_THRESHOLD) {
            data += 85;
            continue;
        }

        Mat scores(1, class_names.size(), CV_32FC1, data + 5);
        double maxScore;
        Point maxClassPoint;
        minMaxLoc(scores, 0, &maxScore, 0, &maxClassPoint);
        int classId = maxClassPoint.x;

        float x = data[0];
        float y = data[1];
        float ww = data[2];
        float hh = data[3];

        int x1 = (x - ww / 2) * w / 640;
        int y1 = (y - hh / 2) * h / 640;
        int w2 = ww * w / 640;
        int h2 = hh * h / 640;

        boxes.push_back(Rect(x1, y1, w2, h2));
        confs.push_back(conf);
        classIds.push_back(classId);

        data += 85;
    }

    // ✅ NMS 去重框(关键!!!)
    vector<int> indices;
    NMSBoxes(boxes, confs, CONF_THRESHOLD, NMS_THRESHOLD, indices);

    // ✅ 最终干净画框
    for (int idx : indices) {
        Rect box = boxes[idx];
        int cid = classIds[idx];
        float cf = confs[idx];

        rectangle(img, box, Scalar(0, 255, 0), 2);
        string label = class_names[cid] + " " + to_string(cf).substr(0, 4);
        putText(img, label, Point(box.x, box.y - 10), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 2);
    }

    imshow("YOLOv5 C++ 干净版", img);
    waitKey(0);

    return 0;
}

编译运行

bash 复制代码
mkdir build
cd build
cmake ..
make
./yolo

把图片和onnx都放到build的文件夹里,与可执行文件yolo一个目录。

相关推荐
AI棒棒牛1 小时前
YOLOv13最新创新改进系列:YOLOv13特征可视化,特征提取图,科技感满满,丰富实验神器!!!
人工智能·科技·yolo·目标检测·计算机视觉
钓了猫的鱼儿2 小时前
【数据集】红外无人机目标检测数据集VOC+YOLO格式10000张1类别
yolo·目标检测·无人机
輕華2 小时前
YOLOv5 实战:从 GitHub 拉取到自定义数据集训练
yolo·github
guo_xiao_xiao_4 小时前
YOLOv11城市道路自行车目标检测数据集-999张-Bicycle-1
人工智能·yolo·目标检测
guo_xiao_xiao_4 小时前
YOLOv11机场跑道大型客机-飞机目标检测数据集-201张-Airplane-1_2_2
人工智能·yolo·目标检测
羊羊小栈6 小时前
基于「YOLO目标检测 + 多模态AI分析」的宠物猫狗健康智能检测分析预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·大作业
南斯拉夫的铁托7 小时前
YOLO学习笔记
笔记·学习·yolo
钓了猫的鱼儿7 小时前
【数据集】红外无人机交通车辆目标检测数据集VOC+YOLO格式2371张4类别
yolo·目标检测·无人机
动物园猫7 小时前
公共安全打架行为识别数据集分享(适用于YOLO系列深度学习检测任务)
人工智能·深度学习·yolo
AI棒棒牛7 小时前
YOLOv13最新创新改进系列:比闪电还快的医学影像分析!YOLOv13+EMCAD融合实战,改进代码已跑通!cvpr2025最新独家改进!
深度学习·yolo·目标检测·计算机视觉