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

news/2024/7/24 10:16:16 标签: opencv, c++, dnn

一、代码

#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 = "yolov8.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文库


http://www.niftyadmin.cn/n/5370711.html

相关文章

WiFi保护访问协议WPA2\WPA3

WPA2和WPA3是无线加密标准&#xff0c;用于保护网络通信不被未授权访问。 WPA3是最新的安全协议&#xff0c;提供比WPA2更强的保护机制&#xff0c;但并非所有设备都支持WPA3。 1、安全模式 在无线安全设置中&#xff0c;你会看到加密方式或安全模式的选项。 选择WPA2-PSK、…

[HTTP协议]应用层的HTTP 协议介绍

目录 1.前言 2.使用fiddler抓包来观察HTTP协议格式 3.HTTP协议的基本格式 2.1请求 2,1.1首行 2.1.2请求头 2.1.3空行 2.2响应 2.2.1首行 2.2.2响应头 键值对 ​编辑2.2.3空行 2.2.4载荷(响应正文) 3.认识URL 3.1关于URL encode 1.前言 我们在前面的博客中,简单的…

MySQL之体系结构

华子目录 MySQL简介MySQL的特性MySQL版本MySQL常见版本 数据库排名网站MySQL结构体系查看最大连接数查询缓存配置情况 一条SQL语句执行流程 MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

ad18学习笔记十八:如何放置丝印层敷铜?

我画板的时候&#xff0c;需要把板卡顶面丝印层的一个矩形区域&#xff0c;画成白色&#xff0c;但是这个区域内有好几个焊盘&#xff0c;丝印涂色的地方需要避开这几个焊盘&#xff0c;我觉得不能简单的在丝印层画一个矩形完事&#xff0c;最好让丝印层的这个区域&#xff0c;…

OpenAI使用的海量数据集介绍

1. OpenAI使用的数据 OpenAI为了训练其尖端的自然语言处理模型&#xff0c;如GPT-4&#xff0c;采用了极为庞大的数据集。虽然具体的细节可能不完全公开&#xff0c;但我们可以根据历史信息和公开报道推测&#xff0c;这些数据集通常包含&#xff1a; WebText&#xff1a;早期…

可达鸭二月月赛——入门赛第四场T4题解

name 王胤皓 AC 记录 Problem Ideas 用一个字符串进行输入&#xff0c;第二个字符串赋值为第一个字符串&#xff0c;然后把第二个字符串进行翻转&#xff0c;第一个字符串称为 s s s&#xff0c;第二个字符串称为 s 2 s2 s2。 再用另外一个存储字典序最小的字符串&#xf…

进程线程20210922

SEL SEL条目有唯一的 RecoreID&#xff0c;用于检索&#xff0c;如果知道了RecoreID可以随机顺序读取。0000H 和 FFFFH 是保留值&#xff0c;是非法的ID值RecoreID是句柄&#xff0c;是无序不连续的。 SEL Device CMD 设置辅助日志状态需要先读取&#xff0c;反过来不要。 G…