Перейти к основному содержимому

cv — поиск контуров на изображении (:cv_find_shapes)

Объявление

найденные_фигуры, визуализированное_изображение = изображение:cv_find_shapes(набор_фигур[, параметры_поиска_фигур])

Параметры

  • набор_фигур
    Таблица, сведения о вершинах одной или нескольких искомых фигур

    Структура набора фигур
    {
    { -- Форма 1
    { -- Вершина 1 формы 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Вершина 2 формы 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- Форма 2
    { -- Вершина 1 формы 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Вершина 2 формы 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    }
  • параметры_поиска_фигур
    Таблица, необязательный параметр, настройки сопоставления контуров

    Поля настроек поиска фигур
    {
    should_visualize = false | true, -- Необязательный параметр: визуализировать ли результат, по умолчанию false
    closed = false | true, -- Необязательный параметр: замыкать ли фигуры, по умолчанию false
    min_area = number_value, -- Необязательный параметр: минимальная площадь, по умолчанию -1, без ограничений
    max_area = number_value, -- Необязательный параметр: максимальная площадь, по умолчанию -1, без ограничений
    blur_size = integer_value, -- Необязательный параметр: размер пикселей ядра размытия, только положительное нечётное число, по умолчанию 3
    canny_threshold1 = 100, -- Необязательный параметр: минимальный порог границы, по умолчанию 100
    canny_threshold2 = 200, -- Необязательный параметр: максимальный порог границы, по умолчанию 200
    diff_threshold = number_value, -- Необязательный параметр: порог различия; чем меньше, тем больше сходство, по умолчанию 0.001
    approx_epsilon = integer_value, -- Необязательный параметр: процент периметра для приближения контура, упрощающий сложный контур, по умолчанию 2
    }

Возвращаемое значение

  • найденные_фигуры
    Таблица

    Структура найденных форм
    {
    { -- Список форм, совпавших с формой 1
    { -- Первая форма, совпавшая с формой 1
    diff_score = number_value, -- Различие этой формы с формой 1; чем меньше, тем больше сходство
    { -- Вершина 1 первой формы, совпавшей с формой 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Вершина 2 первой формы, совпавшей с формой 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- Вторая форма, совпавшая с формой 1
    diff_score = number_value, -- Различие этой формы с формой 1; чем меньше, тем больше сходство
    { -- Вершина 1 второй формы, совпавшей с формой 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Вершина 2 второй формы, совпавшей с формой 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    },
    { -- Список форм, совпавших с формой 2
    { -- Первая форма, совпавшая с формой 2
    diff_score = number_value, -- Различие этой формы с формой 2; чем меньше, тем больше сходство
    { -- Вершина 1 первой формы, совпавшей с формой 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Вершина 2 первой формы, совпавшей с формой 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- Вторая форма, совпавшая с формой 2
    diff_score = number_value, -- Различие этой формы с формой 2; чем меньше, тем больше сходство
    { -- Вершина 1 второй формы, совпавшей с формой 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Вершина 2 второй формы, совпавшей с формой 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    },
    ...
    }
  • визуализированное_изображение
    Объект изображения. Если options.should_visualize равно true, это визуализированный результат — объект изображения

Описание

Ищет на изображении одну или несколько фигур.
Стандартные геометрические фигуры можно создать с помощью функции.

Пример

function make_triangle(side_len) -- Создаёт равносторонний треугольник: достаточно длины стороны, три вершины создаются автоматически
local hf = math.sqrt(3)/2
local h = math.floor(hf * side_len)
return {
{
["x"] = 1,
["y"] = h,
},
{
["x"] = side_len,
["y"] = h,
},
{
["x"] = side_len // 2,
["y"] = 1,
},
}
end

function make_rectangle(side_len) -- Создаёт квадрат: достаточно длины стороны, четыре вершины создаются автоматически
return {
{ -- Верхний левый угол
["x"] = 1,
["y"] = 1,
},
{ -- Нижний левый угол
["x"] = 1,
["y"] = side_len,
},
{ -- Нижний правый угол
["x"] = side_len,
["y"] = side_len,
},
{ -- Верхний правый угол
["x"] = side_len,
["y"] = 1,
},
}
end
-- Возвращаемое значение — список списков фигур; каждый список соответствует фигурам, найденным для одного параметра
-- Здесь ищутся равносторонний треугольник и квадрат
local info, visimg = screen.image():cv_find_shapes({make_triangle(45), make_rectangle(40)}, {
min_area = 2000, -- Минимальная площадь
max_area = 20000, -- Максимальная площадь
diff_threshold = 0.005, -- Максимальный допуск деформации; чем меньше, тем больше сходство
approx_epsilon = 1,
shape_match_mode = 3,
closed = true, -- Замкнутая фигура
should_visualize = true, -- Визуализировать ли результат; при true второе возвращаемое значение — изображение
})

nLog(info[1]) -- Вывести список форм, совпавших с равносторонним треугольником
nLog(info[2]) -- Вывести список форм, совпавших с квадратом

dialog():add_image(visimg):show() -- Визуализировать результат в виде изображения