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.

Template Matching mit Auswertung 1:

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

Template Matching mit Auswertung 2:

Template Matching mit Auswertung 3: