Template Matching mit Auswertung
In diesem Beispiel führen Sie ein Template Matching durch, um ein Bauteil auf einer Platine zu finden. Dazu verwenden Sie:
Anwendung
Denken Sie daran, sowohl das Eingangsbild, als auch das Templatebild zu dem jeweiligen File Source hinzuzufügen. Über den Schwellwert fMatchThreshold
können sie einschränken, wie gut ein Match sein muss, damit er akzeptiert wird.
Programm
In diesem Beispiel ist wichtig, dass Sie ein Templatebild zusätzlich zum normalen Eingangsbild benötigen, um nach Vorkommnissen des Templates auf dem Eingangsbild zu suchen.
Sofern beide Bilder zur Verfügung stehen, führen Sie das Template Matching automatisch mit der Funktion F_VN_MatchTemplateAndEvaluate durch.
hr := F_VN_MatchTemplateAndEvaluate(ipImageIn, ipImageTemplate, ipMatches, fMatchThreshold, hr);
Die gefundenen Matches, deren Übereinstimmungsgrad höher als der angegebene Schwellwert fMatchThreshold
ist, befinden sich nun als Punkte in dem Container ipMatches
. Jeder Punkt gibt die obere linkere Ecke jedes Vorkommnisses von ipImageTemplate
in ipImageIn
an.
Im Prinzip sind Sie nun mit dem Template Matching fertig. Beispielhaft greifen Sie im Folgenden auf die einzelnen Matches zu, um sie in das Bild zu malen. Dafür verwenden sie das Konstrukt zum Zugriff auf Container-Element, wie in der Sektion Container erklärt.
hr := F_VN_GetImageHeight(ipImageTemplate, nHeight, hr);
hr := F_VN_GetImageWidth(ipImageTemplate, nWidth, hr);
hr := F_VN_GetAt_TcVnPoint2_DINT(ipMatches, aPosition, 0, hr);
hr := F_VN_GetForwardIterator(ipMatches, ipIterator, hr);
IF SUCCEEDED(hr) AND ipIterator <> 0 THEN
hr := ipIterator.TcQueryInterface(IID_ITcVnAccess_TcVnPoint2_DINT, ADR(ipAccess));
IF SUCCEEDED(hr) AND ipAccess <> 0 THEN
WHILE SUCCEEDED(hr) AND ipIterator.CheckIfEnd() <> S_OK DO
hr := ipAccess.Get(aPosition);
hr := F_VN_DrawRectangle(
DINT_TO_UDINT(aPosition[0]),
DINT_TO_UDINT(aPosition[1]),
DINT_TO_UDINT(aPosition[0])+nWidth,
DINT_TO_UDINT(aPosition[1])+nHeight,
ipImageRes,
aGreen,
5,
hr
);
hr := F_VN_IncrementIterator(ipIterator, hr);
END_WHILE
END_IF
END_IF
Hinweis | |
Hohe Ausführungsdauer Je nach Größe von Eingangs- und Templatebild kann die Ausführung des Template Matching im Vergleich zu anderen Funktionen sehr lange dauern. Achten Sie darauf, dass Sie die Zykluszeit entsprechend einstellen und ggfs. einen Watchdog verwenden! |
Originalbild | Ergebnisbild |