DotCode Reading
In diesem Beispiel werden
- über die Funktion F_VN_ReadDotCodeRoiExp jeweils ein DotCode pro Bild ausgelesen
- und die Ausführungszeit der Funktion über einen Watchdog überwacht.
Erläuterung
Die Funktion F_VN_ReadDotCodeRoiExp sucht nach einem einzelnen DotCode innerhalb eines definierten Bildbereichs und dekodiert diesen. Dabei liefert sie zusätzlich die Kontur sowie den Drehwinkel des gefundenen Codes zurück.
Der Funktion muss ein 1-kanaliges 8-Bit-Grauwertbild übergeben werden. Zudem ist es erforderlich, dass sich der zu lesende DotCode mittig im übergebenen Bildbereich befindet. Liegt der Code nicht im Zentrum des Bildes, muss die Position vorab durch andere Funktionen ermittelt und durch das Setzen einer Region of Interest (ROI) entsprechend angepasst werden.
Der Parameter fModuleWidth definiert den erwarteten Punktdurchmesser in Pixeln. Dieser Wert sollte möglichst exakt dem realen Durchmesser im Bild entsprechen. Dabei ist eine absolute Mindestgröße von 3 Pixeln erforderlich. Für optimale Ergebnisse wird ein Bereich von 5 bis 8 Pixeln empfohlen. Signifikante Abweichungen von der tatsächlichen Modulbreite können die Erkennungsrate verschlechtern und die Ausführungszeit der Funktion deutlich erhöhen.
Zusätzlich lässt sich die Suchstrategie über den Parameter eOptions (ETcVnDotCodeOptions) an die Gegebenheiten angepassen. Z. B. TCVN_DCO_BINARY_INPUT für vorab binarisierte Bilder oder TCVN_DCO_REGULAR_COLOR / TCVN_DCO_INVERTED_COLOR, um gezielt nach dunklen bzw. hellen Codes zu suchen.
Um Zykluszeitüberschreitungen zu verhindern, wird die Funktion im Beispiel mit Hilfe eines Watchdogs überwacht.
Variablen
// DotCode reading
fModuleWidth : REAL := 4.0;
eOptions : ULINT := TCVN_DCO_DEFAULT;
ipCodeDecoded : ITcVnContainer;
ipCodeContour : ITcVnContainer;
sCodeAsString : STRING(255);
fCodeAngleDeg : REAL;
// Watchdog
hrWD : HRESULT;
tStop : DINT := 20000;
tRest : DINT;
// Output
sText : STRING;Code
// Execute the DotCode reading function monitored by the Watchdog function
hrWD := F_VN_StartRelWatchdog(tStop, S_OK);
hr := F_VN_ReadDotCodeRoiExp(
ipSrcImage := ipImageIn,
ipDecodedData := ipCodeDecoded,
fModuleWidth := fModuleWidth,
ipContour := ipCodeContour,
eOptions := eOptions,
hrPrev := hr,
fAngleDeg => fCodeAngleDeg);
hrWD := F_VN_StopWatchdog(hrWD, tRest => tRest);
// Check if the function was executed successfully
IF hr = S_OK THEN
// Export code into string
hr := F_VN_ExportContainer_String(ipCodeDecoded, sCodeAsString, 255, hr);
// Draw code contour into result image
hr := F_VN_DrawContours(ipCodeContour, 0, ipImageRes, aColorRed, 2, hr);
// Write code into result image
hr := F_VN_PutLabelExp(sCodeAsString, ipImageRes, 0, 11, 1, 1, ETcVnFontType.TCVN_FT_HERSHEY_PLAIN, aColorGreen, aColorWhite, ETcVnLineType.TCVN_LT_8_CONNECTED, S_OK);
ELSE
// Write HRESULT into result image
sText := CONCAT('Returncode ', DINT_TO_STRING(hr));
hr := F_VN_PutLabelExp(sText, ipImageRes, 0, 11, 1, 1, ETcVnFontType.TCVN_FT_HERSHEY_PLAIN, aColorRed, aColorWhite, ETcVnLineType.TCVN_LT_8_CONNECTED, S_OK);
END_IF
// Write Code Reading proceeded time into Result Image
sText := CONCAT(CONCAT('Time: ', DINT_TO_STRING(tStop - tRest)), ' us');
hr := F_VN_PutLabelExp(sText, ipImageRes, 0, 26, 1, 1, ETcVnFontType.TCVN_FT_HERSHEY_PLAIN, aColorGreen, aColorWhite, ETcVnLineType.TCVN_LT_8_CONNECTED, S_OK);Ergebnis
