Find Contour anstelle der Blob Detection

In diesem Beispiel wird eine alternative Lösung des Blob Detection Beispiels mit Hilfe von F_VN_FindContoursExp gezeigt.

Erläuterung

Die Funktion F_VN_DetectBlobs kapselt viele einzelne Bildverarbeitungsschritte in einem Funktionsaufruf. Die internen Verarbeitungsschritte können aber auch durch einzelne Funktionsaufrufe erfolgen. Dies kann das Setzen von Parametern erleichtern, da man die Zwischenergebnisse sieht. Daher werden in diesem Beispiel die gleichen Bilder wie in dem Blob Detection Beispiel verwendet und die gleichen runden Strukturen gesucht.

Variablen

hr                    :    HRESULT; 

ipImageIn             : ITcVnImage;
ipImageInDisp         : ITcVnDisplayableImage;
ipImageWork           : ITcVnImage;
ipImageThresholdDisp  : ITcVnDisplayableImage;
ipImageRes            : ITcVnImage;
ipImageResDisp        : ITcVnDisplayableImage;

// Sample Specific Variables
ipContourList         : ITcVnContainer;
ipContourResultList   : ITcVnContainer;
ipContour             : ITcVnContainer;
ipIterator            : ITcVnForwardIterator;
aOffset               : TcVnPoint;

fThreshold            : LREAL := 70;

fArea                 : LREAL;
fAreaMin              : LREAL := 100;
fAreaMax              : LREAL := 100000;

fCircularity          : LREAL;
fCircularityMin       : LREAL := 0.8;

// Image Infos
stPixelFormat         : TcVnPixelFormat;

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

Code

Vorverarbeitung zur Bildsegmentierung

// Image Segementation
hr := F_VN_Threshold(ipImageIn, ipImageWork, fThreshold, 255, TCVN_TT_Binary, hr);
Find Contour anstelle der Blob Detection 1:

Kontursuche

// Find Contours
hr := F_VN_FindContoursExp(
ipSrcImage             := ipImageWork,
ipContours             := ipContourList,
eRetrievalMode         := ETcVnContourRetrievalmode.TCVN_CRM_LIST,
eApproximationMethod   := ETcVnContourApproximationMethod.TCVN_CAM_SIMPLE,
aOffset                := aOffset,
hrPrev                 := hr);

Filtern der Konturen nach der umschließenden Fläche in Pixeln und der Zirkularität

// Filter Contours
hr := F_VN_GetForwardIterator(ipContourList, ipIterator, hr);
hr := F_VN_CreateContainer(ipContourResultList, ContainerType_Vector_Vector_TcVnPoint2_DINT, 0, hr);

WHILE SUCCEEDED(hr) AND_THEN ipIterator.CheckIfEnd() <> S_OK DO

hr := F_VN_GetContainer(ipIterator, ipContour, hr);
hr := F_VN_IncrementIterator(ipIterator, hr);

// Filter by Area
hr := F_VN_ContourArea(ipContour, fArea, hr);

IF fArea > fAreaMin AND fArea < fAreaMax THEN

// Filter by Circularity
hr := F_VN_ContourCircularity(ipContour, fCircularity, hr);

IF fCircularity > fCircularityMin THEN
// Add contour to the result contour container
hr := F_VN_AppendToContainer_ITcVnContainer(ipContour, ipContourResultList, hr);

END_IF
END_IF
END_WHILE

Ergebnisausgabe

// Draw contours into the result image and display it
hr := F_VN_DrawContours(ipContourResultList, -1, ipImageRes, aColorGreen, 3, hr);
hr := F_VN_TransformIntoDisplayableImage(ipImageRes, ipImageResDisp, hr);
Find Contour anstelle der Blob Detection 2:

Ähnliches Beispiel