Blob Detection mit Watchdog Überwachung

In diesem Beispiel werden

Erläuterung

Die Funktion F_VN_DetectBlobs erleichtert das Suchen gleichartiger Strukturen im Bild. Dazu kombiniert sie das Setzen von Schwellwerten mit dem Suchen und Filtern nach Konturen in einem Aufruf. In diesem Beispiel ist die Funktion so parametriert, dass sie alle runden Strukturen in den Beispielbildern zurückgibt.

Durch äußere Einflüsse können die tatsächlichen Bildinhalte stark von den erwarteten Bildinhalten abweichen. Bei Bildverarbeitungsalgorithmen, deren Ausführungszeit vom Bildinhalt abhängt, kann dies zu Zykluszeitüberschreitungen und damit zu ungewünschten Nebeneffekten führen. Um dies zu verhindern gibt es einen Watchdog. Dieser kann Funktionen, die mit dem Satz „Can return partial results when canceled by Watchdog.“ in der Api gekennzeichnet sind, nach einer vorgegebenen Zeitspanne abbrechen. Die bis zu dem Zeitpunkt ermittelten Ergebnisse können weiterverwendet werden.

Zu den überwachbaren Funktionen gehört auch F_VN_DetectBlobs. Durch Veränderung der zulässigen Ausführungszeit tStop im Watchdog-Start F_VN_StartRelWatchdog lässt sich sehr gut ein Funktionsabbruch und weiterarbeiten mit Teilergebnissen im Vergleich zur vollständigen Ausführung von F_VN_DetectBlobs beobachten. Über F_VN_StopWatchdog wird der Watchdog wieder gestoppt. Dabei gibt ein positiver Rückgabewert in tRest die noch verbleibende Zeit an, während ein negativer Wert in tRest die zum Abbruch zusätzlich benötigte Zeit angibt.

Task Konfiguration

Die Watchdog-Überwachung muss in der ausführenden SPS Task aktiviert werden. Andernfalls werden die Watchdog-Funktionsaufrufe in der SPS ignoriert und die Start-Watchdog-Funktion gibt den Rückgabewert 16#71A „No Interface“ zurück.

Blob Detection mit Watchdog Überwachung 1:

Variablen

hr                  :   HRESULT;
hrFunc              :   HRESULT;

ipImageIn           :   ITcVnImage;
ipImageInDisp       :   ITcVnDisplayableImage;

ipImageRes          :   ITcVnImage;
ipImageResDisp      :   ITcVnDisplayableImage;

// Blob Detection
stBlobParams        :   TcVnParamsBlobDetection;
ipContourList       :   ITcVnContainer;


// Watchdog
hrWD                :   HRESULT;
tStop               :   DINT := 5000;
tRest               :   DINT;
nFraction           :   UDINT;

// Output
sText               :   STRING(255);

// Color
aColorGreen         :   TcVnVector4_LREAL := [0, 255, 0, 0];

// Image Infos
stPixelFormat       :   TcVnPixelFormat;

Code

// Set Parameters
// --------------------------------------------------------------
// - Set fMaxArea to 100000 detect all circles or set it to 10000
//   to detect only the small circles

     stBlobParams.bFilterByArea         := TRUE;
     stBlobParams.fMinArea              := 100;
     stBlobParams.fMaxArea              := 100000;

     stBlobParams.bFilterByCircularity  := TRUE;
     stBlobParams.fMinCircularity       := 0.80;

     stBlobParams.fMinThreshold         := 70;
     stBlobParams.fThresholdStep        := 0;

// Execute DetectBlobs-Function monitored by Watchdog-Function
// --------------------------------------------------------------
// - Set the Watchdog stop time tStop from 5000us to 1000us to see
//   a Watchdog interrupt and that the interim results can be used

     hrWD := F_VN_StartRelWatchdog(tStop, S_OK);
         hrFunc := F_VN_DetectBlobs(
                                ipSrcImage      := ipImageIn,
                                ipBlobContours  := ipContourList,
                                stParams        := stBlobParams,
                                hrPrev          := hr);
     hrWD := F_VN_StopWatchdog(hrWD, tRest => tRest, nFractionProcessed => nFraction);

// Draw Result Image
// --------------------------------------------------------------
hr := F_VN_DrawContours(ipContourList, -1, ipImageRes, aColorGreen, 3, hr);

sText := CONCAT(CONCAT('Processed ', UDINT_TO_STRING(nFraction)), '%');
hr := F_VN_PutTextExp(sText, ipImageRes, 25, 50, TCVN_FT_HERSHEY_SIMPLEX, 1.3, aColorGreen, 2, TCVN_LT_8_CONNECTED, FALSE, hr);

sText := CONCAT(CONCAT('Time ', DINT_TO_STRING(tStop - tRest)), 'us');
hr := F_VN_PutTextExp(sText, ipImageRes, 25, 100, TCVN_FT_HERSHEY_SIMPLEX, 1.3, aColorGreen, 2, TCVN_LT_8_CONNECTED, FALSE,hr);

sText := CONCAT('Returncode ', DINT_TO_STRING(hrFunc));
hr := F_VN_PutTextExp(sText, ipImageRes, 25, 150, TCVN_FT_HERSHEY_SIMPLEX, 1.3, aColorGreen, 2, TCVN_LT_8_CONNECTED, FALSE,hr);

Ergebnisse

Das Eingangsbild

Blob Detection mit Watchdog Überwachung 2:

Alle Kreise im Bild gefunden, mit der Parametrierung des Beispielcodes.

Blob Detection mit Watchdog Überwachung 3:

Einen Teil der Kreise im Bild gefunden, durch ein Auslösen des Watchdogs nach 1ms. Da auch der Abbruch Zeit kostet, ist die tatsächlich benötigte Zeit größer 1ms.

hrWD := F_VN_StartRelWatchdog(tStop:=1000, WATCHDOG_ACCUMULATION_TYPE_MEAN, S_OK);
Blob Detection mit Watchdog Überwachung 4:

Nur die kleinen Kreise im Bild gefunden durch Reduzierung der maximal umschließenden Fläche in Pixel.

stBlobParams.fMinArea := 100;
stBlobParams.fMaxArea := 10000;
Blob Detection mit Watchdog Überwachung 5:

Ähnliches Beispiel