Simple Color Tracking Menggunakan Webcam Dengan Library AForge.NET

Beberapa waktu lalu saat sempat terpikir untuk membuat aplikasi image processing, saya menemukan sebuah library yang saya kira cukup simple untuk diimplementasikan yaitu AForge.NET untuk bahasa C#. Alhamdulillah saat itu ada beberapa perangkat yang tersedia di laboratorium sehigga bisa terealisasi. Berikut uraian saya.

Simple Color Tracking

Abstraksi

Robotics vision adalah salah satu bidang kajian dalam dunia robotika. Salah satu langkah awal untuk memulainya adalah robot mampu mengenali warna. Dalam kesempatan kali ini, robot didisain mampu mengenali warna lalu mengikuti gerak dari warna yang terdeteksi tersebut. Sebagai sensornya digunakan kamera dan aktuator yang digunakan adalah motor servo. Sedangkan otak dari sistem tersebut masih menggunakan PC mengingat harga IC untuk aplikasi real time sangat mahal.

1. Pendahuluan

Penggunaan kamera(digital) dalam dunia robotik dikenal sebagai robotics vision. Seperti halnya pada manusia, kamera dapat didisain sebagai mata pada robot. Dengan mata, robot dapat lebih leluasa “melihat” lingkungannya sebagaimana manusia.

Dalam dua dasawarsa terakhir ini tenologi robotics vision berkembang sangat pesat. Kemajuan ini dicapai berkat perkembangan teknologi IC yang makin kompak dan cepat, dan kemajuan di bidang komputer (sebagai pengolah), baik perangkat keras maupun perangkat lunak. Teknologi optiknya pada dasarnya masih tetap menggunakan teknik yang telah berkembang sejak lebih dari 100 tahun yang lalu, yaitu penggunaan konfigurasi lensa cembung dan cekung.

2. Deteksi Warna

Ada banyak metode yang bisa digunakan untuk dapat mendeteksi warna menggunakan kamera. Diantaranya adalah dengan menggunakan Euclidean Color Filtering. Filter ini memfilter piksel-piksel pada gambar yang berada – di dalam/di luar – dari lingkup RGB (Red Green Blue) dengan pusat dan radius terntentu. Filter tersebut membiarkan piksel-piksel dengan warna yang berada – di dalam/di luar –  dari lingkup yang telah ditentukan dan mengisi sisanya dengan warna tertentu.

Setelah warna difilter maka untuk menghasilkan gambar yang lebih baik maka digunakan Erosion dan Dilatation. Erosion memberikan nilai minimum di sekitar piksel-piksel untuk setiap piksel dari citra hasil. Di sekitar piksel-piksel yang harus diproses, ditentukan oleh penataan elemen: 1 – untuk memproses tetangga piksel tersebut, -1 – untuk melewatinya. Filter sangan berguna terutama untuk pengolahan citra biner. Dimana filter ini menghapus piksel yang tidak dikelilingi dengan jumlah tertentu tetangganya. Ini memberi kemampuan untuk menghapus piksel nois (piksel yang berdiri sendiri) atau menyusutkan objek.

Dilatation, filter ini menetapkan nilai maksimum sekitar piksel untuk setiap piksel dari citra hasil. Di sekitar piksel-piksel yang harus diproses, yang ditentukan oleh penataan elemen: 1 – untuk memproses tetangga, -1 – untuk melewatinya. Filter ini berguna untuk pengolahan citra biner, di mana memungkinkan untuk melebarkan objek terpisah atau menggabungkan objek.

1. Diagram Alur

Input Gambar (dari webcam) –> Konversi data gambar ke dalam bentuk Bitmap (PC) –> Euclidean Color Filtering (PC) –> Erosion (PC) –> Dilatation (PC) –> Deteksi koordinat warna (PC) –> Pengiriman data ke mikrokontroler (PC – mikrokontroler) –> pengontrolan servo oleh mikrokontroler (mikrokontroler).

2. Pemograman

