OpenCV学习[1]-基于深度摄像头障碍物检测的一个例子

前言

本文原载于:《基于深度摄像头的障碍物检测(realsense+opencv)》[传送门]
本文主要对代码排版进行了一些梳理,并增添了部分注释,与自己的示例。

前几天老大给了个任务,让我帮slam组写一个基于深度摄像头的障碍物检测,捣鼓了两天弄出来了,效果还不错,就在这里记一下了。
代码的核心思路是首先通过二值化,将一米之外的安全距离置零不考虑,然后通过开运算去除掉一些噪点(这个后来发现不一定有必要),在求出所有障碍物的凸包,这个时候要计算面积,当面积小于一定的阈值的时候不予考虑,最终输出障碍物的凸包坐标。

函数说明

find_obstacle函数是获取深度图障碍物的函数,返回值是每个障碍物凸包的坐标,参数一depth是realsense返回的深度图(ushort型),参数二thresh和参数三max_thresh,是二值化的参数,参数四是凸包的最小有效面积,小于这个面积的障碍物可以视为噪点。函数首先筛选掉距离大于安全距离的点,然后进行阀值化和开运算减少一下噪点,用findContours得到轮廓图,最后用convexHull得到每个障碍物的凸包,最后返回坐标。
mask_depth函数是对深度图二值化,第一个参数image是原图,第二个参数th是目标图,第三个参数throld是最大距离,单位是mm,大于这个距离即为安全,不用考虑。

代码

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "RSWrapper.h"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

//定义了一个二值化函数,对深度图进行二值化
void mask_depth(Mat &image,Mat& th,int throld=1000){
    int nr = image.rows; // number of rows 
    int nc = image.cols; // number of columns 
    for (int i = 0; i<nr; i++){
        for (int j = 0; j<nc; j++) {
            if  (image.at<ushort>(i, j)>throld) //大于临界值的设为0
                th.at<ushort>(i, j) = 0;
        }
    }
}

//定义了一个获取深度图障碍物的函数,返回一个vector
vector< vector<Point> > find_obstacle(Mat &depth, int thresh = 20, int max_thresh = 255, int area = 500){
    Mat dep;
    depth.copyTo(dep);  //CopyTo函数,将深度图depth复制到新的dep中去
    mask_depth(depth, dep, 1000);
    dep.convertTo(dep, CV_8UC1, 1.0 / 16);  //convertTo函数,将数据的类型进行了一些变化
    imshow("depth", dep);
    Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  //矩形核,核的大小可适当调整
    Mat out;

//进行开操作,去除小的物体(噪点)
    morphologyEx(dep, out, MORPH_OPEN, element);
    //dilate(dhc, out, element);

//显示效果图
    imshow("opencv", out);
    Mat src_copy = dep.clone();
    Mat threshold_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    RNG rng(12345);
// 对图像进行二值化
    threshold(dep, threshold_output, thresh, 255, CV_THRESH_BINARY);
    //mask_depth(src, threshold_output);
// 寻找轮廓
    findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

// 对每个轮廓计算其凸包
    vector<vector<Point> >hull(contours.size());    //定义了凸包的输出
    vector<vector<Point> > result;
    for (int i = 0; i < contours.size(); i++){
        convexHull(Mat(contours[i]), hull[i], false);   //调用convexHull函数
    }

// 绘出轮廓及其凸包
    Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++){
        if  (contourArea(contours[i]) < area)//面积小于area的凸包,可忽略
            continue;
        result.push_back(hull[i]);
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point());
        drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());
    }
    imshow("contours", drawing);
    return result;
}

int main(int argc, char* argv[]){
    Mat dhc;
    Mat dep;
    int idxImageRes = 1, idxFrameRate = 30;
    RSWrapper depthCam(idxImageRes, idxImageRes, idxFrameRate, idxFrameRate);   //可能是intel库函数
    if (!depthCam.init()){
        std::cerr << "Init. RealSense Failure!" << std::endl;   
        return -1;
}

while (true){
    //Get RGB-D Images
    cv::Mat color, depth;
    bool ret = depthCam.capture(color, depth);
    if (!ret) {
        std::cerr << "Get realsense camera data failure!" << std::endl;
        break;
    }

    vector<vector<Point> > result;
    result = find_obstacle(depth, 20, 255, 500);

    if (cvWaitKey(1) == 27) break;
}

depthCam.release();
}

示例

深度信息图
二值化后
凸包生成

