LSD-detector – детектирование линий / OpenCV / Recog.ru - Распознавание образов для программистов


LSD-detector – детектирование линий

В различных задачах часто необходимо найти вектора на изображении, по которым уже и анализировать результат. Например для этого изображения:

Помимо преобразования Хафа в OpenCV есть более быстрый метод, предназначенный для этих целей. Возьмем пример и для упрощения (чтобы убрать интерфейс командной строки) приведем его к следующему виду:

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

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{   

    Mat image = imread("aero1.jpg", IMREAD_GRAYSCALE);

    imshow("Source Image", image);
    
    //Canny(image, image, 50, 200, 3); 
    
	bool useRefine = false;

    Ptr<LineSegmentDetector> ls = useRefine ? createLineSegmentDetector(LSD_REFINE_STD) : createLineSegmentDetector(LSD_REFINE_NONE);

    double start = double(getTickCount());
    vector<Vec4f> lines_std;

    // Detect the lines
    ls->detect(image, lines_std);

    double duration_ms = (double(getTickCount()) - start) * 1000 / getTickFrequency();
    std::cout << "It took " << duration_ms << " ms." << std::endl;

    image = Scalar(0, 0, 0);   

    ls->drawSegments(image, lines_std);
    	
	imwrite("out.png", image);
    
    return 0;
}


Функция очень простая. Изначально инициализируется класс: LineSegmentDetector, у которого при инициализации могут быть 3 опции:
LSD_REFINE_NONE
Не применять уточнения

LSD_REFINE_STD
Применяется стандартное уточнение.

LSD_REFINE_ADV
Улучшенная утонченность.

Помните, что на уточнение тратится дополнительное время.
После этого вызывается функция класса detect, которая возвращает найденные линии. Отобразить на изображении можно или самостоятельно, или с помощью встроенной функции drawSegments

Ниже приведены примеры для различных вызовов
1) Картинка здания из примера OpenCV
1.1) без метода Кенни и без уточнения распознавание длилось 188ms на i7-6700

1.2) с Кенни и без уточнения распознавание длилось 67

1.3) с Кенни и без уточнения распознавание длилось 100

2) Примеры других картинок
2.1) Аеро


2.2) Карты



Здесь мы видим, что скорость распознавания увеличивается при предварительной обработки, например методом Кенни. Естественно вы можете использовать и другой метод, например, адаптивную бинаризацию

adaptiveThreshold(image, image, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15,0);


Ниже представлен пример различия для аеро метода с Кенни

И с адаптивной бинаризацией
  • 0
  • 27 сентября 2018, 19:32
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.