Difference between revisions of "CSharp OpenCV"

From Ilianko
 
(23 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
OpenCV is released under a BSD license and hence it’s free for both academic and commercial use. It has C++, C, Python and Java interfaces and supports Windows, Linux, Mac OS, iOS and Android. OpenCV was designed for computational efficiency and with a strong focus on real-time applications. Written in optimized C/C++, the library can take advantage of multi-core processing. Enabled with OpenCL, it can take advantage of the hardware acceleration of the underlying heterogeneous compute platform. Adopted all around the world, OpenCV has more than 47 thousand people of user community and estimated number of downloads exceeding 7 million. Usage ranges from interactive art, to mines inspection, stitching maps on the web or through advanced robotics.
 +
 
==[[EMGU winXP x86|Конфигуриране на OpenCV със C#.]]==
 
==[[EMGU winXP x86|Конфигуриране на OpenCV със C#.]]==
 
*Инсталиране на [http://www.emgu.com EMGU wrapper]
 
*Инсталиране на [http://www.emgu.com EMGU wrapper]
Line 11: Line 13:
 
*References->Add Reference->Browse->C:/EMGU->emgu...->bin->Emgu.CV.dll,Emgu.CV.UI.dll, Emgu.Utils.dll
 
*References->Add Reference->Browse->C:/EMGU->emgu...->bin->Emgu.CV.dll,Emgu.CV.UI.dll, Emgu.Utils.dll
 
*References->Add Reference->.Net->WindowsBase->OK
 
*References->Add Reference->.Net->WindowsBase->OK
[[EMGU настройки#Зависимости]]
+
[[EMGU настройки#Зависимости| и всичко останало]]
 
*C:/EMGU->emgu...->bin->x86->Object of type - exe, dll, ocx) -> преместват се се всички в директорията debug на приложението
 
*C:/EMGU->emgu...->bin->x86->Object of type - exe, dll, ocx) -> преместват се се всички в директорията debug на приложението
 
*Desktop->nvcuda.dll премества се в директорията debug на приложението.
 
*Desktop->nvcuda.dll премества се в директорията debug на приложението.
Line 37: Line 39:
  
 
==Проверка==
 
==Проверка==
Включваме уеб камера, добавяме код, който отваря камерата за четене и проберяваме дали ще се компилира и стартира програмата
+
[[CS уеб камера|Включваме уеб камера, добавяме код, който отваря камерата за четене и проберяваме дали ще се компилира и стартира програмата]]
 
  private Capture cap = new Capture();
 
  private Capture cap = new Capture();
  
 +
==Добавяне PictureBox==
  
 +
[[CS Добавяне PictureBox|От лентата горе дясно toolbox избираме PictureBox и разполагаме елемента във формата.
 +
Задаваме настройка да изпълва цялата площ на формата.]]
  
namespace WindowsFormsApplication1
+
==Визуализиране на кадър==
{
+
[[CS оразмеряване форма|Инициализираме изображение и към във Form1_load добавяме, код за оразмеряване на формата и зареждане на един кадър]]
     public partial class Form1 : Form
+
<code><pre>
 +
private Capture cap = new Capture();
 +
Image<Bgr, byte> frame;
 +
       
 +
     private void Form1_Load(object sender, EventArgs e)
 
     {
 
     {
        public Form1()
+
      this.Size = new System.Drawing.Size(100, 100);
        {
+
      frame = cap.QueryFrame();
            InitializeComponent();
+
      this.Size = frame.Size;
        }
+
      pictureBox1.Image = frame.Bitmap;
 +
    }
 +
</pre></code>
  
        public Rectangle[] ccc;
+
==Генериране събитие на определено време==
        private CascadeClassifier xxx = new CascadeClassifier(@"haarcascade_frontalface_default.xml");
 
        private Size min = new Size(20,20);
 
        private Size max = new Size(300,300);
 
       
 
   
 
        private DispatcherTimer timer = new DispatcherTimer();
 
  
        private void Form1_Load(object sender, EventArgs e)
+
[[CS Времесъбитие|Инициализира се събитие заявка за прекъсване, към Form_load добавяме настройки за изпълението на прекъсването и добавяме метода който ще се изпълнява.]]
        {
+
<code><pre>
 +
private DispatcherTimer timer = new DispatcherTimer();
  
             Image<Bgr, Byte> currentFrame = cap.QueryFrame();
+
private void Form1_Load(object sender, EventArgs e)
             this.Size = currentFrame.Size;
+
{
 +
             this.Size = new System.Drawing.Size(100, 100);
 +
            frame = cap.QueryFrame();
 +
             this.Size = frame.Size;
  
             timer.Tick += new EventHandler(timer_Tick);
+
             timer.Tick += new EventHandler(timer_tick);
 
             timer.Interval = new TimeSpan(0, 0, 0, 0, 35);
 
             timer.Interval = new TimeSpan(0, 0, 0, 0, 35);
 
             timer.Start();
 
             timer.Start();
        }
 
  
        int i = 0;
+
}
        void timer_Tick(object sender, EventArgs e)
+
 
        {
+
  void timer_tick(object sender, EventArgs e)
             Image<Bgr, Byte> currentFrame = cap.QueryFrame();
+
  {
             Image<Gray, Byte> grayFrame = currentFrame.Convert<Gray, Byte>();
+
             frame = cap.QueryFrame();
 +
             pictureBox1.Image = frame.Bitmap;
 +
  }
 +
 
 +
</pre></code>
 +
 
 +
==Добавяне алгоритъм за разпознаване на лица==
 +
[[CS откриване на лица|Към timer_tick ще се добави функционалност за търсене на лица]]
 +
 
  
 +
<code><pre>
 +
        private Rectangle[] faces;
 +
        private Image<Gray, byte> gray;
 +
        private CascadeClassifier faceDetect = new CascadeClassifier("haar.xml");
 +
     
 +
        private Size min = new Size(20, 20);
 +
        private Size max = new Size(300, 300);
  
            if (i > 35 || i == 0)
+
        void timer_tick(object sender, EventArgs e)
            {
+
        {
                ccc = xxx.DetectMultiScale(grayFrame, 1.2, 2, min, max);
+
            frame = cap.QueryFrame();
                i = 0;
+
            gray = frame.Convert<Gray, byte>();
  
             }
+
             faces = faceDetect.DetectMultiScale(gray, 1.2, 2, min, max);
            i++;
 
            foreach (var face in ccc)
 
                currentFrame.Draw(face, new Bgr(0, double.MaxValue, 0), 3);
 
  
             pictureBox1.Image = currentFrame.Bitmap;
+
             foreach (var face in faces)
 +
                frame.Draw(face, new Bgr(0, double.MaxValue, 0), 3);
  
  
 +
            pictureBox1.Image = frame.Bitmap;
 
         }
 
         }
    }
 
}
 
  
4.
+
</pre></code>
 +
 
 +
[[CS Haar|Добавяне на хаар класификатор]]
 +
[[Category:OpenCV]]

Latest revision as of 07:14, 11 February 2015

OpenCV is released under a BSD license and hence it’s free for both academic and commercial use. It has C++, C, Python and Java interfaces and supports Windows, Linux, Mac OS, iOS and Android. OpenCV was designed for computational efficiency and with a strong focus on real-time applications. Written in optimized C/C++, the library can take advantage of multi-core processing. Enabled with OpenCL, it can take advantage of the hardware acceleration of the underlying heterogeneous compute platform. Adopted all around the world, OpenCV has more than 47 thousand people of user community and estimated number of downloads exceeding 7 million. Usage ranges from interactive art, to mines inspection, stitching maps on the web or through advanced robotics.

Конфигуриране на OpenCV със C#.

  • Инсталиране на EMGU wrapper
  • Инсталиране (Repair) на Microsoft Visual C++ 2010 Redistributable Package (x86)

Създаване на проект в C# и добавяне на необходимите библиотеки

  • Start->All Programs->MS VS2010 Express -> MS VS2010 Express
  • File->New Project->Windows Forms Application->OK

EMGU настройки#Референции

  • File->Save
  • References->Add Reference->Browse->C:/EMGU->emgu...->bin->Emgu.CV.dll,Emgu.CV.UI.dll, Emgu.Utils.dll
  • References->Add Reference->.Net->WindowsBase->OK

и всичко останало

  • C:/EMGU->emgu...->bin->x86->Object of type - exe, dll, ocx) -> преместват се се всички в директорията debug на приложението
  • Desktop->nvcuda.dll премества се в директорията debug на приложението.

Добавяне на namespaces

Освен автоматично генерираните

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

Трябва да се добавят използваните от openCV

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using System.Windows.Threading;

Проверка

Включваме уеб камера, добавяме код, който отваря камерата за четене и проберяваме дали ще се компилира и стартира програмата

private Capture cap = new Capture();

Добавяне PictureBox

От лентата горе дясно toolbox избираме PictureBox и разполагаме елемента във формата. Задаваме настройка да изпълва цялата площ на формата.

Визуализиране на кадър

Инициализираме изображение и към във Form1_load добавяме, код за оразмеряване на формата и зареждане на един кадър

 private Capture cap = new Capture();
 Image<Bgr, byte> frame;
         
    private void Form1_Load(object sender, EventArgs e)
    {
       this.Size = new System.Drawing.Size(100, 100);
       frame = cap.QueryFrame();
       this.Size = frame.Size;
       pictureBox1.Image = frame.Bitmap;
    }

Генериране събитие на определено време

Инициализира се събитие заявка за прекъсване, към Form_load добавяме настройки за изпълението на прекъсването и добавяме метода който ще се изпълнява.

 private DispatcherTimer timer = new DispatcherTimer();

 private void Form1_Load(object sender, EventArgs e)
 {
            this.Size = new System.Drawing.Size(100, 100);
            frame = cap.QueryFrame();
            this.Size = frame.Size;

            timer.Tick += new EventHandler(timer_tick);
            timer.Interval = new TimeSpan(0, 0, 0, 0, 35);
            timer.Start();

 }

  void timer_tick(object sender, EventArgs e)
  {
            frame = cap.QueryFrame();
            pictureBox1.Image = frame.Bitmap;
  }

Добавяне алгоритъм за разпознаване на лица

Към timer_tick ще се добави функционалност за търсене на лица


        private Rectangle[] faces;
        private Image<Gray, byte> gray;
        private CascadeClassifier faceDetect = new CascadeClassifier("haar.xml");
       
        private Size min = new Size(20, 20);
        private Size max = new Size(300, 300);

        void timer_tick(object sender, EventArgs e)
        {
            frame = cap.QueryFrame();
            gray = frame.Convert<Gray, byte>();

            faces = faceDetect.DetectMultiScale(gray, 1.2, 2, min, max);

            foreach (var face in faces)
                frame.Draw(face, new Bgr(0, double.MaxValue, 0), 3);


            pictureBox1.Image = frame.Bitmap;
        }

Добавяне на хаар класификатор