c++ oepncv使用yolov5
时间: 2023-09-22 08:07:11 浏览: 45
要在C++中使用OpenCV部署Yolov5模型,你需要下载或自行构建OpenCV库。你可以参考以下代码示例来使用OpenCV和Yolov5模型:
1. 首先,包含必要的头文件和命名空间:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn/dnn.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
#include <time.h>
using namespace std;
using namespace cv;
using namespace dnn;
```
2. 定义一个函数来绘制检测结果:
```cpp
void drawPred(int classId, float conf, int left, int top, int right, int bottom, cv::Mat& frame, const std::vector<string>& classes) {
cv::rectangle(frame, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 255, 0), 3);
std::string label = cv::format("%.2f", conf);
if (!classes.empty()) {
CV_Assert(classId < (int)classes.size());
label = classes[classId + ": " + label;
}
int baseLine;
cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
top = std::max(top, labelSize.height);
cv::rectangle(frame, cv::Point(left, top - round(1.5 * labelSize.height)), cv::Point(left + round(1.5 * labelSize.width), top + baseLine), cv::Scalar(0, 255, 0), cv::FILLED);
cv::putText(frame, label, cv::Point(left, top), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(),1);
}
```
3. 在你的主函数中,加载Yolov5模型并进行检测:
```cpp
int main() {
// 加载Yolov5模型
cv::dnn::Net net = cv::dnn::readNetFromDarknet("<path_to_yolov5_cfg>", "<path_to_yolov5_weights>");
// 加载类别标签
std::vector<string> classes;
std::ifstream ifs("<path_to_classes_file>");
std::string line;
while (std::getline(ifs, line)) {
classes.push_back(line);
}
// 加载图像
cv::Mat image = cv::imread("<path_to_image>");
// 创建Blob并将其输入到网络中
cv::Mat blob = cv::dnn::blobFromImage(image, 1/255.0, cv::Size(416, 416), cv::Scalar(), true, false);
net.setInput(blob);
// 执行前向传播
std::vector<cv::Mat> outputs;
net.forward(outputs, net.getUnconnectedOutLayersNames());
// 解析检测结果
std::vector<int> classIds;
std::vector<float> confidences;
std::vector<cv::Rect> boxes;
for (const auto& output : outputs) {
for (int i = 0; i < output.rows; ++i) {
const float* data = output.ptr<float>(i);
for (int j = 0; j < output.cols; ++j) {
cv::Mat scores = output.row(i).colRange(5, output.cols);
cv::Point classIdPoint;
double confidence;
cv::minMaxLoc(scores, nullptr, &confidence, nullptr, &classIdPoint);
if (confidence > 0.5) {
int centerX = static_cast<int>(data * image.cols);
int centerY = static_cast<int>(data * image.rows);
int width = static_cast<int>(data * image.cols);
int height = static_cast<int>(data * image.rows);
int left = centerX - width / 2;
int top = centerY - height / 2;
classIds.push_back(classIdPoint.x);
confidences.push_back(confidence);
boxes.emplace_back(left, top, width, height);
}
data += output.cols;
}
}
}
// 应用非极大值抑制以过滤重叠的边界框
std::vector<int> indices;
cv::dnn::NMSBoxes(boxes, confidences, 0.5, 0.4, indices);
// 绘制检测结果
for (int i : indices) {
cv::Rect box = boxes[i];
drawPred(classIds[i], confidences[i], box.x, box.y, box.x + box.width, box.y + box.height, image, classes);
}
// 显示结果
cv::imshow("Detection", image);
cv::waitKey(0);
return 0;
}
```
你需要将代码中的`<path_to_yolov5_cfg>`替换为Yolov5的配置文件路径,`<path_to_yolov5_weights>`替换为Yolov5的权重文件路径,`<path_to_classes_file>`替换为包含类别标签的文件路径,`<path_to_image>`替换为输入图像的路径。最后,编译并运行代码即可进行Yolov5目标检测。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [c++下使用opencv部署yolov5模型 (DNN)](https://download.csdn.net/download/zhouzongzong/51377419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [c++ opencv调用yolov5 onnx模型](https://blog.csdn.net/qq15070/article/details/127419628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]