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一个目录。

相关推荐
吃鱼不卡次10 小时前
YOLO26目标检测网络结构
yolo·目标检测·yolo26
向哆哆12 小时前
高质量人体检测与行人识别数据集分享(适用于YOLO系列深度学习分类检测任务)
深度学习·yolo·目标检测·分类
阿拉斯攀登13 小时前
售货柜实战:IPC 拉流 → 抽帧 → YOLO 识别完整流水线
yolo·ffmpeg·音视频·webrtc·视频编解码
懂AI的老郑16 小时前
面对小众场景的目标检测联合智能体零样本检测可行性分析
人工智能·yolo·架构
断眉的派大星1 天前
YOLO实例分割详细解析
人工智能·yolo·计算机视觉
2601_951659992 天前
4.19华为OD机试真题 新系统 - WIFI设备网络规划 (JavaPyCC++JsGo)
深度学习·yolo·计算机视觉·yolo11·yolo26
2601_951659992 天前
4.19华为OD机试真题 新系统 - 8位LED控制器 (JavaPyCC++JsGo)
深度学习·yolo·计算机视觉·yolo11·yolo26
前网易架构师-高司机2 天前
带标注的打电话识别数据集,识别率98.9%,9723张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·json·手机·数据集·打电话
hans汉斯2 天前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer
暂未成功人士!3 天前
基于 YOLOv8 的端到端一体式二次分类检测实现思路
yolo·目标检测·分类