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() -- Визуализировать результат в виде изображения