关闭

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

2462人阅读 评论(4) 收藏 举报
分类:

一个基于深度摄像头的障碍物检测

代码的核心思路是首先通过二值化,将一米之外的安全距离置零不考虑,然后通过开运算去除掉一些噪点(这个后来发现不一定有必要),在求出所有障碍物的凸包,这个时候要计算面积,当面积小于一定的阈值的时候不予考虑,最终输出障碍物的凸包坐标。

//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 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();
}


0
0
查看评论

【OpenCV】障碍物提取

由于后续要做移动机器人的视觉导航,所以提取机器人行进路径上的障碍物是很重要的一步。目前已基本实现障碍物的提取,但精度不高,后续仍要进行改进。本文主要参考了基于深度摄像头的障碍物检测(realsense+opencv) http://www.cnblogs.com/daihengchen/p/5686...
  • wangchao7281
  • wangchao7281
  • 2016-09-28 10:07
  • 3194

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

一个基于深度摄像头的障碍物检测 代码的核心思路是首先通过二值化,将一米之外的安全距离置零不考虑,然后通过开运算去除掉一些噪点(这个后来发现不一定有必要),在求出所有障碍物的凸包,这个时候要计算面积,当面积小于一定的阈值的时候不予考虑,最终输出障碍物的凸包坐标。 //find_obstacle函数...
  • u012423865
  • u012423865
  • 2017-06-08 10:04
  • 506

opencv2 读取16bit图像数据小结

今天师弟跑来问我一个关于opencv图像值读取的问题, 原话是这样的 在opencv中想要加载一幅16位的图像,鼠标点击显示其位置和灰度数值,但是我写的程序中灰度数值最多只能显示255 拿到这个问题, 自己也不是很清楚, 因为自己其实也是刚刚才接触opencv2.x, 虽然已经出来3了,anyw...
  • zhyh1435589631
  • zhyh1435589631
  • 2015-10-20 13:06
  • 3330

基于视觉的障碍物检测和规避

1. 介绍为了使直升机在复杂多变的走廊中平稳避障飞行,本文提出了三个算法: 一个鲁棒性好的平稳控制算法(基于光流+声波传感器);对周围环境做及时反应使helicopter保持在航线上 障碍物检测(基于SVM,对图像进行分割提取特征);检测到接近的任何障碍物 障碍物规避;给出避障控制...
  • changrj6
  • changrj6
  • 2016-04-29 20:38
  • 4363

图像处理(三) 检测障碍物

前几天写了一个小的项目关于:当手机处于静止状态时,识别是否动或者前方有不同物体MainActivitypublic class MainActivity extends Activity implements SurfaceHolder.Callback, PreviewCallba...
  • Kazichs
  • Kazichs
  • 2016-10-24 20:31
  • 2797

kinect+opencv+mfc读取深度和彩色摄像头及截图

接着上面那一篇读彩色摄像头的。在其基础上加上了定时器和读深度摄像头即截图功能。最终结果图是酱紫的: 截图结果 设置定时器由于好像循环读取并不是很好,所以把打开摄像头和读取视频的代码分开了,并设了一个定时器。当然其中避免不了把一些变量设成全局变量的啦。 定时器void CopentestDl...
  • u013948010
  • u013948010
  • 2017-10-20 15:49
  • 455

【opencv学习】使用opencv与两个摄像头实现双目标定与测距

这一代码中实现标定过程实现的很简单,很容易上手,测距功能也可以使用,而且最终测距的效果也很准确,比之前的代码好很多。 这个文章写了修改后代码的具体实现和运行过程中出现的一些问题。
  • hysteric314
  • hysteric314
  • 2016-05-09 23:31
  • 21763

RealSense SDK 开发笔记 (三)获取R200的图像(OpenCV Mat)

(转载请注明出处) 获取R200的图像并用opencv显示
  • github_32886825
  • github_32886825
  • 2015-12-10 23:13
  • 7200

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

一个基于深度摄像头的障碍物检测 代码的核心思路是首先通过二值化,将一米之外的安全距离置零不考虑,然后通过开运算去除掉一些噪点(这个后来发现不一定有必要),在求出所有障碍物的凸包,这个时候要计算面积,当面积小于一定的阈值的时候不予考虑,最终输出障碍物的凸包坐标。 //find_obstac...
  • liulina603
  • liulina603
  • 2016-11-16 10:28
  • 2462

如何用摄像头来测距(opencv)

 如何用摄像头来测距(opencv)作者:郭世龙       最近一直忙着找工作,blog都长草了,今天把以前作的一个东西放上来充充门面吧。记得在哪看到过老外做的这个东西,觉得很好玩,就自己也做了一个。在摄像头下面固定一个激光笔,...
  • xylary
  • xylary
  • 2007-10-25 19:01
  • 19338
    个人资料
    • 访问:1886319次
    • 积分:16248
    • 等级:
    • 排名:第770名
    • 原创:155篇
    • 转载:221篇
    • 译文:0篇
    • 评论:440条
    最新评论