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 FormenStruktur 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 KonturvergleichFelder 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
TabelleStruktur 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