原文链接

前几天老大给了个任务,让我帮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)th.at<ushort>(i, j) = 0;}}
}vector<vector<Point> > find_obstacle(Mat &depth, int thresh = 20, int max_thresh = 255, int area = 500)
{Mat dep;depth.copyTo(dep);mask_depth(depth, dep, 1000);dep.convertTo(dep, CV_8UC1, 1.0 / 16);//imshow("color", color);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);}// 绘出轮廓及其凸包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);if (!depthCam.init()){std::cerr << "Init. RealSense Failure!" << std::endl;return -1;}while (true){//Get RGB-D Imagescv::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();
}

改进算法,去除地面阴影

在前文得到视差图和三维坐标的基础上,首先对地面干扰区域和行进路径以外区域进行去除。以下是地面干扰区域的去除方法,行进路径以外区域我采用的是机器人行进过程中设定一定的视角,去除视角之外的区域,通过行进路径以外物体距相机中心在x轴和z轴上的距离来就算角度。

参考论文“基于双目立体视觉的移动机器人障碍物检测技术研究”

然后对处理后的视差图进行二值化分割,大致提取到障碍物。由于立体匹配过程中一些物体文理较弱的区域未匹配,导致一个物体可能被分割成几部分,所以对图像再进行闭运算,然后再求出所有障碍物的凸包,这个时候要计算面积,当面积小于一定的阈值的时候不予考虑,最终输出障碍物的凸包坐标。 
以下是实现过程: 

视差图→三维测距

去除行进路径以外区域→去除地面干扰区域→二值化分割

闭运算→求凸包

基于深度摄像头的障碍物检测(realsense+opencv)相关推荐

  1. 基于双目摄像头的障碍物检测

    基于双目摄像头的障碍物检测 前言:关于双目摄像头的障碍物检测以及基于OpenCV的障碍物检测在CSDN以及博客园上都有几篇相关的文章.然而,相当一部分的关于障碍物检测的文章多偏向于理论,而有实践的文章 ...

  2. CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别、视频识别、摄像头识别(准确度非常高)

    CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别.视频识别.摄像头识别(准确度非常高) 目录 GUI编程设计界面 产品演示 GUI编程设计界面 产品演示 视频演示:https://bl ...

  3. 基于深度学习的人脸检测和关键点检测推理实践(OpenCV实现,含代码)

    目录 一.任务概述 二.环境准备 三.实现步骤 3.1 Python推理 3.2 C++推理 3.2.1 环境准备 3.2.2 推理 3.3 Java推理 一.任务概述 最近项目中大量场景需要用到人脸 ...

  4. 基于深度学习的花卉检测与识别系统(YOLOv5清新界面版,Python代码)

    摘要:基于深度学习的花卉检测与识别系统用于常见花卉识别计数,智能检测花卉种类并记录和保存结果,对各种花卉检测结果可视化,更加方便准确辨认花卉.本文详细介绍花卉检测与识别系统,在介绍算法原理的同时,给出 ...

  5. 奥比中光网络深度摄像头——人脸活体检测

    最近一直在研发一个新的项目:基于深度摄像头的人脸活体识别,采用的是奥比中光的Astra Pro相机. 基于奥比中光的官方SDK进行开发 得到如下文件 1.第一步,在彩色图中添加OpenCV人脸检测代码 ...

  6. 基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)

    摘要:安全帽检测系统用于自动化监测安全帽佩戴情况,在需要佩戴安全帽的场合自动安全提醒,实现图片.视频和摄像头等多种形式监测.在介绍算法原理的同时,给出Python的实现代码.训练数据集,以及PyQt的 ...

  7. 基于深度学习的口罩检测系统(Python+清新界面+数据集)

    摘要:口罩检测系统用于日常生活中检测行人是否规范佩戴口罩,利用深度学习算法可实现图片.视频.连接摄像头等方式的口罩检测,另外支持和结果可视化.在介绍算法原理的同时,给出Python的实现代码以及PyQ ...

  8. 基于深度学习的瓶子检测软件(UI界面+YOLOv5+训练数据集)

    摘要:基于深度学习的瓶子检测软件用于自动化瓶子检测与识别,对于各种场景下的塑料瓶.玻璃瓶等进行检测并计数,辅助计算机瓶子生产回收等工序.本文详细介绍深度学习的瓶子检测软件,在介绍算法原理的同时,给出P ...

  9. 基于深度学习的水果检测与识别系统(Python界面版,YOLOv5实现)

    摘要:本博文介绍了一种基于深度学习的水果检测与识别系统,使用YOLOv5算法对常见水果进行检测和识别,实现对图片.视频和实时视频中的水果进行准确识别.博文详细阐述了算法原理,同时提供Python实现代 ...

最新文章

  1. 设计模式(2)工厂方法模式(Factory Method)
  2. Ubuntu终端回收站
  3. Bzoj1835:[ZJOI2010]基站选址
  4. linux grep 正则表达式
  5. python【蓝桥杯vip练习题库】ADV-97十进制数转八进制数
  6. _Linux安装软件方法总结
  7. 复习之 c实现 通讯录
  8. php代码实现对word文件的查找与替换,ThinkPHP5使用phpword实现文件模板字符替换
  9. android dip转px
  10. Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程
  11. 2021高通AI应用创新大赛-创新赛道-垃圾分类识别 第二次讨论会
  12. 剑指offer面试题35. 复杂链表的复制(DFS)(深拷贝)
  13. symantec病毒服务器的部署及配置
  14. GitHub上常用命令(工作中几乎每天用到的命令)
  15. Mac上安装eclipse svn插件subclipse
  16. 投屏php源码,乐享影视app源码 e4a影视app开源源码 支持下载存缓投屏等功能
  17. Pycharm新建项目,new environment 和 existing interpreter的区别
  18. 添加用户-查看用户列表-禁止默认root登陆
  19. python猴子分桃_猴子分桃 - Ryan in C++ - 博客园
  20. R语言威尔科克森符号秩和(Wilcoxon Signed Rank statistic)分布

热门文章

  1. java生成二维码(链接生成二维码)
  2. 005-汇编加法指令ADD
  3. 批处理文件 执行java_利用批处理文件运行java程序
  4. ansible第一次使用模块报错
  5. 6代cpu装win7
  6. 开源web框架_带有酷名称的开源JavaScript和Web框架的词汇表
  7. JAVA GUI(图形用户界面)
  8. linux下IIC驱动开发分析
  9. Three.js - 光源使用详解1(环境光 AmbientLight、点光源 PointLint)
  10. 深入了解JVM之类文件结构(三)