opencv里怎么运行yolo
时间: 2023-11-13 20:02:55 浏览: 32
在OpenCV中运行YOLO,可以遵循以下步骤:
1. 下载并安装Darknet,可以从Darknet的官方网站下载源代码,并按照其指导进行编译和安装。确保在编译Darknet时启用了OpenCV支持,以便在OpenCV中调用YOLO。
2. 加载YOLO模型和配置文件。可以使用以下代码加载模型和配置文件:
```cpp
// 加载配置文件和权重文件
std::string cfg_file = "path/to/yolov3.cfg";
std::string weights_file = "path/to/yolov3.weights";
std::string classes_file = "path/to/coco.names";
// 加载类别名称
std::vector<std::string> classes;
std::ifstream ifs(classes_file.c_str());
std::string line;
while (std::getline(ifs, line)) classes.push_back(line);
// 加载模型
cv::dnn::Net net = cv::dnn::readNetFromDarknet(cfg_file, weights_file);
```
3. 加载完模型和配置文件后,就可以用OpenCV读取图像并进行物体检测了:
```cpp
// 读取图像
cv::Mat image = cv::imread("path/to/image.jpg");
// 构建输入blob
cv::Mat blob = cv::dnn::blobFromImage(image, 1 / 255.0, cv::Size(416, 416), cv::Scalar(), true, false);
// 设置输入blob
net.setInput(blob);
// 运行前向传播
std::vector<cv::Mat> outs;
net.forward(outs, net.getUnconnectedOutLayersNames());
// 处理输出
std::vector<int> class_ids;
std::vector<float> confidences;
std::vector<cv::Rect> boxes;
for (size_t i = 0; i < outs.size(); ++i) {
// 解析输出blob
float* data = (float*)outs[i].data;
for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols) {
cv::Mat scores = outs[i].row(j).colRange(5, outs[i].cols);
cv::Point class_id;
double confidence;
// 获取类别ID和置信度
cv::minMaxLoc(scores, 0, &confidence, 0, &class_id);
// 过滤低置信度的检测结果
if (confidence > 0.5) {
int center_x = (int)(data[0] * image.cols);
int center_y = (int)(data[1] * image.rows);
int width = (int)(data[2] * image.cols);
int height = (int)(data[3] * image.rows);
int left = center_x - width / 2;
int top = center_y - height / 2;
// 存储检测结果
class_ids.push_back(class_id.x);
confidences.push_back((float)confidence);
boxes.push_back(cv::Rect(left, top, width, height));
}
}
}
// 绘制检测结果
std::vector<int> indices;
cv::dnn::NMSBoxes(boxes, confidences, 0.5, 0.4, indices);
for (size_t i = 0; i < indices.size(); ++i) {
int idx = indices[i];
cv::Rect box = boxes[idx];
cv::rectangle(image, box, cv::Scalar(0, 255, 0), 2);
std::string label = classes[class_ids[idx]] + ": " + std::to_string(confidences[idx]);
int baseline;
cv::Size label_size = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseline);
cv::rectangle(image, cv::Point(box.x, box.y - label_size.height - baseline), cv::Point(box.x + label_size.width, box.y), cv::Scalar(0, 255, 0), -1);
cv::putText(image, label, cv::Point(box.x, box.y - baseline), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0), 1);
}
// 显示结果
cv::imshow("YOLO", image);
cv::waitKey(0);
```
这段代码将从指定路径读取一张图像,然后使用YOLO进行物体检测,并在图像上绘制检测结果。需要注意的是,在读取和处理图像时需要注意数据类型和尺寸,以确保模型的输入和输出格式正确。
如果你需要更多帮助,请参考OpenCV和YOLO的文档或社区,或者联系它们的开发者。