1. 程式人生 > >Emgu Cv配置--VS2010、C#、Emgu CV配置

Emgu Cv配置--VS2010、C#、Emgu CV配置

以下是對Emgu Cv的配置及測試

一 配置Emgu CV

在VS2010(VC10)中配置能使用C#開發語言呼叫Open CV視覺庫的方法如下。眾所周知,能供C#使用的OpenCV庫叫:Emgu CV。注意用C#開發的話,是不需要單獨安裝OpenCV的,emgu cv內已經包含!!

————————————————————————————————

最近有網友說,emguCV的官網已經打不開,估計看來是被國內防火牆限制了,如果需要安裝包的,可以傳送郵件到我的郵箱,我線上的話,會盡快傳送軟體給大家。

實在搞不定,加我百度hi:mvp_xuan,或傳送郵件到:[email protected]

3.com。

OpenCV2.3在C/C++開發環境下的配置

——————————————————————————————

1、下載Emgu CV的x86安裝版

2、安裝

    雙擊安裝檔案,一路下一步、我同意,預設配置安裝到C盤即可;

3、設定環境變數(設定之後需重啟計算機或登出):

PATH(新增如下一行;如無PATH,可自行新建;如修改了Emcu CV的預設安裝路徑,請自行修改成相應路徑):

C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin

有網友說,最新版本的Emgucv,設定環境變數Path時略有不同,dll在bin的子資料夾x86裡面,例:

   <安裝路徑>\emgucv-windows-x86 2.4.0.1717\bin\x86

————————————————————————————————

注意:以下步驟,是每次新建專案之後都必須進行的操作。

————————————————————————————————

4、新建專案

    新建一個解決方案,並建立一個基於C#下的Windows窗體應用程式的專案:

5、匯入UI外掛

    點選“工具(T)” -> “選擇工具箱項(X)…” ,在新開啟的視窗中選擇:“.NET Framework元件”,點選“瀏覽”,到目錄:C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin下,雙擊Emgu.CV.UI.dll即可。

    看到如圖四項之後,點選確定即可。

6、新增引用

    右鍵單擊“解決方案資源管理器”中剛才所建專案下的“引用”,選擇“新增引用”;在新彈出的視窗中選擇“瀏覽”,到目錄:C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin下,選擇:Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll等共五個DLL檔案,並點選確定加入。如下圖所示即可:

————————————————————————————————

    如上,已經完成所有配置,如果有特殊用途,需要呼叫到其他的DLL中的方法,請自行在bin目錄下,將相應DLL檔案引用到專案中即可。

    在網上down一些簡單demo的程式碼,copy到專案中,即可驗證配置是否成功了。

————————————————————————————————

常見錯誤解決方案:

1、如遇錯誤提示:tbb_debug.dll找不到

    請下載安裝Intel TBB庫,需要將tbb庫或dll檔案所在路徑,配置帶系統環境變數path中。

2、如遇錯誤提示:“Emgu.CV.CvInvoke”的型別初始值設定項引發異常

    (1)、登出或重啟計算機,使得系統環境變數中的path生效;

    (2)、通過path中設定的路徑去尋找對應的dll檔案,檢視是否存在,是否被成功引用到VS中;

    (3)、copy dll檔案到debug和release目錄中。
    (4)、嘗試將.Net FrameWork版本降低,如果是4.0的就降低到3.5,如果是3.5的就降低到2.0。

二  測試Emgn cv

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 Emgu.CV;//PS:呼叫的Emgu dll
using Emgu.CV.Structure;
using Emgu.Util;
using System.Threading;

