Zum Hauptinhalt springen

cv – Konturen im Bild suchen (:cv_find_shapes)

Deklaration

gefundene_forminformationen, visualisiertes_bild = bild:cv_find_shapes(Formensammlung[, Formsuchkonfiguration])

Parameter

  • Formensammlung
    Tabelle mit den Scheitelpunktinformationen einer oder mehrerer zu suchender Formen

    Struktur der Formensammlung
    {
    { -- Form 1
    { -- Scheitelpunkt 1 von Form 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Scheitelpunkt 2 von Form 1
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- Form 2
    { -- Scheitelpunkt 1 von Form 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Scheitelpunkt 2 von Form 2
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    }
  • Formsuchkonfiguration
    Tabelle; optional, Konfiguration für den Konturvergleich

    Felder der Formsuchkonfiguration
    {
    should_visualize = false | true, -- optional, visuelle Ausgabe, standardmäßig false
    closed = false | true, -- optional, geschlossene Form, standardmäßig false
    min_area = number_value, -- optional, kleinste Fläche, standardmäßig -1 (keine Einschränkung)
    max_area = number_value, -- optional, größte Fläche, standardmäßig -1 (keine Einschränkung)
    blur_size = integer_value, -- optional, Pixelgröße des Unschärfekerns, nur positive ungerade Zahlen, standardmäßig 3
    canny_threshold1 = 100, -- optional, unterer Kantenschwellenwert, standardmäßig 100
    canny_threshold2 = 200, -- optional, oberer Kantenschwellenwert, standardmäßig 200
    diff_threshold = number_value, -- optional, Differenzschwellenwert; je kleiner, desto ähnlicher, standardmäßig 0.001
    approx_epsilon = integer_value, -- optional, Prozentsatz des Konturumfangs zur Approximation komplexer Konturen, standardmäßig 2
    }

Rückgabewerte

  • Gefundene Forminformationen
    Tabelle

    Struktur der gefundenen Forminformationen
    {
    { -- Liste der zu Form 1 passenden Formen
    { -- Erste zu Form 1 passende Form
    diff_score = number_value, -- Differenz dieser Form zu Form 1; je kleiner, desto ähnlicher
    { -- Scheitelpunkt 1 der ersten zu Form 1 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Scheitelpunkt 2 der ersten zu Form 1 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- Zweite zu Form 1 passende Form
    diff_score = number_value, -- Differenz dieser Form zu Form 1; je kleiner, desto ähnlicher
    { -- Scheitelpunkt 1 der zweiten zu Form 1 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Scheitelpunkt 2 der zweiten zu Form 1 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    },
    { -- Liste der zu Form 2 passenden Formen
    { -- Erste zu Form 2 passende Form
    diff_score = number_value, -- Differenz dieser Form zu Form 2; je kleiner, desto ähnlicher
    { -- Scheitelpunkt 1 der ersten zu Form 2 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Scheitelpunkt 2 der ersten zu Form 2 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    { -- Zweite zu Form 2 passende Form
    diff_score = number_value, -- Differenz dieser Form zu Form 2; je kleiner, desto ähnlicher
    { -- Scheitelpunkt 1 der zweiten zu Form 2 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    { -- Scheitelpunkt 2 der zweiten zu Form 2 passenden Form
    ["y"] = number_value,
    ["x"] = number_value,
    },
    ...
    },
    ...
    },
    ...
    }
  • Visualisiertes Bild
    Bildobjekt; wenn options.should_visualize true ist, enthält dieser Rückgabewert das visualisierte Bildobjekt

Beschreibung

Sucht ein oder mehrere Formen in einem Bild.
Standardmäßige regelmäßige Formen können mit Funktionen erzeugt werden.

Beispiel

function make_triangle(side_len) -- Erstellt ein gleichseitiges Dreieck und erzeugt anhand der Seitenlänge automatisch 3 Scheitelpunkte
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) -- Erstellt ein Quadrat und erzeugt anhand der Seitenlänge automatisch 4 Scheitelpunkte
return {
{ -- oben links
["x"] = 1,
["y"] = 1,
},
{ -- unten links
["x"] = 1,
["y"] = side_len,
},
{ -- unten rechts
["x"] = side_len,
["y"] = side_len,
},
{ -- oben rechts
["x"] = side_len,
["y"] = 1,
},
}
end
-- Der Rückgabewert ist eine Liste von Formenlisten; jede Liste gehört zu einer in den Parametern angegebenen Form.
-- Hier werden ein gleichseitiges Dreieck und ein Quadrat gesucht.
local info, visimg = screen.image():cv_find_shapes({make_triangle(45), make_rectangle(40)}, {
min_area = 2000, -- kleinste Fläche
max_area = 20000, -- größte Fläche
diff_threshold = 0.005, -- maximale Verformungstoleranz; je kleiner, desto ähnlicher
approx_epsilon = 1,
shape_match_mode = 3,
closed = true, -- geschlossene Form
should_visualize = true, -- visuelle Ausgabe; bei true ist der zweite Rückgabewert ein Bild
})

nLog(info[1]) -- Liste der zum gleichseitigen Dreieck passenden Formen ausgeben
nLog(info[2]) -- Liste der zum Quadrat passenden Formen ausgeben

dialog():add_image(visimg):show() -- Bild visuell ausgeben