opencv C++ dnn模块调用yolov5以及Intel RealSense D435深度相机联合使用进行目标检测

一、代码

#include <opencv2/opencv.hpp>
#include <opencv2/dnn/dnn.hpp>
#include <librealsense2/rs.hpp> // Include RealSense Cross Platform API

using namespace cv;
using namespace dnn;
using namespace std;
using namespace rs2;

// 类名数组,这里需要替换为实际YOLO模型所检测的对象的类名
const char* classNames[] = {"object1", "object2", "object3", "object4"};

int main(int argc, char** argv)
{
    // 模型权重和配置文件路径,这些文件包含了训练好的YOLO模型参数和网络配置
    String model = "yolov5.onnx";  // 替换为实际模型文件路径

    // 加载预训练的模型和配置到DNN网络中
    Net net = readNetFromONNX(model);
    // 设置推理引擎后端为OpenCV,目标设备为CPU
    net.setPreferableBackend(DNN_BACKEND_OPENCV);
    net.setPreferableTarget(DNN_TARGET_CPU);

    // Declare depth colorizer for pretty visualization of depth data
    colorizer color_map;

    // Declare RealSense pipeline, encapsulating the actual device and sensors
    pipeline p;
    // Start streaming with default recommended configuration
    p.start();

    // 循环直到用户按下键盘上的任意键
    while (waitKey(1) < 0) {
        // Wait for the next set of frames from the camera
        frameset frames = p.wait_for_frames();
        // Get a frame from the RGB camera
        frame color = frames.get_color_frame();

        // Create OpenCV matrix of size (color_height, color_width)
        Mat frame(Size(640, 480), CV_8UC3, (void*)color.get_data(), Mat::AUTO_STEP);

        Mat blob;   // 用于存储处理后的图像,以适应网络输入

        // 将帧图像转换为网络输入所需格式
        blobFromImage(frame, blob, 1/255.0, cv::Size(416, 416), Scalar(0,0,0), true, false);

        // 将blob设置为网络的输入
        net.setInput(blob);

        // 运行前向传递以获取网络的输出层
        vector<Mat> outs;
        net.forward(outs, net.getUnconnectedOutLayersNames());

        // 遍历网络输出的每一层结果
        for (size_t i = 0; i < outs.size(); ++i) {
            for (int j = 0; j < outs[i].rows; ++j) {
                Mat scores = outs[i].row(j).colRange(5, outs[i].cols);
                Point classIdPoint;
                double confidence;

                minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);

                if (confidence > 0.5) {
                    int centerX = (int)(outs[i].at<float>(j, 0) * frame.cols);
                    int centerY = (int)(outs[i].at<float>(j, 1) * frame.rows);
                    int width = (int)(outs[i].at<float>(j, 2) * frame.cols);
                    int height = (int)(outs[i].at<float>(j, 3) * frame.rows);
                    int left = centerX - width / 2;
                    int top = centerY - height / 2;

                    rectangle(frame, Rect(left, top, width, height), Scalar(0, 255, 0), 2);
                    int classIdx = static_cast<int>(classIdPoint.x);
                    string classLabel = string(classNames[classIdx]);
                    string label = classLabel + ":" + format("%.2f", confidence);
                    
                    int baseLine;
                    Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
                    top = max(top, labelSize.height);
                    rectangle(frame, Point(left, top - labelSize.height), Point(left + labelSize.width, top + baseLine), Scalar::all(255), FILLED);
                    putText(frame, label, Point(left, top), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0,0,0));
                }
            }
        }

        // 展示处理后的帧
        imshow("YoloV8", frame);
    }

    return 0;
}

注意:由于手头上没有该摄像头,本人只是查询资料,以及文档之后写的代码,并没有实操

二、安装包

需要安装opencv、librealsense2库

链接:Intel.RealSense.SDK.zip资源-CSDN文库

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用OpenCV 4.5.7调用Yolov8时,需要进行以下步骤: 1. 首先,确保已经安装了OpenCV 4.5.7版本,并能够正常运行。 2. 然后,下载Yolov8的模型文件和权重文件。可以在Yolov8的官方网站或GitHub页面上找到这些文件。 3.将模型文件和权重文件加载到OpenCV中。使用cv::dnn::readNetFromDarknet函数来加载模型文件和权重文件。例如: cv::dnn::Net net = cv::dnn::readNetFromDarknet(modelConfig, modelWeights); 这将返回一个表示Yolov8模型的网络对象。 4.接下来,读取图像或视频文件,并将其转换为适合输入Yolov8模型的格式。可以使用cv::imread函数读取图像文件,或者使用cv::VideoCapture函数读取视频文件。 5.将转换后的图像传递给Yolov8模型,并获取检测结果。使用cv::dnn::blobFromImage函数将图像转换为网络可以接受的格式,并使用net.forward函数进行推理。例如: cv::Mat blob = cv::dnn::blobFromImage(image, 1.0 / 255.0, cv::Size(416, 416), cv::Scalar(), true, false); net.setInput(blob); cv::Mat detectionMat = net.forward(); 6.解析检测结果,并绘制边界框和类别标签。遍历检测结果中的每个对象,提取其边界框坐标和类别得分,并使用cv::rectangle和cv::putText函数在图像上绘制边界框和标签。 7.最后,显示带有边界框和标签的图像。使用cv::imshow函数显示处理后的图像,并使用cv::waitKey函数等待用户按下键盘以关闭窗口。 以上就是使用OpenCV 4.5.7调用Yolov8的大致步骤。需要根据具体的应用场景和需求进行适当的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jjm2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值