namespace Emgu1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Capture capture;
        private bool captureinprocess;//判斷攝像頭的狀態

        private void button1_Click(object sender, EventArgs e)
        {
            if (capture != null)//攝像頭不為空
            {
                if (captureinprocess)
                {
                    Application.Idle -= new EventHandler(processfram);
                    button1.Text = "Stop!";
                }
                else
                {
                    Application.Idle += new EventHandler(processfram);
                    button1.Text = "Start!";
                }
                captureinprocess = !captureinprocess;
            }
            else//攝像頭為空則通過Capture()方法呼叫
            {
                try
                {
                    capture = new Capture();
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
        }

        private void processfram(object sender, EventArgs arg)
        {
            Image<Bgr, Byte> frame = capture.QueryFrame();
            imageBox1.Image = frame;
        }
    }
}

三 其它較好的測試

2011/05/17 在 Visual Studio 2010 使用 OpenCV 對於 WebCam 有問題的話,請參考以下連結

一、簡介

以前研究所的時候,有使用 VC.NET 配合 OpenCV 做影像處理,這東西相當讚,可以省去不少開發時間,今天嘗試看看如何在 Visual C# 2008 上使用 OpenCV。

1. 什麼是 OpenCV
OpenCV是Intel®開源電腦視覺庫。它由一系列 C 函式和少量 C++ 類構成,實現了影象處理和電腦視覺方面的很多通用演演算法。

2. OpenCV 重要特性
OpenCV 擁有包括 300 多個C函式的跨平臺的中、高層 API。它不依賴於其它的外部庫——儘管也可以使用某些外部庫。
OpenCV 對非商業應用和商業應用都是免費(FREE)的。(細節參考 license)。
OpenCV 為Intel® Integrated Performance Primitives (IPP) 提供了透明介面。 這意味著如果有為特定處理器優化的的 IPP 庫, OpenCV 將在執行時自動載入這些庫。 更多關於 IPP 的資訊請參考:http://www.intel.com/software/products/ipp/index.htm

3. 體驗 OpenCV 的魅力

看了以上對OpenCV的介紹,還是不知道OpenCV在做什麼的話,可以先看這段影片,影片的成果是透過 OpenCV 所撰寫而成。

二、方法

1. 下載與安裝 OpenCV

要使用 OpenCV,首先必須要下載並且安裝,點這裡下載 OpenCV_1.1pre1a.exe,下載後執行安裝,安裝過程幾乎都是點選下一步,在此需記住安裝目錄為何,預設為 C:\Program Files\OpenCV。

2. 下載與安裝 EmguCV

EmguCV 封裝了 OpenCV image processing library,而且可在.Net平臺使用,因此在本文中,透過EmguCV,讓我們可以在 Visual C# 2008 中使用OpenCV。

點選這裡下載 Emgu.CV.Binary-1.5.0.1.zip,下載完成後,解壓縮檔案可看EmguCV的DLL檔;我將此目錄放到 C:\Program Files\OpenCV,解壓縮後的檔案只要自己記得就好,因為之後要將這些檔案加入參考。

(1) 下載網頁部份

(2) 下載後解壓縮檔案

3. 新增專案,並且加入相關的參考

