Как определить количество лестниц на изображении с помощью OpenCV C ++ - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь определить, сколько лестниц у меня есть на изображении, используя OpenCV с C ++, я пытался сделать:

1-бинаризация.

2-Canny Filter.

3-фильтр Хафа.

4-связанных компонентов.

Я не получил хороших результатов, вы знаете, какой методологии мне следует придерживаться?

Заранее спасибо.

Вот пример изображения.

enter image description here

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Мой подход к алгоритму просто такой; поиск линий каждой лестницы даст нам номер лестницы. Для этого можно использовать Преобразование Хафлайна . Вы должны прочитать документы, ссылки на которые приведены ниже, чтобы понять параметр logi c функции HoughLinesP.

Первая проблема возникнет: Преобразование Houghline даст вам много строк . Чтобы получить доступные строки, я удаляю строки, у которых значения оси Y близки друг к другу. Я определил этот порог, учитывая минимальное расстояние между двумя лестницами.

Примечание: работа с изображением, снятым вертикально (90 градусов) к лестнице, даст лучшие результаты.

Вот эти шаги, результаты и код:

  • Примените GauusianBlur , чтобы размыть изображение. Причина выбора GauusianBlur вместо других Я считаю, что GaussianBlur имеет хорошую комбинацию с преобразованием houghline .
  • Применить Обнаружение Canny Edge .
  • Преобразовать изображение в формат BGR.
  • Применить HoughLinesP и найти все возможные строки
  • Применить подход с алгоритмом, описанный выше.
  • Получите результаты.

Код:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main()
{

    Mat img = imread("/home/rnd/Desktop/photos/stairs.png");
    imshow("Source",img);

    //Apply Gaussian blur to get good results
    GaussianBlur(img,img,Size(5,5),0,0);

    Mat dst, out_img,control;
    Canny(img, dst, 80, 240, 3);
    cvtColor(dst, out_img, CV_GRAY2BGR);
    cvtColor(dst, control, CV_GRAY2BGR);

    vector<int> y_keeper_for_lines;
    vector<Vec4i> lines;
    HoughLinesP(dst, lines, 1, CV_PI/180, 30, 40, 5 );

    for( size_t i = 1; i < lines.size(); i++ )
    {
        Vec4i l = lines[i];
        line( control, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
    }

    Vec4i l = lines[0];
    line( out_img, Point(0, l[1]), Point(img.cols, l[1]), Scalar(0,0,255), 3, CV_AA);
    y_keeper_for_lines.push_back(l[1]);

    int okey = 1;
    int stair_counter = 1;

    for( size_t i = 1; i < lines.size(); i++ )
    {
        Vec4i l = lines[i];
        for(int m:y_keeper_for_lines)
        {
            if(abs(m-l[1])<15)
                okey = 0;

        }
        if(okey)
        {
            line( out_img, Point(0, l[1]), Point(img.cols, l[1]), Scalar(0,0,255), 3, CV_AA);
            y_keeper_for_lines.push_back(l[1]);
            stair_counter++;
        }
        okey = 1;

    }
    putText(out_img,"Stair number:" + to_string(stair_counter),Point(40,60),FONT_HERSHEY_SIMPLEX,1.5,Scalar(0,255,0),2);
    imshow("Before", img);
    imshow("Control", control);
    imshow("detected lines", out_img);
    waitKey(0);
    return 0;
}

Результаты:

После Гаусса:

enter image description here

HoughLinesP до алгоритма:

enter image description here

После алгоритма:

enter image description here

1 голос
/ 05 мая 2020

Интересные результаты можно получить следующим образом:

  • вычислить суммы пикселей по горизонтали; это даст вам профиль (1D сигнал);

  • вычислить производную профиля;

  • определить пики; они бывают положительными и отрицательными, или по одному на каждый шаг.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...