Обнаружение препятствий для наземного робота по аэрофотоснимку - PullRequest
0 голосов
/ 08 февраля 2019

Result of the code Я хочу выполнить обнаружение препятствий для наземного робота, используя снимок, сделанный дроном области, которую будет покрывать наземный робот.Поскольку у меня ограниченный опыт обработки изображений, я не уверен, как это сделать.Я пытался использовать следующий метод, но результат не очень точный.Он также обнаруживает очень маленькие края и не очень хорошо работает с аэрофотоснимками.

#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 Ответ

0 голосов
/ 09 февраля 2019

Я предлагаю пороговое изображение для цветовой гаммы, совпадающей с землей.Этот подход хорошо работает, если цвет вашей земли не слишком сильно меняется (что имеет место на вашем src-изображении). Возможно, вы захотите проверить этот пример OpenCV (Python).

...