当前位置: 首页 > 知识库问答 >
问题:

基于航空图像的地面机器人障碍物检测

吴升
2023-03-14

#pragma once
#include <string>
#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

//----------------------------------------------------------
// MAIN
//----------------------------------------------------------
int main(int argc, char* argv[])
{
// src image
    Mat src;
//grayscale image
    Mat gray;
// edges image
    Mat edges;
//dst image
    Mat dst;
//eroded image
    Mat erosion;
//smoothed result
    Mat result;

//----------------------------------------------------------
// Image loading
//----------------------------------------------------------
    namedWindow("result");
    namedWindow("src");
    namedWindow("edges");
    src = imread("C:/Users/HP/Desktop/SDP/obstacle detection/obstacle detection/obstacle detection/shapes.jpg");

//----------------------------------------------------------
//Specifying size and type of image
//----------------------------------------------------------
    edges = Mat::zeros(src.size(), CV_8UC1);
    dst = Mat::zeros(src.size(), CV_8UC1);
    gray= Mat::zeros(src.size(), CV_8UC1);
    erosion = Mat::zeros(src.size(), CV_8UC1);
    result = Mat::zeros(src.size(), CV_8UC1);

//----------------------------------------------------------
//Converting from RGB to grayscale
//----------------------------------------------------------
    cvtColor(src, gray, COLOR_BGR2GRAY);

//----------------------------------------------------------
//Edge Detetcion using OpenCV Canny Edge Detector function
//----------------------------------------------------------
    Canny(gray, edges, 80, 255);

//----------------------------------------------------------
//Filling in the non-obstacle areas with white
//----------------------------------------------------------
    for (int i = 0; i<edges.cols; ++i)
    {
        int j = edges.rows - 1;
        for (j = edges.rows - 1; j>0; --j)
        {
            if (edges.at<uchar>(j, i)>0)
            {
                break;
            }
        }
        dst(Range(j, dst.rows - 1), Range(i, i + 1)) = 255;
    }

//----------------------------------------------------------
// Appying erosion function to remove noise 
//----------------------------------------------------------
    Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
   erode(dst,erosion,element);

 //----------------------------------------------------------
 //Smoothing the edges to get result
 //----------------------------------------------------------


    GaussianBlur(erosion, result, Size(5,5), 4);


//----------------------------------------------------------    
// Displaying the intermediate and final resulting images
//----------------------------------------------------------
    namedWindow("src", WINDOW_NORMAL);
    imshow("src", src);

    namedWindow("edges", WINDOW_NORMAL);
    imshow("edges", edges);

    namedWindow("dst", WINDOW_NORMAL);
    imshow("dst", dst);

    namedWindow("erosion", WINDOW_NORMAL);
    imshow("erosion", erosion);

    namedWindow("result", WINDOW_NORMAL);
    imshow("result", result);




//----------------------------------------------------------
// Wait key press
//----------------------------------------------------------
    waitKey(0);
    destroyAllWindows();
    return 0;
}

代码接收图像,将其转换为灰度。然后使用精明的边缘检测来检测图像中所有物体的边缘。边缘检测图像从底部开始填充白色,直到检测到边缘。这个过程一直持续到整个图像被覆盖。结果是一个二进制图像,对于没有障碍物的区域,白色为白色,对于障碍物,黑色为黑色。然后使用opencv函数侵蚀来去除不必要的噪声。

如果我能得到关于如何改进或使用其他技术的建议,我将不胜感激。

共有1个答案

周凯捷
2023-03-14

我建议为图像设定一个与地面匹配的颜色范围的阈值。如果你的地面的颜色没有太大变化(在你的src图像中就是这种情况),这种方法效果很好。你可能想看看这个OpenCV例子(Python)。

 类似资料:
  • 引子 这篇教程旨在帮助开发者快速上手 Rax iOS 上的无障碍开发。 无障碍,即「accessibility」(常常缩写成「a11y」),是相对有障碍访问而言的,常见的有障碍访问场景有两类。 一种是用户因为生理缺陷,没有能力按正常的交互方式访问,举几个例子: 视障人士看不见或看不清,无法感受手淘上的信息,动效,氛围; 听障人士听不见或听不清,无法听到音乐以及视频的语音部分; 老年人视力和听力的退

  • 无障碍性(a11y) 当你设计一款扩展,需要让扩展对于诸如视觉缺陷,失聪,行动不便的残疾人没有使用障碍。 所有人 — 不仅仅是有特殊需求的人 — 都应该能从那些无障碍扩展所提供的相应模式中获益。例如,键盘的快捷键对于盲人,灵敏度较差的那些人非常重要,然而他们也能提高高级用户在无鼠标状态下的工作效率。 字幕和手抄本提供了聋人获取影音内容的通道,然而他们对语言学习者也非常有用。 人们可以通过各种方式和

  • 主要内容:摄像机弹簧臂组件在这一节中,我们需要添加两个组件分别是摄像机弹簧臂组件和摄像机组件。 摄像机弹簧臂组件 摄像机弹簧臂组件,可以想象成是我们的手臂和手。手拿着摄像机,当我们想移动摄像机的时候,我们移动的是我们的手臂而不是摄像机。 1) 打开VS编辑器,在PlayingCharacter.h文件添加摄像机弹簧组件和摄像机组件。 2) 在CPP文件中,添加两个头文件和在构造函数中注册这两个组件。 3) 由于我们的骨骼模

  • Highmaps 支持多种不同方式的地图交互操作,包括缩放、平移、缩放到指定的区域等,所有相关的属性都可以在地图导航器( mapNavigation )中找到。 需要注意的是地图导航器默认是关闭的,这是因为地图导航器可能会影响到网页的导航操作。当用户在地图上滚动鼠标滚轮时,用户可能是需要操作网页的滚动,而当开启了地图导航器,Highmaps 会捕获鼠标滚轮事件,并响应成地图的缩放操作;同样的情况也