先 [ 新增專案 ] -> [ Visual C# ] -> [ WIndows Form 應用程式 ],接著將上個步驟中的 dll 加入參考,要加入的參考請參考下圖。

4. 加入 EmguCV 的控制項,到工具箱中

主要是將 Emgu.CV.UI.dll 加入工具箱中,加入後會出現 ImageBox、HistogramCtrl

5. 到此,已經將要撰寫OpenCV的工作完成了。開始撰寫程式碼,在這裡示範兩個範例,第一個是開啟並顯示 WebCam 畫面。

5.1 先在Form上拉兩個控制項,分別是 Button ( Name : captureButton )與 ImageBox ( Name : captureImageBox )

5.2 撰寫以下程式碼

01 using...System;
02 using System.Collections.Generic;
03 using System.ComponentModel;
04 using System.Data;
05 using System.Drawing;
06 using System.Linq;
07 using System.Text;
08 using System.Windows.Forms;
09
10 // 要引用的類別
11 using Emgu.CV;
12 using Emgu.CV.Structure;
13 using Emgu.Util;
14 using System.Threading;

15
16 namespace MyOpenCV
17 ...{
18    public partialclass Form2 : Form
19    ...{
20        public Form2()
21        ...{
22             InitializeComponent();
23         }

24
25        private Capture _capture;
26        privatebool _captureInProgress;
27
28        privatevoid ProcessFrame(object sender, EventArgs arg)
29        ...{
30             Image<Bgr, Byte> frame = _capture.QueryFrame(); 
31             captureImageBox.Image = frame;
32         }

33
34        privatevoid captureButton_Click(object sender, EventArgs e)
35        ...{
36            if capture is not created, create it now#regionif captureis not created, create it now
37            if (_capture ==null)
38            ...{
39                try
40                ...{
41                     _capture =new Capture();
42                 }

43                catch (NullReferenceException excpt)
44                ...{
45                     MessageBox.Show(excpt.Message);
46                 }

47             }

48            #endregion

49
50            if (_capture !=null)
51            ...{
52                if (_captureInProgress)
53                ...//stop the capture
54                     Application.Idle -=new EventHandler(ProcessFrame);
55                     captureButton.Text ="Start Capture";
56                 }

57                else
58                ...{
59                    //start the capture
60                     captureButton.Text ="Stop";
61                     Application.Idle +=new EventHandler(ProcessFrame);
62                 }

63
64                 _captureInProgress = !_captureInProgress;
65             }

66         }

67     }

68 }

5.3 執行結果,請注意喔,以下顯示的是 Webcam 即時視訊,不是影像喔

6. 第二個範例,我們將上一個範例,加上灰階、Canny處理

讓大家瞭解 OpenCV 的強大,而這動作,只需要多拉兩個ImageBox在加上幾行程式就可以了喔,真是太讚了,難怪很多學生想畢業,都用OpenCV

6.1 在上一個範例中,在多拉兩個 ImageBox,Name 分別為 grayscaleImageBox、cannyImageBox

6.2 將上一個範例,加上四行程式碼就可以達成將Webcam視訊灰階以及Canny

01 using...System;
02 using System.Collections.Generic;
03 using System.ComponentModel;
04 using System.Data;
05 using System.Drawing;
06 using System.Linq;
07 using System.Text;
08 using System.Windows.Forms;
09
10 // 要引用的類別
11 using Emgu.CV;
12 using Emgu.CV.Structure;
13 using Emgu.Util;
14 using System.Threading;

15
16 namespace MyOpenCV
17 ...{
18    public partialclass Form2 : Form
19    ...{
20        public Form2()
21        ...{
22             InitializeComponent();
23         }

24
25        private Capture _capture;
26        privatebool _captureInProgress;
27
28        privatevoid ProcessFrame(object sender, EventArgs arg)
29        ...{
30             Image<Bgr, Byte> frame = _capture.QueryFrame(); 
31             captureImageBox.Image = frame;
32
33            // 請再加上以下四行程式碼
34             Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>();
35             Image<Gray, Byte> cannyFrame = grayFrame.Canny(new Gray(100), new Gray(60));
36             grayscaleImageBox.Image = grayFrame;
37             cannyImageBox.Image = cannyFrame;
38         }

39
40        privatevoid captureButton_Click(object sender, EventArgs e)
41        ...{
42            if capture is not created, create it now#regionif captureis not created, create it now
43            if (_capture ==null)
44            ...{
45                try
46                ...{
47                     _capture =new Capture();
48                 }

49                catch (NullReferenceException excpt)
50                ...{
51                     MessageBox.Show(excpt.Message);
52                 }

53             }

54            #endregion

55
56            if (_capture !=null)
57            ...{
58                if (_captureInProgress)
59                ...//stop the capture
60                     Application.Idle -=new EventHandler(ProcessFrame);
61                     captureButton.Text ="Start Capture";
62                 }

63