有關VC# 使用Emgu發生Emgu.CV.CvInvoke所發生的錯誤整理


最近升上資工所,剛好需使用EmguCV函式庫來寫影像程式

第一次開始安裝還挺多問題

直到最近好不容易才解決

趁現在把安裝的步驟與錯誤的解決辦法寫下來~

其實網路上有很多方法能夠參考

但有些版本已經有點舊

以下是我反覆測試後能夠順利安裝執行的步驟
(已確定只須單獨Emgu就可執行)-----10/10修正

家中環境

OS:Windows 7 64位元旗艦版
GPU:AMD PowerColor 6870

實驗室環境

OS:Windows XP 32位元 pro
GPU:ASUS ATI 3450

兩者皆是Microsoft Visual Studio 2010 Professional

Step1:

需下載

最新的EmguCV
EmguCV-gpu x86 2.4.2.177(這是gpu版本)
和稍舊的
EmguCV x86 2.4.0.1717(這是普通版)

(gpu版本需使用nvidia的顯卡)
(本文改用2.4.0.1717)-----10/10更改
(若是使用AMD 或是intel的顯卡須下載普通版本)
(目前2.4.2.1777沒有普通版 只能下載2.4.0.1717 安裝的方式都一樣)


Step2:

把它們安裝
Emgu我把它裝到預設路徑C:/底下
(產生C:\Emgu\emgucv-windows-x86 2.4.0.1717)-----10/10更改


Step3:

設定環境變數
win7
在我的電腦右鍵->內容->進階系統設定->進階->環境變數
在使用者變數中的path對它編輯
在最後面加入
;C:\Emgu\emgucv-windows-x86 2.4.0.1717\bin\x86
(網路上有些方法沒有加上後面的x86路徑)
(但我這邊測試,沒有x86的話,會出現CvInvoke的錯誤)
直接複製貼上

Step4:

(以下步驟每次開新專案都要做一遍)
在VS2010中
開一個專案
在工具->選擇工具箱項目中

在此頁點選瀏覽
選擇
C:\Emgu\emgucv-windows-x86 2.4.0.1717\bin\Emgu.CV.UI.dll
然後會跑出一個HistogramBox














在工具箱最下面跑出這四項就算新增成功了









再來加入參考

























在瀏覽中視需要加入dll
(本文只加入 Emgu.CV.dll  Emgu.Util.dll)



































以上前置作業完成


再來
寫一個簡單的讀圖程式來測試是否成功
以下提供個簡單的範例
先拉個簡單的原件
























程式碼:
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;
using Emgu.CV.Structure;
using Emgu.Util;
using System.Threading;

namespace test4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string strFileName; 
        private void button1_Click(object sender, EventArgs e)
        {

            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "JPG 檔(*.jpg) |*.jpg;*.jpeg|" + "
            BMP 檔(*.bmp) |*.bmp|" + "PNG 檔(*.png) |*.png";

            openFileDialog1.Title = "選擇一個圖片檔案";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {

                strFileName = openFileDialog1.FileName;
                Image<Bgr, byte> img = new Image<Bgr, byte>(strFileName);
                pictureBox1.Image = img.ToBitmap();
            }
        }
    }
}


若能成功編譯並且讀圖出現就OK了

後記:

有關於跳出Emgu.CV.CvInvoke資訊的解決方法

1.更換目標平台成x86
2.把Emgu路徑加入參考目標
3.安裝C++2010可轉散發套件等等

這些是網路上常有的解答
無奈的是
當我碰到這問題時,這些方法還是無效

所以必須先了解產生錯誤的真正原因
才能對症下藥
例如某些DLL有沒有確實載入等等
可直接執行專案裡debug資料夾的EXE執行檔
看出現甚麼錯誤




















例如以上錯誤

就是opencv_core242為載入成功
很明顯就是環境變數沒設好
結果是後面路徑多了個;
這小小的錯誤就花了我好幾個小時的時間~
真是勞民傷神~

莫名其妙的是
實驗室也相同步驟設定
執行膚色偵測時竟然發生
'cvextern': 找不到指定的模組的錯誤
怪了
明明環境變數路徑正確啊
只好把cvextern.dll直接丟到debug裡面
然後就OK了~
(Emgu 我真猜不透您啊~)


希望有相同問題的網友能也夠解決這些問題

參考網頁
http://a7419.pixnet.net/blog/post/88913093-c%23-%E4%BD%BF%E7%94%A8webcam%E9%8C%84%E8%A3%BD%E5%BD%B1%E7%89%87(.avi)
http://www.emgu.com/wiki/index.php/Download_And_Installation#The_type_initializer_for_.27Emgu.CV.CvInvoke.27_threw_an_exception
http://lucas-0706.blogspot.tw/2012/02/emgu-cv-on-visual-c-2010.html

留言

  1. 您好,我也有一樣的問題
    在本機執行都沒有問題
    但是拿到別台電腦
    就出現找不到找不到指定模組opencv_core242的錯誤訊息
    我明明exe和dll都放在同一個資料夾了 orz

    請問您有沒有idea可以解決這個問題?

    回覆刪除
  2. 有確認顯卡是哪一家的嗎???

    回覆刪除
  3. 我用vb.net執行時
    會錯誤
    跳出Emgu.CV.CvInvoke
    但是直接去資料夾執行exe
    卻沒有錯誤耶
    這是什麼情況呀 = =

    回覆刪除
    回覆
    1. 我也是遇到一樣的狀況...真的很奇怪啊!!

      刪除
  4. 功能還正常呢....真的好難懂

    回覆刪除
  5. 您好,
    我在使用Emgu以及SURF的部分也有一些問題,
    不知道可不可以跟您詢問一下,
    這邊是我的email:sharontam0515@gmail.com
    如果可以的話,請寄一封email給我。
    非常感謝你。

    回覆刪除

張貼留言