piatok, 28 september 2012 10:26 Written by 8785 times
Rate this item
(2 votes)

C# - Detekovanie farebného objektu v obraze pomocou emguCV

Na spracovanie obrazu použijeme OpenCV . Aby sme mohli použit OpenCV v c#,musíme použiť wrapovaciu DLL - EmguCV. Samotné spracovanie obrazu a detekovanie farebného objektu je potom veľmi jednoduché.

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 .

vzor

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

cannyThreshold (TColor)    Najvyšši threshold .

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
Last modified on pondelok, 19 december 2016 21:24
Ing.Jaroslav Vadel

Som zakladateľom www.projectik.eu.

Hrám sa na programátora, ktorý ovláda:

c#,cpp,java,unity3d,php,html,NI testand,NI Vision Builder,Cognex In-Sight,NI LabView

"Naprogramovať program, ktorý funguje vie každy. Ale to, že program funguje ešte neznamena, že je napísany správne "

Website: www.projectik.eu