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