2016年1月1日 星期五

C# - 影像處理圖片截圖並與原圖匹配找相同部份再繪矩形標示

練習:
  • 截取圖片 crop()
  • 詳細模板匹配 ExhaustiveTemplateMatching()
  • 繪出矩形 Drawing.Rectangle()
  • 加入 Stopwatch() 碼表計數影像處理時間。
說明:
  • 以 crop() 方法截圖,再使用 ExhaustiveTemplateMatching() 比對原圖與截圖兩者相同處,最後用 Drawing.Rectangle() 繪製矩形至原圖來標示所截圖的位置。
  • ExhaustiveTemplateMatching() 需要花用較多的處理時間,本文用兩圖測試花了:3分23秒、52秒。
##ReadMore##

Step1. 檔案 → 新增專案 → Windows Form 應用程式 → 拉物件 Form1.cs[設計] → 撰寫 Form1.cs

Step2. 方案總管 → 參考 → 右鍵加入參考 → 瀏灠(預設路徑) C:\Program Files (x86)\AForge.NET\Framework\Release → 加入參考:
  • AForge.Imaging.dll 
  • AForge.Imaging.Formats.dll

Step3. Windows Form 拉入需要工具:
  • pictureBox × 3
  • button × 3 
  • textBox × 2
  • Label × 2
  • openFileDialog × 1

Step4. Coding
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.Drawing.Imaging;
using System.Diagnostics;
using AForge.Imaging;
using AForge.Imaging.Formats;
using AForge.Imaging.Filters;

namespace CropAndMatch
{
    public partial class Form1 : Form
    {
        Bitmap sourceImage, templateImage;
        Stopwatch stopWatch = new Stopwatch();

        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "所有檔案(*.*)|*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                sourceImage = ImageDecoder.DecodeFromFile(openFileDialog1.FileName);
                pictureBox1.Image = sourceImage;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Crop filter = new Crop(new Rectangle(100, 150, 128, 128));
            templateImage = filter.Apply(sourceImage);
            pictureBox3.Image = templateImage;

            
        }

        private void button3_Click(object sender, EventArgs e)
        {
            stopWatch.Reset();
            stopWatch.Start();
            // create template matching algorithm's instance
            ExhaustiveTemplateMatching tm = new
            ExhaustiveTemplateMatching(0.99f);
            // find all matchings with specified above similarity
            

            TemplateMatch[] matchings = tm.ProcessImage(sourceImage, templateImage);
            // highlight found matchings
            BitmapData data = sourceImage.LockBits(
            new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
            ImageLockMode.ReadWrite, sourceImage.PixelFormat);
            foreach (TemplateMatch m in matchings)
            {
                Drawing.Rectangle(data, m.Rectangle, Color.White);

                textBox2.Text = m.Rectangle.Location.ToString();
                // do something else with matching
            }
            sourceImage.UnlockBits(data);
            pictureBox2.Image = sourceImage;
            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            textBox1.Text = ts.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

沒有留言:

張貼留言