c++怎么用yolo目标检测
时间: 2023-10-21 08:05:37 浏览: 88
C++版YOLO,实现目标检测
使用 YOLO(You Only Look Once)目标检测算法进行对象检测是一种常见的方法。下面是一些简单的步骤,来使用 C++ 实现 YOLO 目标检测。
1. 首先,你需要下载 YOLO 的权重文件和配置文件,这些文件可以从官方网站上下载得到。
2. 安装 OpenCV 库,该库是一个用于计算机视觉的开源计算机视觉库,并且可以通过 C++ 进行使用。
3. 加载 YOLO 权重文件和配置文件,并初始化 YOLO 模型。
4. 读取图像,使用 YOLO 模型进行对象检测。YOLO 模型会返回每个检测到的对象的类别、位置以及置信度等信息。
5. 可以将检测结果保存到文件中,或者在图像上绘制框来可视化检测结果。
以下是一个简单的示例代码,展示如何使用 C++ 实现 YOLO 目标检测。
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 加载 YOLO 权重文件和配置文件
String weights = "yolov3.weights";
String cfg = "yolov3.cfg";
dnn::Net net = dnn::readNetFromDarknet(cfg, weights);
// 初始化 YOLO 模型
net.setPreferableBackend(dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(dnn::DNN_TARGET_CPU);
// 读取图像
Mat image = imread("test.jpg");
// 使用 YOLO 模型进行对象检测
Mat inputBlob = dnn::blobFromImage(image, 1 / 255.0, Size(416, 416), Scalar(0, 0, 0), true, false);
net.setInput(inputBlob);
vector<Mat> outs;
net.forward(outs, net.getUnconnectedOutLayersNames());
float confThreshold = 0.5;
vector<int> classIds;
vector<float> confidences;
vector<Rect> boxes;
for (size_t i = 0; i < outs.size(); ++i)
{
// 解析 YOLO 模型的输出
float* data = (float*)outs[i].data;
for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols)
{
Mat scores = outs[i].row(j).colRange(5, outs[i].cols);
Point classIdPoint;
double confidence;
minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
if (confidence > confThreshold)
{
int centerX = (int)(data[0] * image.cols);
int centerY = (int)(data[1] * image.rows);
int width = (int)(data[2] * image.cols);
int height = (int)(data[3] * image.rows);
int left = centerX - width / 2;
int top = centerY - height / 2;
classIds.push_back(classIdPoint.x);
confidences.push_back((float)confidence);
boxes.push_back(Rect(left, top, width, height));
}
}
}
// 可视化检测结果
vector<String> classNames = {"person", "car", "truck", "bus", "motorbike"};
for (size_t i = 0; i < boxes.size(); ++i)
{
Rect box = boxes[i];
rectangle(image, box, Scalar(0, 0, 255), 2);
int classId = classIds[i];
String label = format("%.2f %s", confidences[i], classNames[classId].c_str());
int baseline;
Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseline);
rectangle(image, Point(box.x, box.y - labelSize.height - baseline),
Point(box.x + labelSize.width, box.y), Scalar(255, 255, 255), FILLED);
putText(image, label, Point(box.x, box.y - baseline), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
}
// 显示图像
imshow("YOLO Object Detection", image);
waitKey(0);
return 0;
}
```
在上面的代码中,我们使用 OpenCV 库进行了 YOLO 目标检测,并且绘制了检测结果。你可以自己尝试一下,看看能否成功运行代码。
阅读全文