<think>好的,用户想了解如何将OpenVINO、PyTorch、Transformer模型和OpenCV应用于无人机视觉项目,并希望有一个示例。我需要先理清这些技术各自的作用,再考虑如何整合它们。 首先,OpenCV是处理图像和视频的基础库,用于图像采集、预处理和后处理。无人机通常需要实时处理摄像头数据,所以OpenCV的实时视频处理功能很重要。比如读取摄像头输入,调整尺寸,颜色转换等。 然后是PyTorch,作为深度学习框架,用来构建和训练模型。在无人机视觉中,可能需要目标检测、跟踪或者场景理解。用户提到Transformer模型,可能是指像Vision Transformer (ViT)这样的模型,或者是DETR用于目标检测。需要确定具体任务,比如使用Transformer做目标检测或者分类。 接下来是OpenVINO,这是英特尔的开源工具包,用于优化和部署推理模型。PyTorch训练好的模型需要转换成ONNX格式,再用OpenVINO的模型优化器进行优化,提升在英特尔硬件上的推理速度。这对于无人机的边缘计算很重要,因为计算资源有限,需要高效推理。 现在需要设计一个流程,结合这些技术。例如,无人机摄像头捕获视频流,用OpenCV读取并预处理,然后使用PyTorch或Transformer模型进行推理,再通过OpenVINO加速,最后用OpenCV做后处理显示结果。 可能的步骤分解: 1. 使用OpenCV捕获实时视频流。 2. 对每一帧进行预处理,比如调整大小、归一化。 3. 加载训练好的模型,可能是PyTorch的Transformer模型,如DETR。 4. 将模型转换为OpenVINO格式,进行推理加速。 5. 对推理结果进行后处理,如绘制边界框。 6. 显示处理后的帧,或者发送控制指令给无人机。 需要注意的问题包括模型转换的兼容性,推理的实时性,以及硬件资源的限制。例如,Transformer模型通常计算量较大,可能需要优化才能在无人机上实时运行。OpenVINO的优化可以在这里发挥作用,比如减少模型层数,量化到INT8等。 示例代码结构可能包括: - 导入必要的库:OpenCV,PyTorch,OpenVINO的模块。 - 初始化摄像头或视频源。 - 加载模型,转换为OpenVINO格式。 - 循环读取帧,预处理,推理,后处理,显示。 可能的问题点:如何正确转换PyTorch模型到OpenVINO,确保输入输出的张量形状正确。另外,预处理和后处理需要与模型训练时保持一致,比如归一化参数。 还需要考虑实际应用场景,比如无人机避障需要实时目标检测,或者跟踪特定目标。Transformer模型可能在这里用于更准确的检测,但需要平衡速度和精度。 最后,用户可能需要具体的代码示例,所以需要提供一个简单的示例流程,涵盖上述步骤,并注释关键部分。同时,根据用户提供的引用,他们可能已经了解YOLO和CVAT,可以适当提及相关模型或标注工具的结合使用。</think>以下为基于OpenVINO、PyTorch、Transformer和OpenCV的无人机视觉处理实现示例,分为模型部署、实时推理、应用场景三部分说明: --- ### 一、技术栈整合流程图 ```mermaid graph TD A[摄像头输入] -->|OpenCV采集| B(图像预处理) B --> C{PyTorch/Transformer模型} C -->|ONNX转换| D[OpenVINO优化推理] D -->|输出解析| E[OpenCV后处理] E --> F[目标跟踪/避障决策] ``` --- ### 二、关键代码实现(目标检测场景) ```python import cv2 import numpy as np from openvino.runtime import Core import torch from transformers import DetrForObjectDetection # 1. OpenCV视频流捕获 cap = cv2.VideoCapture(0) # 无人机摄像头索引 # 2. PyTorch加载Transformer模型(DETR示例) model = DetrForObjectDetection.from_pretrained('facebook/detr-resnet-50') torch.save(model.state_dict(), 'detr.pth') # 3. 转换为OpenVINO格式 dummy_input = torch.randn(1,3,640,640) torch.onnx.export(model, dummy_input, "detr.onnx") ie = Core() ov_model = ie.read_model("detr.onnx") compiled_model = ie.compile_model(ov_model, "CPU") # 4. 实时处理循环 while cap.isOpened(): ret, frame = cap.read() if not ret: break # OpenCV预处理 blob = cv2.dnn.blobFromImage(frame, 1/255.0, (640,640), swapRB=True) # OpenVINO推理 outputs = compiled_model([blob])[0] # 后处理(解析检测结果) boxes = outputs[0][:, :4] scores = outputs[0][:, 4] for box, score in zip(boxes, scores): if score > 0.7: # 置信度阈值 xmin, ymin, xmax, ymax = box.astype(int) cv2.rectangle(frame, (xmin,ymin), (xmax,ymax), (0,255,0), 2) cv2.imshow('Drone View', frame) if cv2.waitKey(1) == 27: break cap.release() cv2.destroyAllWindows() ``` --- ### 三、典型应用场景 1. **实时避障** OpenCV光流法检测运动物体 + Transformer模型识别障碍物类型[^1] 2. **目标跟踪** 使用Transformer的注意力机制实现跨帧目标关联,结合OpenVINO加速跟踪算法 3. **视觉SLAM** PyTorch构建深度学习特征提取器,OpenCV实现ORB特征点匹配 --- ### 四、性能优化技巧 1. **模型量化** 使用OpenVINO的INT8量化工具降低计算延迟: ```bash mo --input_model detr.onnx --data_type INT8 ``` 2. **异步推理** 分离图像采集与推理线程,通过双缓冲区提升吞吐量 3. **硬件加速** 部署到英特尔Movidius VPU时,修改设备参数: ```python compiled_model = ie.compile_model(ov_model, "MYRIAD") ``` ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值