EmguCV_開發學習歷程_1

首先由於EmguCV已經出了太多版了
我們先來分析各個版目前使用人數多寡
來抉擇要使用哪一版




































在此我以2014年為分水嶺之前的就不用了!!!!

我先試試最新的3.0吧
使用人數還真多呢!!!!

使用最新版來開發有好有壞

好處是 迎合新趨勢 功能必更方便更齊全

壞處是 較少相關開發文分享 也較難做開發

不過試一試吧  這是難免的

 的 Sourceforge載點連結:

http://sourceforge.net/projects/emgucv/files/emgucv/3.0.0/


在此參考兩篇關於  EmguCV  3.0版的 安裝教程

博客名稱:
Change The World  樓主:cc_sunny
关于EMGU CV的那些事——1.环境搭建(win8 vs2012 emgucv3.0)
http://blog.csdn.net/aptx704610875/article/details/46045689

處理EmguCV3.0.0 “Emgu.CV.MatInvoke”的類型初始值設定項引發異常。
http://www.ithao123.cn/content-8808438.html

樓主使用的是  3.0.0-rc1版本

以下參考了這個樓主的部落格來做研究分析

关于EMGU CV的那些事——2.摄像头捕捉(RGB and GRAY)
http://blog.csdn.net/aptx704610875/article/details/46121241

我先照做看看 根據之前經驗發現一直裝失敗的原因就是因為

版本下載的和原作者不同






















結果是不太順暢

我們來看看這個錯誤訊息是在講捨麼??

把他放大一些
























InvalidOperationException 未處理

















之後我們到  stackoverflow 去 爬個文

http://stackoverflow.com/questions/15410700/c-sharp-system-invalidoperationexception

有個老外要寫一個關於TCP/IP客戶端主從式架構(Client–server model)
-----------------------------------客戶端-伺服器(Client/Server)結構簡稱C/S結構
為了使用port和IP位址連結



































下面有個老外解答







看到了  一個詞   叫做   「委外」

之後去上網了查了一下


























「委外」(delegate)   的意思是捨麼?????


可以安全封裝方法的類型,類似於 C 和 C++ 中的函式指標。與 C 函式指標不同之處在於,委派為物件導向且類型安全,同時安全性較佳。<截自官網>


「封裝」(Encapsulation) 是指 每個人都有個人隱私,若喪失隱私,就會被一覽無遺,毫無秘密可言。

資料的封裝就好比人的隱私。
物件也跟人一樣,都有屬於物件內部的私有部分(屬性、方法)
這些部分必須是外界無法直接存取的!!!!
這樣才能保有物件的完整性



就好比如
Visual C++ 的  .Net 視窗應用程式中,
我們可以用textBox1->Text來存取textBox1文字方塊的Text屬性值
Visual C# 視窗程式中
我們則是用textBox1.Text來存取textBox1文字方塊的Text屬性值

這是照著作者設計出來的視窗

























之後回顧一下發現樓主有提到

不同的imagebox控件分布在不同的线程里,分别有一个while循环不断的获得视频帧。


在子线程里访问父线程里创建的imagebox控件的话,编辑器会抛出异常,原因是怕多线程同时访问控件时出现的死锁等。

死锁就是死結啦!!!

死結(英語:Deadlock),又譯為死結,計算機科學名詞。當兩個以上的運算單元,雙方都在等待對方停止執行,以取得系統資源,但是沒有一方提前退出時,這種狀況,就稱為死結。

在多工系統下,當一個或多個行程等待系統資源,而資源又被行程本身或其它行程占用時,就形成了死結。



















樓主一開始先宣告了

Capture cap ; //  用來 產生讀取攝像頭的結構體

再創了兩個Mat型態的空指標,各自用來指向讀取RGB攝像和灰階的一個個frame

分別叫做  (1)frame ,(2) gframe
---------------------------------------------------------------------------------------------------------------
(1)frame 被用在 private void ProcessFrameRgb(){ ... }這個私有方法之中


rgbframenum 初始化為0 主要用來統計(累加)讀取到的frame
之後用if判別如果  預設的thread1flag 佈林值非 false就代表成功讀取攝像頭
sw1就啟用Start()方法 【sw1 是用Stopwatch 這個類 來宣告】計算累計耗費時間

其實很好辨別哪個是變數哪個是只要把屬標移至我們的Stopwatch上就會跳出顯示說明框







(2)gframe  frame 被用在 private void ProcessFrameGray(){ ... }這個私有方法之中

grayframenum 初始化為0 主要用來統計(累加)讀取到的灰階frame數
sw2跟剛才一樣

重點來了!!!!!
gframe = new Mat(frame.Rows, frame.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);



gframe = new Mat (直行數 , 橫列數 , Emgu.CV.CvEnum.深度型態 ,  通道數)
因為灰階所以單通道最後一個參數填1很合理!!!
Emgu.CV.CvEnum是一個命名空間
在別篇樓主部落格中Emgucv相關教學文中
http://gnehcic.azurewebsites.net/category/emgucv/

Emgu.CV.CvEnum後頭好像還可以接其他東西像是 INTER.CV_INTER_LINEAR
不過我們應該可以從這兩句語法推估
他是一個enum型態(列舉型別)












再來看CvInvoke 這個 類





















public static void CvtColor(IInputArray src, IOutputArray dst, ColorConversion code, int dstCn = 0);



之後又建立了兩個Thread (線程)這個類,各自用來指向RGB和灰階的frame



一個叫做 RgbThread
被用在 button1的觸發事件  和   button3的觸發事件之中  button3 在寫關攝影頭





















大概分析到此

https://msdn.microsoft.com/zh-tw/library/fd85b3df(v=vs.80).aspx

微軟官網上資訊寫著


































=====================================================================


之後又發現有兩篇blog作者是寫關於libemgucv-windows-universal-cuda-2.9.0.1922-beta

Visual studio 2013 express 下 安裝 EmguCV - WebCam
http://ezworker2010.blogspot.tw/2014/03/visual-studio-2013-express-emgucv.html


C# visual studio 2012 EmuCV 安裝教學 與 Emgu.CV.CvInvoke 解決
http://vincecc.blogspot.tw/2013/11/c-visual-studio-2012-emucv.html


兩篇 作者皆使用  emgucv 2.4.9 beta



























不如試試這版吧
本次分析告一段落

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header