Vytvoríme si projekt v ktorom pridáme do referencie
- Emgu.CV.dll
- Emgu.CV.UI.dll
- Emgu.Util.dll
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
Tieto DLL sa musia nachádzať v tom istom foldry ako je skompilovaný program. Ďalej tam musia byť aj OpenCV dll , kedze emguCV s nimi pracuje. Stiahnuť ich môžeme tu.V mojom projekte je použitá verzia 2.4.0
Teraz prejdime k samotnej detekcii farebného objektu. Načítame testovací obrázok zo súboru. Farbu nebudeme detekovať pomocou RGB ,lebo by nám vznikli rôzne nezmyselné kombinácie RGB. Preto vstupný testovací obrázok prevedieme na HSV model.HSV (Hue, Saturation, Value). Pre detekovanie farieb bude pre nás doležitá zložka H - HUE, ktorá nám udáva farebný tón.
Na našom vstupnom obrázku budeme detekovať modrú farbu , tá ma HUE v rozsahu od 115 do 120 .
Zobrazí všetky modré farby v obrázku, následne obrázok rozmažeme pomocou SmoothGaussian s hodnotou 59 (môže byť aj iná).

V ďalšom kroku nájdeme všetky kruhy v upravenom obrázku. Zadáme min a max hľadaný polomer kruhu.Hotovo.

Výsledok :
Kód v c# :
Gray cannyThreshold = new Gray(30);
Gray accumulatorThreshold = new Gray(1);
Hsv myHSVmin = new Hsv(115, 150, 130);//min modra farba
Hsv myHSVmax = new Hsv(120, 255, 255);//max modra farba
Image<Bgr, Byte> sourceImage1;
Image<Hsv, Byte> sourceImage1HSV;
Image<Gray, Byte> imageInRangeHsv;
MCvFont f = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0);
int i = 0;
//nacitame obrázok
this.openFileDialog1.ShowDialog();
sourceImage1 = new Image<Bgr, Byte>(this.openFileDialog1.FileName);
//Konvertovanie do HSV
sourceImage1HSV = sourceImage1.Convert<Hsv, Byte>();
//nastavenie ROI - Region of Interest (ROI)
// sourceImage1HSV.ROI = new Rectangle(600, 280, 300, 60);
//Prepusti len modru farbu
imageInRangeHsv = sourceImage1HSV.InRange(myHSVmin, myHSVmax);
//rozmazanie,aby sme dostali kruh
imageInRangeHsv = imageInRangeHsv./*Dilate(6).*/SmoothGaussian(59);
CircleF[] circles = imageInRangeHsv.HoughCircles(cannyThreshold,//30
accumulatorThreshold,//50
1,
1000,
200,
500)[0];
foreach (var circle in circles)
{
sourceImage1.Draw("OBJECT " + i++.ToString()+ circle.Radius.ToString(), ref f, new Point((int)circle.Center.X, ((int)circle.Center.Y + 50)), new Bgr(0, 255, 0));
sourceImage1.Draw(circle, //draw circle at detected circular object
new Bgr(Color.Red),
15); //thickness of circle in pixels
}
//vykreslenie do pictureBox
this.pictureBox1.Image = sourceImage1.ToBitmap();
this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
this.pictureBox2.Image = imageInRangeHsv.ToBitmap();
this.pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
Popis metódy HoughCircles :
public Circle<float>[][] HoughCircles( TColor cannyThreshold, TColor accumulatorThreshold, double dp, double minDist, int minRadius, int maxRadius )
Parametre
accumulatorThreshold (TColor) Accumulator threshold.
dp (Double) Rozlíšenie accumulatora .
minDist (Double) Minimálna vzdialenost medzi detekovanými objektami.
minRadius (Int32) Minimálny polomer detekovaného objektu
maxRadius (Int32) Maximálny polomer detekovaného objektu