Untuk pemograman digunakan software Visual Studio 2008 dengan menggunakan bahasa C#. Alasan menggunakan bahasa C# adalah karena tersedianya library yang cocok bagi perancang, yaitu AForge.net. Pemograman pada VS 2008 dilakukan dengan menggunakan GUI. Selain itu, digunakan pula software CodeVision AVR sebagai compiler untuk mikrokontroler yang akan mengontrol servo secara mandiri.

3. Sistem Antarmuka PC – Mikrokontroler

Pengiriman data dari PC ke Mikrokontroler menggunakan RS232 dengan Baudrate disesuaikan. Jika posisi warna terdeteksi berada pada koordinat (0,0).

Jika posisi warna terdeteksi tidak berada pada koordinat (0,0).

4. Percobaan

Percobaan dilakukan dengan sejumlah warna. Objek berwarna tersebut digerak-gerakan di depan perangkat webcam-servo yang mempunyai 2 DOF (Degrees Of Freedom). Dengan sumbu Z sekitar 1800 dan sumbu X sekitar 600.

5. Hasil Percobaan

Robot mampu mengikuti arah objek. Jika robot kehilangan objek, maka robot akan bergerak ke arah saat objek terakhir terdeteksi. Proses deteksi warna ini masih terpengaruh oleh intensitas cahaya.

6. Kesimpulan

Kamera dapat mengikuti arah gerak dari objek berwarna yang telah ditentukan walaupun masih terdapat kekurangan pada algoritma juga pada  perancangan software dan hardware.

7. Daftar Pustaka

[1] Aforge.NET-Framework-Documentaion

[2] Lee, Wei-Meng, Practical .NET 2.0 Networking Projects, Apress, 2007.

[3] Pitowarno, Endra, Robotika Desain, Kontrol, dan Kecerdasan Buatan, Andi, Yogyakarta, 2006.

[4] www.aforgenet.com

[5] www.codeproject.com

[6] www.msdn.microsoft.com

8. Lampiran


Gambar 1. Tampilan software.

Gambar 2. Tampilan setting Euclidean Color Filter. Gambar 3. Foto Perangkat.

Berikut installer demo software simple color tracking.
http://www.mediafire.com/file/304priwevhameq0/simple%20color%20tracking.rar

Berikut beberapa link referensi lainnya.

http://www.aforgenet.com/articles/step_to_stereo_vision/

http://www.aforgenet.com/articles/lego_pan_tilt_camera/

Berikut Schematic untuk rangkaian kontroler servo.

Berikut link yang bisa didownload yang berisi PCB Project EAGLE beserta firmware (.hex) untuk attiny2313 berdasarkan schematic di atas.

http://www.mediafire.com/file/mqdrsjj3qoc7777/Color_Tracking-wangready.wordpress.com.rar

________________________________________________________________________________________

Update Servo Controller dengan Fuzzy Control System LINK.
________________________________________________________________________________________

project file http://www.mediafire.com/download/rap5garamf1peb9/P3_simple_color_tracking.rar

