Wednesday, October 23

Emgu Convert Colour image to Gray,Binary Image

พอดีมีคนถามหาโค๊ด ซึ่งเป็นโค๊ดที่ผมเริ่มศึกษา Emgu ใหม่ๆ (ตอนนี้ ก็ยังใหม่อยู่เหมือนเดิม ;P ) ก็เลยเอามาอัพไว้ที่บล๊อกสักหน่อย

ไม่มีอะไรมากครับ เป็นการโหลด Image เข้ามา แล้วทำการแปลงเป็นภาพ Gray , Binary Image เฉยๆ

Emgu Convert Colour image to Gray,Binary Image

ไลบรารี่ที่ดึงเข้ามาใช้ในโปรเจค

Emgu Convert Colour image to Gray,Binary Image

อันนี้เป็นโค๊ด

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;

using System.IO;
using Emgu.CV;
using Emgu.CV.Structure;


namespace CovertImage
{
    public partial class Form1 : Form
    {
        string imageFileName;
        Image<Bgr, Byte> imageCoverted;
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string extension;
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|All files (*.*)|*.*";
            openFile.FilterIndex = 1;
            openFile.RestoreDirectory = true;
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                extension = Path.GetExtension(openFile.FileName);
                if (extension == ".jpg" | extension == ".gif" | extension == ".bmp")
                {
                    imageFileName = openFile.FileName;
                    Image<Bgr, byte> img = new Image<Bgr, byte>(openFile.FileName);
                    imageCoverted = new Image<Bgr, Byte>(openFile.FileName);
                    pictureBox1.Image = img.ToBitmap(pictureBox1.Width, pictureBox1.Height);
                    pictureBox2.Image = null;
                }
                else
                {
                    pictureBox1.Image = null;
                    pictureBox2.Image = null;
                    MessageBox.Show("File does not supported");
                }

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            processImage(imageCoverted, 0);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            processImage(imageCoverted, 1);
        }

        private void processImage(Image<Bgr,byte> img,int Mode)
        {
            switch (Mode)
            {
                case 0:
                    label2.Text = "Gray";
                    pictureBox2.Image = img.Convert<Gray, byte>().ToBitmap(pictureBox2.Width, pictureBox2.Height);
                    break;
                case 1:
                    label2.Text = "Binary";
                    pictureBox2.Image = img.Convert<Gray, Byte>().ThresholdBinary(new Gray(127), new Gray(255)).ToBitmap(pictureBox2.Width, pictureBox2.Height);
                    break;
            }

        }

        private void toolStripStatusLabel1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://vs-visual-studio.blogspot.com/");
        }
    }
}

ดาวน์โหลดซอร์สโค๊ดและโปรเจค https://dl.dropboxusercontent.com/u/65353188/CovertImage.zip

อ่านเพิ่มเติม...

Saturday, October 19

Seven-segment LED Control for .NET

Seven-segment LED Control for .NET         บางที การแสดงผลตัวเลข แบบ 7-segment บน C# application form ก็ดูดีเหมือนกันนะ ยิ่งถ้าเรากำลังออกแบบหน้าต่างสำหรับงานควบคุม แสดงผล แล้วหล่ะก็ ดูดีเลยทีเดียว

        วันนี้ เรามาติดตั้้ง 7-Segment ลงบน C# win form กันนะครับ พอดี มีคนทำไว้แล้ว เราก็แค่ ดึงมาใช้งานเลย

เริ่มจากดาวน์โหลด ซอร์สโค๊ดมาก่อนครับ จาก CodeProject จากนั้นทำการแตกไฟล์ไว้ที่ไหนก็ได้ เราต้องการแค่ไฟล์ SevenSegment.cs และ ไฟล์ SevenSegmentArray.cs ของเขามาใส่ไว้ที่ toolbox ของเรา

ทีนี้ เรามาสร้างโปรเจคใหม่ บน C# ของเรา ให้เลือกเป็น windows form นะครับ เราจะได้ form เปล่าๆ ขึ้นมา  1 form  ยังไม่ต้องทำอะไร กับมันครับ ให้เราไปคลิกขวาที่ project ของเรา แล้วเลือก Add->Existing Items… แล้วก็เลือกไฟล์ SevenSegment.cs และ ไฟล์ SevenSegmentArray.cs  ที่ดาวน์โหลดมา เอามาไว้ที่โปรเจคของเรา

Seven-segment LED Control for .NET

จากนั้น ก็ไปที่เมนู Build—> Build Solution (F6) ไม่น่าจะมี Error อะไรเกิดขึ้น เพราะเรายังไม่ได้ Coding อะไรเลย น่าจะ success นะครับ จากนั้น ให้สังเกตที่ Toolbox ของเรา จะเกิดกลุ่ม Tab ใหม่ขึ้นมา ชื่อ SenvenSegTest Components

