当前位置:网站首页>Obstacle detection
Obstacle detection
2022-07-06 00:54:00 【DDsoup】
Now for me, the most confused place is realsense SDK2.0 How do you use it? , How to combine the code with the image obtained by the camera .
Obstacle detection ideas
- Read image
- Binary processing of the image ( Use open or close operations ), Only detect the range of distance within one meter ( use realsense camera )
- Pass threshold size ( First set the threshold size ),Canny edge detection Obstacles detected , Draw the outline and calculate its convex hull ( I don't think it's reliable to use color as one of the judging elements , In case this object is colorful )
- Generate the final image
Reference code
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "RSWrapper.h"
#include "opencv2/imgproc/imgproc.hpp"
#include <librealsense/rs.hpp>
using namespace rs2;
using namespace std;
using namespace cv;
void mask_depth(Mat &image,Mat& th,int throld=1000)
{
int nr = image.rows; // The horizontal axis
int nc = image.cols; // The vertical axis
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;
}
}
}
// Find obstacles
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));// The size of the core can be adjusted appropriately
Mat out;
// Carry out the opening operation
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);
// Binarization of the image
threshold(dep, threshold_output, thresh, 255, CV_THRESH_BINARY);
// Contour discovery
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
// Calculate the convex hull of each contour
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);
}
// Draw the outline and its convex hull
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
if (contourArea(contours[i]) < area)// The area is less than area Convex hull of , Negligible
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);
while (true)
{
// obtain RGB Images
Mat color, depth;
bool ret = depthCam.capture(color, depth);
if (!ret)
{
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();
}
边栏推荐
- Cve-2017-11882 reappearance
- How spark gets columns in dataframe --column, $, column, apply
- Cf:d. insert a progression [about the insert in the array + the nature of absolute value + greedy top-down]
- Spark DF adds a column
- 激动人心,2022开放原子全球开源峰会报名火热开启
- cf:H. Maximal AND【位运算练习 + k次操作 + 最大And】
- Gartner released the prediction of eight major network security trends from 2022 to 2023. Zero trust is the starting point and regulations cover a wider range
- curlpost-php
- Cf:c. the third problem
- STM32 key chattering elimination - entry state machine thinking
猜你喜欢
Recursive method to realize the insertion operation in binary search tree
看抖音直播Beyond演唱会有感
2020.2.13
可恢复保险丝特性测试
After 95, the CV engineer posted the payroll and made up this. It's really fragrant
Installation and use of esxi
毕设-基于SSM高校学生社团管理系统
cf:C. The Third Problem【关于排列这件事】
[groovy] XML serialization (use markupbuilder to generate XML data | create sub tags under tag closures | use markupbuilderhelper to add XML comments)
从 1.5 开始搭建一个微服务框架——调用链追踪 traceId
随机推荐
程序员搞开源,读什么书最合适?
Study diary: February 13, 2022
Gartner发布2022-2023年八大网络安全趋势预测,零信任是起点,法规覆盖更广
Illustrated network: the principle behind TCP three-time handshake, why can't two-time handshake?
Cf:d. insert a progression [about the insert in the array + the nature of absolute value + greedy top-down]
The growth path of test / development programmers, the problem of thinking about the overall situation
How to make your own robot
logstash清除sincedb_path上传记录,重传日志数据
详细页返回列表保留原来滚动条所在位置
Convert binary search tree into cumulative tree (reverse middle order traversal)
Zhuhai laboratory ventilation system construction and installation instructions
The relationship between FPGA internal hardware structure and code
Programmer growth Chapter 9: precautions in real projects
[groovy] JSON string deserialization (use jsonslurper to deserialize JSON strings | construct related classes according to the map set)
Arduino六足机器人
Getting started with devkit
Four dimensional matrix, flip (including mirror image), rotation, world coordinates and local coordinates
The population logic of the request to read product data on the sap Spartacus home page
测试/开发程序员的成长路线,全局思考问题的问题......
devkit入门