cv - Encontrar contornos em uma imagem (:cv_find_shapes)
Declaração
informacoes_das_formas, imagem_visualizada = imagem:cv_find_shapes(conjunto_de_formas[, configuracao_de_busca_de_formas])
Parâmetros
-
conjunto_de_formas
Tabela com as informações dos vértices de uma ou mais formas a pesquisarEstrutura do conjunto de formas
{
{ -- forma 1
{ -- vértice 1 da forma 1
["y"] = number_value,
["x"] = number_value,
},
{ -- vértice 2 da forma 1
["y"] = number_value,
["x"] = number_value,
},
...
},
{ -- forma 2
{ -- vértice 1 da forma 2
["y"] = number_value,
["x"] = number_value,
},
{ -- vértice 2 da forma 2
["y"] = number_value,
["x"] = number_value,
},
...
},
...
} -
configuracao_de_busca_de_formas
Tabela opcional de configuração da correspondência de contornosCampos da configuração de busca de formas
{
should_visualize = false | true, -- parâmetro opcional; produzir saída visualizada. O padrão é false
closed = false | true, -- parâmetro opcional; fechar a forma. O padrão é false
min_area = number_value, -- parâmetro opcional; área mínima. O padrão é -1, sem limite
max_area = number_value, -- parâmetro opcional; área máxima. O padrão é -1, sem limite
blur_size = integer_value, -- parâmetro opcional; pixels do núcleo de desfoque, somente números ímpares positivos. O padrão é 3
canny_threshold1 = 100, -- parâmetro opcional; limiar mínimo de borda. O padrão é 100
canny_threshold2 = 200, -- parâmetro opcional; limiar máximo de borda. O padrão é 200
diff_threshold = number_value, -- parâmetro opcional; limiar de diferença: quanto menor, mais semelhante. O padrão é 0.001
approx_epsilon = integer_value, -- parâmetro opcional; percentual do perímetro para aproximar contornos e simplificar contornos complexos. O padrão é 2
}
Valores retornados
-
informacoes_das_formas
TabelaEstrutura das informações das formas encontradas
{
{ -- lista de formas correspondentes à forma 1
{ -- primeira forma correspondente à forma 1
diff_score = number_value, -- diferença desta forma em relação à forma 1; quanto menor, mais semelhantes
{ -- vértice 1 da primeira forma correspondente à forma 1
["y"] = number_value,
["x"] = number_value,
},
{ -- vértice 2 da primeira forma correspondente à forma 1
["y"] = number_value,
["x"] = number_value,
},
...
},
{ -- segunda forma correspondente à forma 1
diff_score = number_value, -- diferença desta forma em relação à forma 1; quanto menor, mais semelhantes
{ -- vértice 1 da segunda forma correspondente à forma 1
["y"] = number_value,
["x"] = number_value,
},
{ -- vértice 2 da segunda forma correspondente à forma 1
["y"] = number_value,
["x"] = number_value,
},
...
},
...
},
{ -- lista de formas correspondentes à forma 2
{ -- primeira forma correspondente à forma 2
diff_score = number_value, -- diferença desta forma em relação à forma 2; quanto menor, mais semelhantes
{ -- vértice 1 da primeira forma correspondente à forma 2
["y"] = number_value,
["x"] = number_value,
},
{ -- vértice 2 da primeira forma correspondente à forma 2
["y"] = number_value,
["x"] = number_value,
},
...
},
{ -- segunda forma correspondente à forma 2
diff_score = number_value, -- diferença desta forma em relação à forma 2; quanto menor, mais semelhantes
{ -- vértice 1 da segunda forma correspondente à forma 2
["y"] = number_value,
["x"] = number_value,
},
{ -- vértice 2 da segunda forma correspondente à forma 2
["y"] = number_value,
["x"] = number_value,
},
...
},
...
},
...
} -
imagem_visualizada
Objeto de imagem; quandooptions.should_visualizeé true, este valor retornado é uma imagem visualizada
Descrição
Encontra uma ou mais formas na imagem.
Formas geométricas padrão podem ser geradas com funções.
Exemplo
function make_triangle(side_len) -- criar um triângulo equilátero; basta o comprimento do lado para gerar automaticamente 3 vértices
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) -- criar um quadrado; basta o comprimento do lado para gerar automaticamente 4 vértices
return {
{ -- superior esquerdo
["x"] = 1,
["y"] = 1,
},
{ -- inferior esquerdo
["x"] = 1,
["y"] = side_len,
},
{ -- inferior direito
["x"] = side_len,
["y"] = side_len,
},
{ -- superior direito
["x"] = side_len,
["y"] = 1,
},
}
end
-- o valor retornado é uma lista de listas de formas; cada lista corresponde às formas encontradas para uma forma do parâmetro
-- aqui procuramos um triângulo equilátero e um quadrado
local info, visimg = screen.image():cv_find_shapes({make_triangle(45), make_rectangle(40)}, {
min_area = 2000, -- área mínima
max_area = 20000, -- área máxima
diff_threshold = 0.005, -- tolerância máxima de deformação; quanto menor, mais semelhante
approx_epsilon = 1,
shape_match_mode = 3,
closed = true, -- forma fechada
should_visualize = true, -- produzir saída visualizada; quando true, o segundo valor retornado é uma imagem
})
nLog(info[1]) -- exibir a lista de formas correspondentes ao triângulo equilátero
nLog(info[2]) -- exibir a lista de formas correspondentes ao quadrado
dialog():add_image(visimg):show() -- exibir visualmente a imagem de saída