5 Responses to Simple Color Tracking Menggunakan Webcam Dengan Library AForge.NET

  1. Jayadi says:

    Wuihhhh… Mantap banget bro.

    Btw, gw belum ngerti pakai software VS sama AForge.Net.
    Bro,,, tp bisa minta source program C servonya ga bro?
    Pakai serial Rx kan…? Mikronya pakai mikro apa bro?

    Kirim ke email gw ya bro…
    my_w0rld_23@yahoo.com

    Thanks banget bro…

    • wangready says:

      Terima kasih telah mengunjungi blog saya. Postingan ini sudah saya update pada 9/4/2011, mas. Jadi untuk code, silakan download pada link di atas. Iya, komunikasinya pake serial Rx-nya saja. Mikro yang digunakan ATTiny2313.

  2. wangready says:

    Kode kira2 untuk kotrol servo satu sumbu saja menggunakan proportional control. Tp belum diuji.
    PSEUDO CODE
    ___________________________________________________________
    .
    .
    .
    . //kode lainnya
    .
    .
    .

    #include

    #define port_dir DDRB.3 //pendefinisian port direction
    #define pulse_servo PORTB.3 //pendefinisian port pulsa servo
    #define HIGH 1 //HIGH = 1
    #define LOW 0 //LOW = 0

    void my_delay_us(int n); //deklarasi prosedur my_delay_us();

    void main(void)
    {
    int Kp = 10; //set nilai Konstanta proportional,
    //dikalibrasi sampai servo bergerak dengan halus
    int error; //error dari posisi
    int set_point = 4; //set nilai set_point (posisi yang diinginkan)
    int pos_update; //variabel posisi dari kamera
    int pos_act; //posisi yang harus dicapai
    int delay_servo = 1500; //nilai dari delay servo, nilai awal(tengah, 1500us)

    port_dir = 1;

    .
    .
    .
    . //kode lainnya
    .
    .
    .

    while(1)
    {
    pos_update = (int)getchar(); //terima data dari PC (range 0-9)
    error = set_point – pos_update;
    pos_act = error * Kp;
    delay_servo += pos_act; //nilai posisi yang harus dicapai
    //jika arah servo terbalik, maka tanda (+) diganti (-)

    if(delay_servo > 20000) delay_servo = 20000; //Set nilai maximum delay posisi servo
    if(delay_servo < 300) delay_servo = 300; //Set nilai minimum delay posisi servo

    pulse_servo = HIGH;
    my_delay_us(delay_servo);
    pulse_servo = LOW;
    my_delay_us(20000 – delay_servo);
    };

    }

    void my_delay_us(int n)
    {
    while(n–)
    {
    delay_us(1);
    }
    }

  3. lia says:

    gan kalau mau mendeteksi warna barang, misal merah ya semua warna merah kedeteksi itu gimana caranya gan?? kasih source codenya ya.. aku pake c# ma Aforge juga

    • wangready says:

      ini link referensi, saya belajar dari sini :
      https://vimeo.com/7526663 klo yang link vimeo ini adalah link video tutorial, tutorial nya bagus, tentang akuisisi webcam, recommended
      http://www.aforgenet.com/articles/step_to_stereo_vision/
      http://www.aforgenet.com/articles/lego_pan_tilt_camera/
      ini posting saya tentang akuisisi gambar webcam
      https://wangready.wordpress.com/2011/10/09/akuisisi-gambar-dari-webcam-menggunakan-aforge-net-library-berbasis-bahasa-c/

      ini kode saya, saya coba aplikasikan library AForge.NET buat filter warna deteksi garis

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Drawing.Imaging;
      using System.Linq;
      using System.Text;
      using System.Windows.Forms;
      using System.Threading;
      using System.IO;
      using System.Reflection;

      using AForge;
      using AForge.Controls;
      using AForge.Math;
      using AForge.Math.Geometry;
      using AForge.Imaging;
      using AForge.Imaging.Filters;
      using AForge.Video;
      using AForge.Video.DirectShow;

      namespace P3
      {
      public partial class Form1 : Form
      {

      private bool DeviceExist = false;
      private FilterInfoCollection videoDevices;
      private VideoCaptureDevice videoSource = null;
      // object coordinates in both cameras
      private float x1, y1;

      public Form1()
      {
      InitializeComponent();
      }

      //prevent sudden close while device is running
      private void Form1_FormClosed(object sender, FormClosedEventArgs e)
      {
      CloseVideoSource();
      }

      // get the devices name
      private void getCamList()
      {
      try
      {
      videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
      comboBox1.Items.Clear();
      if (videoDevices.Count == 0)
      throw new ApplicationException();

      DeviceExist = true;
      foreach (FilterInfo device in videoDevices)
      {
      comboBox1.Items.Add(device.Name);
      }
      comboBox1.SelectedIndex = 0; //make dafault to first cam
      }
      catch (ApplicationException)
      {
      DeviceExist = false;
      comboBox1.Items.Add(“No capture device on your system”);
      }
      }

      private void button1_Click_1(object sender, EventArgs e)
      {
      getCamList();
      }

      private void button2_Click_1(object sender, EventArgs e)
      {
      if (DeviceExist)
      {
      videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
      videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
      CloseVideoSource();
      //videoSource.DesiredFrameRate = 10;
      videoSource.DesiredFrameSize = new Size(160, 120);
      videoSource.Start();
      label2.Text = “Perangkat bekerja…”;
      timer1.Enabled = true;
      label6.Text = “Sebelum Difilter”;
      label7.Text = “Sesudah Difilter”;
      button2.Enabled = false;
      button3.Enabled = true;
      }
      else
      {
      label2.Text = “Error: Tidak ada perangkat yang dipilih.”;
      }

      }

      //eventhandler if new frame is ready
      private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
      {
      Bitmap img = (Bitmap)eventArgs.Frame.Clone();
      Bitmap img2 = (Bitmap)eventArgs.Frame.Clone();

      // create filter
      SaturationCorrection filterst = new SaturationCorrection(1);
      // apply the filter
      filterst.ApplyInPlace(img);

      // create filter
      ColorFiltering filtercr = new ColorFiltering();
      // set color ranges to keep
      filtercr.Red = new IntRange(185, 255);
      filtercr.Green = new IntRange(0, 171);
      filtercr.Blue = new IntRange(0, 239);
      filtercr.FillOutsideRange = true;
      // apply the filter
      filtercr.ApplyInPlace(img);

      Bitmap filteredBmp2 = img;

      // create filter
      Dilatation filterDI = new Dilatation();
      // apply the filter
      filterDI.Apply(filteredBmp2);

      // create filter
      Dilatation filterDI2 = new Dilatation();
      // apply the filter
      filterDI2.Apply(filteredBmp2);

      // create filter
      Dilatation filterDI3 = new Dilatation();
      // apply the filter
      filterDI3.Apply(filteredBmp2);

      // create filter
      Dilatation filterDI4 = new Dilatation();
      // apply the filter
      filterDI4.Apply(filteredBmp2);

      // create filter
      Dilatation filterDI5 = new Dilatation();
      // apply the filter
      filterDI5.Apply(filteredBmp2);
      /*
      // create filter
      *
      *
      *
      * penting cuy, sateuacan krop
      *
      *
      *
      EuclideanColorFiltering filtereu = new EuclideanColorFiltering();
      // set center colol and radius
      filtereu.CenterColor = new RGB(234, 210, 219);
      filtereu.Radius = 144;
      // apply the filter
      filtereu.ApplyInPlace(img);

      // create filter
      YCbCrLinear filter = new YCbCrLinear();
      // configure the filter
      filter.InY = new DoubleRange(0.5, 0.5);
      filter.InCb = new DoubleRange(-0.15, 0.05);
      filter.InCr = new DoubleRange(0.05, 0.200);
      // apply the filter
      filter.ApplyInPlace(img);

      Grayscale GF = new Grayscale(0.2125, 0.7154, 0.0721);
      Bitmap GSampleImage = GF.Apply(img);

      // create filter
      Erosion3x3 filterER = new Erosion3x3();
      // apply the filter
      filterER.Apply(GSampleImage);

      // create filter
      Dilatation3x3 filterDI = new Dilatation3x3();
      // apply the filter
      filterDI.Apply(GSampleImage);

      // create filter
      Threshold filterT = new Threshold(154);
      // apply the filter
      filterT.ApplyInPlace(GSampleImage);
      // create filter*/
      Bitmap oke2 = img;

      // create blob counter and configure it
      BlobCounter blobCounter = new BlobCounter();
      blobCounter.MinWidth = 20; // set minimum size of
      blobCounter.MinHeight = 20; // objects we look for
      blobCounter.FilterBlobs = true; // filter blobs by size
      blobCounter.ObjectsOrder = ObjectsOrder.Size; // order found object by size
      // locate blobs
      blobCounter.ProcessImage(oke2);
      Rectangle[] rects = blobCounter.GetObjectsRectangles();
      // draw rectangle around the biggest blob
      if (rects.Length > 0)
      {
      objectRect = rects[0];
      Graphics g = Graphics.FromImage(oke2);

      using (Pen pen = new Pen(Color.FromArgb(160, 255, 160), 3))
      {
      g.DrawRectangle(pen, objectRect);
      }

      g.Dispose();
      // calculate X,Y coordinates of object’s center
      x1 = (objectRect.Left + objectRect.Right – oke2.Width) / 2;
      y1 = (oke2.Height – (objectRect.Top + objectRect.Bottom)) / 2;

      Crop filter = new Crop(new Rectangle((int)objectRect.Left, (int)objectRect.Top, (int)(objectRect.Right – objectRect.Left), (int)(objectRect.Bottom – objectRect.Top)));
      // apply the filter
      newImage = filter.Apply(img2);
      }

      // create filter
      ColorFiltering filtereu2 = new ColorFiltering();
      // set color ranges to keep
      filtereu2.Red = new IntRange(0, 129);
      filtereu2.Green = new IntRange(0, 97);
      filtereu2.Blue = new IntRange(0, 105);
      filtereu2.FillColor = new RGB(255, 255, 255);
      filtereu2.FillOutsideRange = false;
      // apply the filter
      filtereu2.ApplyInPlace(newImage);

      /*
      Grayscale GF = new Grayscale(0.2125, 0.7154, 0.0721);
      Bitmap GSampleImage2 = GF.Apply(newImage);

      // create filter
      Erosion3x3 filterER = new Erosion3x3();
      // apply the filter
      filterER.Apply(GSampleImage2);

      // create filter
      Dilatation3x3 filterDI = new Dilatation3x3();
      // apply the filter
      filterDI.Apply(GSampleImage2);

      // create filter
      Threshold filterT = new Threshold(154);
      // apply the filter
      filterT.ApplyInPlace(GSampleImage2);

      Bitmap myBitmap = new Bitmap(GSampleImage2);
      for (int Xcount = 0; Xcount < myBitmap.Width; Xcount++)
      {
      for (int Ycount = 0; Ycount 0)
      {
      for (int i = 0; i 0)
      {
      serialPort1.Write(“1”);
      switch (Convert.ToInt32(x1 * 10))
      {
      case 1: serialPort1.Write(“1”);
      break;
      case 2: serialPort1.Write(“2”);
      break;
      case 3: serialPort1.Write(“3”);
      break;
      case 4: serialPort1.Write(“4”);
      break;
      case 5: serialPort1.Write(“5”);
      break;
      case 6: serialPort1.Write(“6”);
      break;
      case 7: serialPort1.Write(“7”);
      break;
      case 8: serialPort1.Write(“8”);
      break;
      case 9: serialPort1.Write(“9”);
      break;
      }
      }
      else if (Convert.ToInt32(x1 * 10) 0)
      {
      serialPort1.Write(“1”);
      switch (Convert.ToInt32(y1 * 10))
      {
      case 1: serialPort1.Write(“1”);
      break;
      case 2: serialPort1.Write(“2”);
      break;
      case 3: serialPort1.Write(“3”);
      break;
      case 4: serialPort1.Write(“4”);
      break;
      case 5: serialPort1.Write(“5”);
      break;
      case 6: serialPort1.Write(“6”);
      break;
      case 7: serialPort1.Write(“7”);
      break;
      case 8: serialPort1.Write(“8”);
      break;
      case 9: serialPort1.Write(“9”);
      break;
      }
      }
      else if (Convert.ToInt32(y1 * 10) < -0)
      {
      serialPort1.Write("2");
      switch (Convert.ToInt32(y1 * 10))
      {
      case -1: serialPort1.Write("1");
      break;
      case -2: serialPort1.Write("2");
      break;
      case -3: serialPort1.Write("3");
      break;
      case -4: serialPort1.Write("4");
      break;
      case -5: serialPort1.Write("5");
      break;
      case -6: serialPort1.Write("6");
      break;
      case -7: serialPort1.Write("7");
      break;
      case -8: serialPort1.Write("8");
      break;
      case -9: serialPort1.Write("9");
      break;
      }
      }
      else
      {
      serialPort1.Write("3");
      }
      serialPort1.Write("E");//end data
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.ToString());
      }
      }
      }
      }

      private void button3_Click(object sender, EventArgs e)
      {
      if (DeviceExist)
      {
      timer1.Enabled = false;
      CloseVideoSource();
      label2.Text = "Perangkat berhenti.";
      button2.Enabled = true;
      button3.Enabled = false;
      }
      }

      private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
      {
      if (DeviceExist)
      {
      timer1.Enabled = false;
      CloseVideoSource();
      }
      }

      private void Form1_Load(object sender, EventArgs e)
      {
      kondisi_form2 = 0;

      this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);

      string[] portNames = System.IO.Ports.SerialPort.GetPortNames();
      for (int i = 0; i <= portNames.Length – 1; i++)
      {
      cbbCOMPorts.Items.Add(portNames[i]);
      }
      btnDisconnect.Enabled = false;
      button2.Enabled = true;
      button3.Enabled = false;
      try
      {
      // Compose a string that consists of three lines.
      // Read the file as one string.
      System.IO.StreamReader myFile = new System.IO.StreamReader("c:\\eirrg.dat");
      string in_red = myFile.ReadLine();
      string in_green = myFile.ReadLine();
      string in_blue = myFile.ReadLine();
      string in_radius = myFile.ReadLine();

      myFile.Close();

      try
      {
      int buf_red = int.Parse(in_red);
      Form2.red = Convert.ToByte(buf_red);
      }
      catch
      {
      }

      try
      {
      int buf_green = int.Parse(in_green);
      Form2.green = Convert.ToByte(buf_green);
      }
      catch
      {
      }

      try
      {
      int buf_blue = int.Parse(in_blue);
      Form2.blue = Convert.ToByte(buf_blue);
      }
      catch
      {
      }

      try
      {
      int buf_radius = int.Parse(in_radius);
      Form2.radius = buf_radius;
      }
      catch
      {
      }
      }
      catch (IOException)
      {
      string lines = 255 + "\r\n" + 60 + "\r\n"
      + 60 + "\r\n" + 92;

      System.IO.StreamWriter File = new System.IO.StreamWriter("c:\\eirrg.dat");
      File.WriteLine(lines);
      File.Close();
      }

      }

      private void btnConnect_Click(object sender, EventArgs e)
      {
      //—close the serialport if it is open—
      if (serialPort1.IsOpen)
      {
      serialPort1.Close();
      }
      try
      {
      //—configure the various parameters of the serial
      // port—
      serialPort1.PortName = cbbCOMPorts.Text;
      serialPort1.BaudRate = Convert.ToInt32(Baudrate.Text);
      serialPort1.Parity = System.IO.Ports.Parity.None;
      serialPort1.DataBits = 8;
      serialPort1.StopBits = System.IO.Ports.StopBits.One;
      //—open the serial port—
      serialPort1.Open();
      //—update the statusof the serial port and
      // enable/disable the buttons—
      btnConnect.Enabled = false;
      btnDisconnect.Enabled = true;
      label5.Text = cbbCOMPorts.Text + " connected.";
      }
      catch (Exception)
      {
      label5.Text = "Port serial belum di-setting.";
      }
      }

      private void btnDisconnect_Click(object sender, EventArgs e)
      {
      try
      {
      //—close theserial port—
      serialPort1.Close();
      //—update the status of the serial port and
      // enable/disable the buttons—
      label5.Text = serialPort1.PortName + " disconnected.";
      btnConnect.Enabled = true;
      btnDisconnect.Enabled = false;
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.ToString());
      }
      }

      private void button4_Click(object sender, EventArgs e)
      {
      if (serialPort1.IsOpen)
      {
      try
      {
      x1 = 0;
      y1 = 0;
      serialPort1.Write("R");//reset
      serialPort1.Write("E");//end data
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.ToString());
      }
      }
      }

      private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
      {
      MessageBox.Show("EIRRG Student Research Project (No Commercial)" + Environment.NewLine
      +"Subject: Robot Vision" + Environment.NewLine
      +"———————————————-" + Environment.NewLine
      +"by Endang Rusiana/115070074" + Environment.NewLine
      +"EIRRG Laboratory" + Environment.NewLine
      +"Intsitut Teknologi Telkom" + Environment.NewLine
      +"Bandung, Indonesia" + Environment.NewLine
      +"2010",
      "Author information",
      MessageBoxButtons.OK,MessageBoxIcon.Information);
      }

      public static int kondisi_form2;
      private void euclideanColorFilterToolStripMenuItem_Click(object sender, EventArgs e)
      {
      if (kondisi_form2 == 0)
      {
      Form2 form2 = new Form2();
      form2.Show();
      }
      }
      }
      }

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s