2015年1月12日 星期一

期末專題報告

因為對於PYTHON不是很熟
所以利用C#做出一個簡易的手寫辨識
以下是程式碼:

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.Diagnostics;

namespace DigitRecognition
{
    public partial class FormBoard : Form
    {
        Graphics g;
        Pen pen;

        public FormBoard()
        {
            InitializeComponent();
        }

        bool isDrawing = false;
        List<Point> points = new List<Point>();

        private void FormBoard_MouseDown(object sender, MouseEventArgs e)
        {
            points.Add(new Point(e.X, e.Y));
            isDrawing = true;
        }

        private void FormBoard_MouseMove(object sender, MouseEventArgs e)
        {
            if (!isDrawing) return;

            Point point = new Point(e.X, e.Y);
            points.Add(point);
            if (points.Count >= 2)
            {
                g.DrawLine(pen, points[points.Count-2], points[points.Count-1]);
            }
        }

        private void FormBoard_MouseUp(object sender, MouseEventArgs e)
        {
            isDrawing = false;
            Point point = new Point(-1, -1);
            points.Add(point);
        }

        private void buttonRun_Click(object sender, EventArgs e)
        {
            List<Button> seg7buttons = new List<Button>();
            StringBuilder seg7flags = new StringBuilder("0000000");
            seg7buttons.Add(button1);
            seg7buttons.Add(button2);
            seg7buttons.Add(button3);
            seg7buttons.Add(button4);
            seg7buttons.Add(button5);
            seg7buttons.Add(button6);
            seg7buttons.Add(button7);

            foreach (Point p in points)
            {
                Trace.WriteLine(p.ToString());
                for (int i=0; i<seg7buttons.Count; i++) {
                    Rectangle r = seg7buttons[i].Bounds;
                    if (r.Contains(p))
                        seg7flags[i] = '1';
                }
            }
            labelPattern.Text = "樣式為:"+seg7flags.ToString();
            labelAnswer.Text = "辨識結果為:"+checkAnswer(seg7flags.ToString());
        }

        String[] seg7patterns = new String[10] {
            "1111110", // 0
            "0110000", // 1
            "1101101", // 2
            "1111001", // 3
            "0110011", // 4
            "1011011", // 5
            "1011111", // 6
            "1110000", // 7
            "1111111", // 8
            "1111011"  // 9
        };
        String seg7answer="0123456789";
        public char checkAnswer(String seg7flags)
        {
            for (int i = 0; i < seg7patterns.Length; i++)
            {
                if (seg7flags.Equals(seg7patterns[i]))
                    return seg7answer[i];
            }
            return '?';
        }

        private void buttonClear_Click(object sender, EventArgs e)
        {
            points.Clear();
            g.Clear(Color.White);
        }

        private void FormBoard_Load(object sender, EventArgs e)
        {
            g = this.CreateGraphics();
            pen = new Pen(Color.Black, 3);
            buttonClear_Click(this, null);
        }
    }
}

C#之UI:
各數字的辨識形態:









我是利用把拉出來的5個BLOCK
把每個BLOCK定義成各種不同的2位元數
再利用二位元的順序
將各個數字整合
即可達到辨識效果
以下是我的期末專題投影片以及報告: