Pular para o conteúdo principal

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 pesquisar

    Estrutura 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 contornos

    Campos 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
    Tabela

    Estrutura 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; quando options.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