Color Similarity mit RGB-Referenz-Farbe
In diesem Beispiel wird über die Funktion F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL die Ähnlichkeit jedes Pixels zu 3 Referenzfarben berechnet und jeweils als Grauwertbild zurückgegeben. Anhand dieser Grauwertbilder werden anschließend die Objekte in den Referenzfarben detektiert.
Variablen
hr : HRESULT;
// Images
ipImageIn : ITcVnImage;
ipImageInDisp : ITcVnDisplayableImage;
ipImageThres : ITcVnImage;
ipImageThresDisp : ARRAY [0..2] OF ITcVnDisplayableImage;
ipImageWorkCol : ITcVnImage;
ipImageWorkColDisp : ARRAY [0..2] OF ITcVnDisplayableImage;
ipImageRes : ITcVnImage;
ipImageResDisp : ITcVnDisplayableImage;
// Color
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] ];
aColorRef : ARRAY[0..2] OF TcVnVector3_LREAL := [ [255, 75, 60], [40, 140, 95], [40, 140, 190] ];
// Contours
ipContourList : ITcVnContainer;
ipIterator : ITcVnForwardIterator;
aOffset : TcVnPoint;
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
// Compute the Color Similarity to a Reference Color
hr := F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL(
ipSrcImage := ipImageRes,
ipDestImage := ipImageWorkCol,
aRefColor := aColorRef[iColor],
fVariance := 0.1,
fLuminanceWeight := 0.2,
hrPrev := hr);
hr := F_VN_Threshold(ipImageWorkCol, ipImageThres, 200, 255, TCVN_TT_Binary, hr);
// Find all objects / contours in the black and white image
hr := F_VN_FindContours(ipImageThres, 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
// Display effect of the Color-Similarity-Function
hr := F_VN_TransformIntoDisplayableImage(ipImageThres, ipImageThresDisp[iColor], hr);
hr := F_VN_TransformIntoDisplayableImage(ipImageWorkCol, ipImageWorkColDisp[iColor], hr);
END_FOR
Ergebnis
Das Eingangsbild im Bayer RG Format
Nach der Konvertierung des Eingangsbildes mit der F_VN_ConvertColorSpace Funktion in ein RGB Bild, kann mit der F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL die Farbähnlichkeit jedes Pixels zur Referenzfarbe ermittelt werden. Im zurück gegebenen Ergebnisbild entspricht:
- der Pixelwert 255 (weiß) einer 100%igen Übereinstimmung mit der Referenzfarbe
- der Pixelwert 0 (schwarz) einer 0%igen Übereinstimmung mit der Referenzfarbe
- und die Pixelwerte zwischen 0 und 255 einer teilweisen Übereinstimmung mit der Referenzfarbe.
// Compute the Color Similarity to a Reference Color
hr := F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL(
ipSrcImage := ipImageRes,
ipDestImage := ipImageWorkCol,
aRefColor := aColorRef[iColor],
fVariance := 0.1,
fLuminanceWeight := 0.2,
hrPrev := hr);
Über einen Schwellwert (F_VN_Threshold) wird anschließend definiert, wie stark die Übereinstimmung zur Referenzfarbe sein soll, um ihr zugeordnet zu werden.
hr := F_VN_Threshold(ipImageWorkCol, ipImageThres, 200, 255, TCVN_TT_Binary, hr);
Das Ergebnisbild, nach anschließender Detektion.