關於EMGU CV的那些事——1.環境搭建(win8 vs2012 emgucv3.0)

樓主讀研階段研究圖像處理,想用C#實現PTAM/PTAMM算法並用UNITY創建相關應用。對於PTAM(Parallel Tracking and Mapping)算法,使用了大量的第三方庫,實現語言是C/C++。之所以選擇C#,是因爲樓主想要使用Unity將PTAM算法用於AR系統。那麼問題來了,C/C++處理圖像使用Open CV,C#就只能使用Open CV的兄弟Emgu CV了,Emgu CV對Open CV的函數進行了封裝,使其能運行在.net環境中。

首先我們到Emgu CV的官網那個下載最新3.0.0-rc1版本(http://sourceforge.net/projects/emgucv/files/emgucv/),對應封裝的是3.0.0-rc1版本的Open CV。注意我們不需要安裝Open CV!對於普通版和CUDA版,如果你不涉及顯卡編程的話,沒區別。如果需用CUDA或OpenCL對顯卡編程,則需要下載CUDA版。樓主認爲以後的圖像處理,極有可能廣泛應用顯卡編程。

下載完後,安裝或解壓。(樓主機子爲windows 8.1 64位系統,IDE爲VS2012 Update4.)開始配置環境變量。在用戶變量裏新建PATH,裏面填上安裝或解壓後的Emgu目錄下的bin和bin裏的x86和x64。如下圖所示:(32位只需x86,64位需加上x64)


完成後註銷或重啓。打開VS2012,新建一個C# windows窗體應用程序(注意如果想以後使用unity的話,.net framework應該選3.5一下),打開 工具-選擇工具箱項 瀏覽添加Emgu.CV.UI.dll(在bin目錄裏),然後右鍵 解決方案資源管理器裏-引用-添加引用-瀏覽 添加bin目錄下的Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll共五個DLL文件即可完成配置。注意每次新建一個工程都需要這一步。

接下來奉上圖片讀取和灰度處理的代碼:(需在頭部加上using Emgu.CV; using Emgu.Util;)

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;
using Emgu.CV;
using Emgu.Util;

namespace EMGU_STUDY_1._0
{
    public partial class Form1 : Form
    {
        Mat img1 = null;
        Mat img2 = null;
        Mat img3 = null;
        Stopwatch sw = new Stopwatch();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog lvse = new OpenFileDialog();
            lvse.Title = "選擇圖片";
            lvse.InitialDirectory = "";
            lvse.Filter = "圖片文件|*.bmp;*.jpg;*.jpeg;*.gif;*.png";
            lvse.FilterIndex = 1;

            if (lvse.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = null;
                sw.Reset();
                sw.Start();

                img1 = CvInvoke.Imread(lvse.FileName, Emgu.CV.CvEnum.LoadImageType.AnyColor);
                imageBox1.Width = img1.Width / 2;
                imageBox1.Height = img1.Height / 2;
                imageBox1.Image = img1;

                sw.Stop();
                textBox1.Text = sw.ElapsedMilliseconds.ToString();
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (img1 != null)
            {
                img2 = new Mat(img1.Rows, img1.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);
                textBox2.Text = null;
                sw.Reset();
                sw.Start();

                CvInvoke.CvtColor(img1, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
                imageBox2.Width = img2.Width / 2;
                imageBox2.Height = img2.Height / 2;
                imageBox2.Image = img2;

                sw.Stop();
                textBox2.Text = sw.ElapsedMilliseconds.ToString();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox3.Text = null;
            OpenFileDialog lvse = new OpenFileDialog();
            lvse.Title = "選擇圖片";
            lvse.InitialDirectory = "";
            lvse.Filter = "圖片文件|*.bmp;*.jpg;*.jpeg;*.gif;*.png";
            lvse.FilterIndex = 1;
            if (lvse.ShowDialog() == DialogResult.OK)
            {
                sw.Reset();
                sw.Start();

                img3 = CvInvoke.Imread(lvse.FileName, Emgu.CV.CvEnum.LoadImageType.Grayscale);
                imageBox3.Width = img3.Width/2;
                imageBox3.Height = img3.Height/2;
                imageBox3.Image = img3;

                sw.Stop();
                textBox3.Text = sw.ElapsedMilliseconds.ToString();
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            img1 = null;
            img2 = null;
            img3 = null;
            imageBox1.Image = null;
            imageBox2.Image = null;
            imageBox3.Image = null;
            textBox1.Text = null;
            textBox2.Text = null;
            textBox3.Text = null;
        }
    }
}

代碼裏創建裏三個imagebox控件。imagebox1顯示由button1加載的彩色圖片,imagebox2顯示imagebox1中彩色圖片通過灰度處理後的灰度圖片,imagebox3顯示由button3加載的灰度圖片。button2使用的是灰度處理函數CvInvoke.CvtColor(),將已經加載好的彩色圖像轉化爲灰度圖像。button3中直接在加載時就處理爲灰度圖像。 本程序還使用Stopwatch計時器對三個過程進行了計時,分別顯示在對應的textbox裏。

(PS: 對於button2裏的灰度處理過程,第一次運行的時間長達200ms+,之後每次在3ms左右,樓主估計是第一次從庫中檢索並加載灰度處理函數的時間,之後都是直接調用,所以3ms爲灰度處理過程的時間。)

歡迎大家給出意見,共同學習!




未來,屬於一心實現自己預言的人。

--cc 2015/5/27  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章