Check Color Range mit RGB-Range
In diesem Beispiel werden mit Hilfe der Funktion F_VN_CheckColorRange rote, grüne und blaue Objekte im Bild gesucht und entsprechend ihrer Farbe beschriftet. Dabei wird die Funktion auf RGB-Bilder angewendet. Es ist auch möglich, die Funktion auf Bilder anderer Farbräume wie zum Beispiel HSV, Lab und BGR anzuwenden, die Parametrierung ist dann entsprechend anzupassen.
Variablen
hr : HRESULT;
// Images
ipImageIn : ITcVnImage;
ipImageInDisp : ITcVnDisplayableImage;
ipImageWorkCol : ITcVnImage;
ipImageWorkColDisp : ARRAY [0..2] OF ITcVnDisplayableImage;
ipImageRes : ITcVnImage;
ipImageResDisp : ITcVnDisplayableImage;
// Colors
iColor : INT;
aColorTxt : ARRAY[0..2] OF STRING := [ 'RED', 'GREEN', 'BLUE' ];
aColor : ARRAY[0..2] OF TcVnVector4_LREAL := [ [150, 0, 0], [0, 255, 0], [0, 0, 255] ];
aColorRefLow : ARRAY[0..2] OF TcVnVector4_LREAL := [ [150, 50, 20], [35, 90, 60], [20, 40, 130] ];
aColorRefUp : ARRAY[0..2] OF TcVnVector4_LREAL := [ [255, 120, 100], [100, 200, 140], [60, 160, 255] ];
// Contours
ipContourList : ITcVnContainer;
ipIterator : ITcVnForwardIterator;
ipContour : ITcVnContainer;
fArea : LREAL;
aCenter : TcVnPoint2_LREAL;
Code
// Attention: With other images another color space transformation could be necessary
hr := F_VN_ConvertColorSpace(ipImageIn, ipImageRes, TCVN_CST_Bayer_RG_TO_RGB, hr);
FOR iColor := 0 TO 2 DO
// Apply a "Color-Threshold" on the image
hr := F_VN_CheckColorRange( ipSrcImage := ipImageRes,
ipDestImage := ipImageWorkCol,
aLowerBounds := aColorRefLow[iColor],
aUpperBounds := aColorRefUp[iColor],
hrPrev := hr );
// Find all objects / contours in the black and white image
hr := F_VN_FindContours(ipImageWorkCol, ipContourList, hr);
hr := F_VN_GetForwardIterator(ipContourList, ipIterator, hr);
// Filter the objects by size and draw the contours
WHILE SUCCEEDED(hr) AND_THEN ipIterator.CheckIfEnd() <> S_OK DO
hr := F_VN_GetContainer(ipIterator, ipContour, hr);
hr := F_VN_IncrementIterator(ipIterator, hr);
// Filter contours by size
hr := F_VN_ContourArea(ipContour, fArea, hr);
IF fArea > 5000 THEN
// Draw Results into an Image
hr := F_VN_DrawContours(ipContour, -1, ipImageRes, aColor[iColor], 3, hr);
hr := F_VN_ContourCenterOfMass(ipContour, aCenter, hr);
hr := F_VN_PutText(aColorTxt[iColor], ipImageRes, LREAL_TO_UDINT(aCenter[0])-30, LREAL_TO_UDINT(aCenter[1])+10, TCVN_FT_HERSHEY_PLAIN, 2, aColor[iColor], hr);
END_IF
END_WHILE
END_FOR
Ergebnis
Das Eingangsbild im Bayer RG Format.
Das Eingangsbild wird mit der Funktion F_VN_ConvertColorSpace in ein RGB Bild umgewandelt.
hr := F_VN_ConvertColorSpace(ipImageIn, ipImageRes, TCVN_CST_Bayer_RG_TO_RGB, hr);
Anschließend kann die Funktion F_VN_CheckColorRange mit den jeweiligen oberen und unteren Schwellwerten angewendet werden.
hr := F_VN_CheckColorRange(ipImageRes, ipImageWorkCol, aColorRefLow[iColor], aColorRefUp[iColor], hr);
Das Ergebnisbild, nach anschließender Detektion