Find Contour - Hierarchy & Retrieval Mode
Dieses Beispiel zeigt den Retrieval-Mode (ETcVnContourRetrievalMode) bei der Kontursuche (F_VN_FindContoursExp und F_VN_FindContourHierarchyExp) und wie sich dieser auf das Konturergebnis und die zurück gegebene Hierarchie auswirkt.
Erläuterung
Über den Konturabrufmodus (eRetrievalMode vom Typ ETcVnContourRetrievalMode) kann angegeben werden, wie die Konturhierarchie bei der Kontursuche berücksichtigt werden soll. Dieses Beispiel visualisiert passend zum ausgewählten Modus die Ergebnisse.
Nähere Erläuterungen zur Hierarchiestruktur in F_VN_FindContourHierarchyExp.
Variablen
hr : HRESULT;
ipImageIn : ITcVnImage;
ipImageInDisp : ITcVnDisplayableImage;
ipImageRes : ITcVnImage;
ipImageResDisp : ITcVnDisplayableImage;
ipImageHierarchy : ITcVnImage;
ipImageHierarchyDisp : ITcVnDisplayableImage;
// Sample Specific Variables
ipContourList : ITcVnContainer;
ipContour : ITcVnContainer;
ipHierarchyList : ITcVnContainer;
aHierarchy : TcVnVector4_DINT;
aHierarchyTree : TcVnVector4_DINT;
eRetrievalMode : ETcVnContourRetrievalMode := TCVN_CRM_LIST;
eApproximationMethod : ETcVnContourApproximationMethod := TCVN_CAM_SIMPLE;
aOffset : TcVnPoint;
nNumOfElem : ULINT;
nParents : UINT;
i : ULINT;
j : ULINT;
stRect : TcVnRectangle_UDINT;
sText : STRING(80);
// Colors
aColorWhite : TcVnVector4_LREAL := [255, 255, 255];
aColorBlack : TcVnVector4_LREAL := [0, 0, 0];
aColorList : ARRAY[0..4] OF TcVnVector4_LREAL := [ [255,0,0], [0,255,0], [0,0,255], [200,200,0], [200,0,200]];
Code
// Create Result Image
hr := F_VN_ConvertColorSpace(ipImageIn, ipImageRes, TCVN_CST_Gray_TO_RGB, hr);
hr := F_VN_CreateImage(ipImageHierarchy, 130, 200, EtcVnElementType.TCVN_ET_USINT, 3, hr);
hr := F_VN_SetPixels(ipImageHierarchy, aColorWhite, hr);
// Find Contours and their Hierarchy
// -----------------------------------
hr := F_VN_FindContourHierarchyExp(
ipSrcImage := ipImageIn,
ipContours := ipContourList,
ipHierarchy := ipHierarchyList,
eRetrievalMode := eRetrievalMode,
eApproximationMethod := eApproximationMethod,
aOffset := aOffset,
hrPrev := hr);
hr := F_VN_GetNumberOfElements(ipContourList, nNumOfElem, hr);
IF nNumOfElem > 0 THEN
FOR i:= 0 TO (nNumOfElem-1) BY 1 DO
hr := F_VN_GetAt_ITcVnContainer(ipContourList, ipContour, i, hr);
hr := F_VN_GetAt_TcVnVector4_DINT(ipHierarchyList, aHierarchy, i, hr);
// Count Parents and set aColor depending on parent number
nParents := 0;
aHierarchyTree := aHierarchy;
WHILE SUCCEEDED(hr) AND_THEN aHierarchyTree[3] >= 0 DO
nParents := nParents + 1;
hr := F_VN_GetAt_TcVnVector4_DINT(ipHierarchyList, aHierarchyTree, aHierarchyTree[3], hr);
END_WHILE
// Draw contour and number into the result image
sText := TO_STRING(i);
hr := F_VN_UprightBoundingRectangle(ipContour, stRect, hr);
hr := F_VN_PutText(sText, ipImageRes, stRect.nX +10, stRect.nY +15, TCVN_FT_HERSHEY_PLAIN, 1, aColorList[(nParents) MOD 4], hr);
hr := F_VN_DrawContours(ipContour, -1, ipImageRes, aColorList[(nParents) MOD 4], 2, hr);
// Write Hierarchy
hr := F_VN_PutText(sText, ipImageHierarchy, 10, TO_UDINT(10 + i*10), TCVN_FT_HERSHEY_PLAIN, 0.5, aColorList[(nParents) MOD 4], hr);
FOR j := 0 TO 3 BY 1 DO
sText := TO_STRING(aHierarchy[j]);
hr := F_VN_PutText(sText, ipImageHierarchy, TO_UDINT(10 + (j+1)*22), TO_UDINT(10 + i*10), TCVN_FT_HERSHEY_PLAIN, 0.5, aColorBlack, hr);
END_FOR
END_FOR
END_IF
Ergebnisse
Das Eingangsbild
Die gefundenen Konturen bei TCVN_CRM_TREE. Gleiche Farben geben Konturen auf gleicher Ebene wieder
Die Hierarchie zum obigen Ergebnisbild. Dabei bezieht sich jede Zeile jeweils auf eine Kontur und die Spaltenbedeutung ist wie folgt:
- Konturindex („farbige Spalte“)
- Index der nächsten Kontur auf gleicher Hierarchieebene
- Index der vorherigen Kontur auf gleicher Hierarchieebene
- Index der ersten Kind-Kontur
- Index der Eltern-Kontur
Die Zahl -1 gibt an, dass keine entsprechende Kontur existiert.