Seven-segment LED Control for .NET

เพียงแค่นี้ เราก็ได้ 7-segment มาไว้ใช้งานบนหน้าฟอร์มของเราแล้วครับ ที่เหลือ ก็แล้วแต่จะโปรแกรมมิ่ง กันเอาเองนะครับ ลองศึกษาดูวิธีการใช้งานจาก source code ที่ดาวน์โหลดมาแล้วกันครับ ไม่น่าจะยากเกินความสามารถกันนะครับ

อ่านเพิ่มเติม...

C# Random number

ปกติก็ใช้ไม่บ่อยนะ แต่เวลาจะใช้ทีไรลืมทุกที ปกติจะใช้เวลาทดสอบโปรแกรม ให้มันสุ่มตัวเลขขึ้นมา แล้วเอาไปแสดงที่หน้า control แต่ด้วยความที่มักจะลืม ก็เลยเขียนไว้ที่บล๊อกซะเลย ดูซิ มึงจะลืม อีกไหม  55555+

ประกาศตัวแปรไว้ใน class project ของเรา เป็นตัวแปร Random

Random num = new Random();

ทีนี้ พอเราจะนำมันไปใช้งาน ก็แค่ สั่งให้มันสุ่มตัวเลขมาให้เรา โดยจะมี 2 เมธอดที่สำคัญคือ

Next และ Double ( 2 ตัวนี้ ก็น่าจะเพียงพอแล้ว )

Random object C#

ถ้าเราต้องการให้มันสุ่มตัวเลขจำนวนเต็ม ตั้งแต่ 0 จนถึง System.Int32.MaxValue เช่น เราต้องการให้มีค่าตั้งแต่ 0 ถึง 1000 เราก็ใช้รูปแบบนี้  num.Next(1000)

หากต้องการสุ่มจำนวนเต็มตั้งแต่ 500 ถึง 1000 ก็ใช้รูปแบบนี้ num.Next(500,1000)

หากเราต้องการสุ่มเลยทศนิยม ก็ใช้ num.NextDouble() มันจะสุ่มตัวเลขระหว่าง 0.0 ถึง 1.0 ซึ่งเป็นตัวเลขชนิด Double

แล้วถ้าอยากได้ค่าอยู่ระหว่า่ง 0.0 ถึง 100.99 หล่ะ ง่ายๆ ก็แค่เอา

num.NextDouble() * 100  แค่นี้ เราก็จะได้ตัวเลขที่ถูกสุ่มมาระหว่าง 0.0 ถึง 1.0 แล้วคูณด้วย 100 

หวังว่า คงไม่ลืมแล้วหล่ะ เขียนเอง อ่านเอง แบบนี้

อ่านเพิ่มเติม...

Saturday, October 5

C# ติดต่อโลกภายนอกด้วย SerialPort Class

     ถึงแม้ว่าคอมพิวเตอร์จะพัฒนาไปไกล จนถึงระดับ 64 บิตแล้วก็ตาม สิ่งหนึ่งที่ยังเป็นที่นิยม ยังมีใช้อยู่ทั่วไปก็คือ พอร์ตอนุกรม โดยเฉพาะในโลก Embedded system แล้ว หากคุณต้องการที่จะรับส่งข้อมูลระหว่างอุปกรณ์ภายนอก และโปรแกรมภายในคอมพิวเตอร์แล้ว พอร์ตอนุกรม หรือ Serial Port ก็ยังเป็นที่นิยมอยู่ ด้วยความที่มันติดต่อกันในรูปแบบที่ไม่ซับซ้อน สามารถเข้าใจได้ง่าย ช่วยให้งานจบได้เร็ว จึงทำให้ทุกวันนี้ เรายังพบเห็นโปรแกรมที่รับส่งข้อมูลทางพอร์ตอนุกรมอยู่ ถึงแม้่ว่าคอมพิวเตอร์บางเครื่องจะไม่มีพอร์ตอนุกรมแล้วก็ตาม เราก็ยังสามารถที่จะใช้ตัวแปลง USB to Serial ทำงานได้เหมือนๆ กัน

C# ติดต่อโลกภายนอกด้วย  SerialPort Class

วันนี้เรามาเขียนโปรแกรมรับส่งข้อมูลทางพอร์ตอนุกรมกันครับ โดยผมจะเขียน application เพื่อรับส่งข้อมูลระหว่างคอมพิวเตอร์ กับ ไมโครคอนโทรลเลอร์ผ่านทาง Serial Port โดยมีเงือนไขดังนี้

