当前位置:网站首页>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();
}
边栏推荐
- Reading notes of the beauty of programming
- 【第30天】给定一个整数 n ,求它的因数之和
- [groovy] compile time metaprogramming (compile time method interception | find the method to be intercepted in the myasttransformation visit method)
- Promise
- The third season of ape table school is about to launch, opening a new vision for developers under the wave of going to sea
- Analysis of the combination of small program technology advantages and industrial Internet
- Cannot resolve symbol error
- 【文件IO的简单实现】
- Finding the nearest common ancestor of binary search tree by recursion
- Hundreds of lines of code to implement a JSON parser
猜你喜欢
Data analysis thinking analysis methods and business knowledge - analysis methods (III)
Questions about database: (5) query the barcode, location and reader number of each book in the inventory table
如何制作自己的机器人
[EI conference sharing] the Third International Conference on intelligent manufacturing and automation frontier in 2022 (cfima 2022)
Idea remotely submits spark tasks to the yarn cluster
After 95, the CV engineer posted the payroll and made up this. It's really fragrant
程序员搞开源,读什么书最合适?
Extension and application of timestamp
MYSQL GROUP_ The concat function realizes the content merging of the same ID
The inconsistency between the versions of dynamic library and static library will lead to bugs
随机推荐
Free chat robot API
Lone brave man
Intensive learning weekly, issue 52: depth cuprl, distspectrl & double deep q-network
Spark DF adds a column
Building core knowledge points
Promise
Arduino hexapod robot
Cf:h. maximum and [bit operation practice + K operations + maximum and]
Ubantu check cudnn and CUDA versions
小程序容器可以发挥的价值
Exciting, 2022 open atom global open source summit registration is hot
如何制作自己的机器人
Idea remotely submits spark tasks to the yarn cluster
MIT doctoral thesis | robust and reliable intelligent system using neural symbol learning
Zhuhai laboratory ventilation system construction and installation instructions
NLP generation model 2017: Why are those in transformer
Mobilenet series (5): use pytorch to build mobilenetv3 and learn and train based on migration
Cve-2017-11882 reappearance
Hundreds of lines of code to implement a JSON parser
Set data real-time update during MDK debug