MCU ทำการส่งข้อมูลออกไป โดยมีรูปแบบดังนี้  #ADC1,ADC2,ADC3* โดยเราให้

  • # แสดงการเริ่มต้นส่งข้อมูล
  • ADCx ค่าอนาล๊อกที่อ่านได้จากช่อง Analog input ของ MCU มีค่าอยู่ระหว่าง 0-1023
  • * แสดงจุดสิ้นสุดข้อมูล

ซึ่ง Visual C# จะรับข้อมูลแล้วไปประมวลผลตามที่เราออกแบบไว้ จากนั้น Visual C# สามารถส่งข้อมูลออกไปหาที่ตัว MCU ได้ด้วยรูปแบบดังนี้ #Button1,Button2,Button3* โดยเราให้

  • # แสดงการเริ่มต้นส่งข้อมูล
  • Buttonx แสดงค่าสถานะการกดปุ่ม  0:ปุ่มไม่ถูกกด,  1:ปุ่มถูกกด 
  • * แสดงจุดสิ้นสุดข้อมูล

ผมออกแบบหน้าต่างฟอร์มแบบนี้ครับ

C# ติดต่อโลกภายนอกด้วย  SerialPort Class

ในส่วนของโค๊ด

เริ่มจากเราต้อง using System.IO.Ports; เพื่อจะสร้างออปเจค serial port จาก class SerialPort เมื่อเราได้ using เข้ามาแล้ว เราจึงสามารถทีจะสร้างออปเจคได้

serial = new SerialPort(comportComboBox.SelectedItem.ToString(), 9600, Parity.None, 8, StopBits.One);

เราทำการเพิ่ม event handler ให้กับออปเจค เพื่อจะแยกโค๊ดไปเขียนการรับค่าทาง serial port

serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived); // พิมพ์ serial.DataReceived += แล้่วกด Tab 2 ครั้ง โปรแกรม Visual C# ide เขาจะสร้าง method serial_DataReceived  ให้อัตโนมัติ

แล้วผมก็เขียนโค๊ดจัดการการรับข้อมูลใน event handler นี้

void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            string d = serial.ReadLine();

            int intBegin = d.IndexOf("#");

            int intEnd = d.IndexOf("*");

            int length = intEnd - (intBegin+1);

            char[] ch = { ','};

            raw = d;

            data = d.Substring(intBegin + 1, length).Split(ch);

            this.BeginInvoke(new updateAnalogLabel(updateLabel));

        }

ส่วนการอัพเดทตัวเลขที่ได้รับมาไปที่ control ต่างๆบนฟอร์มนั้น เราต้องอาศัย delegate พังก์ชั่นจัดการในส่วนนี้ เพราะในระหว่างที่รับข้อมูลอยู๋นั้น มันไม่มีส่วนไหนของโปรแกรมไปอัพเดทข้อมูลบนฟอร์มเลย เราจึงต้องพึง delegate เพื่อทำ callback ฟังก์ชั่น

private delegate void updateAnalogLabel();

        private void updateLabel()

        {

            analog1Label.Text = data[0];

            analog2Label.Text = data[1];

            analog3Label.Text = data[2];

            serialRecieveTextBox.AppendText(raw);

        }

ในส่วนของการส่งข้อมูลออกจากโปรแกรมไปทาง serial port ที่เราได้ตกลงกันไว้คือ โปรแกรม C# จะทำการส่งสถานะการกดปุ่มบนฟอร์ม เพื่อไปบอกให้ MCU ขับหลอด LED 

private void sendStateButton()

        {

            string s = "#" + Convert.ToInt32(stateButton1).ToString() + "," + Convert.ToInt32(stateButton2).ToString() + "," + Convert.ToInt32(stateButton3).ToString() + "*";

            if (serial != null)

            {

                if (serial.IsOpen)

                {

                    serial.Write(s);

                }

            }

        }

ผมอัพไว้ที่ dropboxแล้ว

https://dl.dropboxusercontent.com/u/65353188/easySerial2013.zip

อ้างอิง : SerialPort Class  , Delegates Tutorial

หรืออ่านเต็มๆ ได้ที่นี่ครับ คลิก

อ่านเพิ่มเติม...
 

แจกฟรี พื้นที่ฝากไฟล์ 2 GB

ads

ติดตามข่าวสารผ่าน Twitter

ติดตาม Blog นี้

About Me

My photo

สวัสดีครับ ชื่อเปิ้ลนะครับ ถ้ามีอะไรให้ช่วยเหลือได้ ก็จะช่วยครับ
ผมได้สร้างบล๊อกไว้ เพื่อเก็บรวบรวมความรู้ และประสบการณ์ในการทำงานครับ แวะไปเยี่ยมชมกันได้ครับ http://mechacity.blogspot.com และบล๊อก http://faker-programmer.blogspot.com ครับ

Blog อื่นๆของฉัน

จำนวนการเยี่ยมชมบล๊อก