由於家庭原因,好久沒有更新了。當初本來想將機器視覺的內容一直做下去,沒想到被耽擱這麼久,一晃過去就是一兩年了。期間在微信公眾號上也釋出了一些內容。有興趣的可以搜尋“人工智慧與機器視覺”公眾號。現在再次繼續,從opencv的安裝開始,一步步來說下怎麼做機器視覺,希望能幫助到有志於從事機器視覺的人士。

做機器視覺,核心是影象處理,而用到的影象處理工具,主流的就是opencv、halcon和visionpro。後面兩個是商業軟體,opencv是完全免費的。要學好機器視覺的核心影象處理,建議可以opencv和halcon同時入手,最開始最好用opencv,這樣對影象演算法的理解會更加深刻一些。我見過一些做視覺影象的,會一點halcon,就感覺自己好像會做機器視覺了。這是不可能的,如果對影象處理演算法沒有比較深刻的理解,那麼對演算法函式的呼叫也很難實現下你給要的功能。舉個簡單的例子,一個固定閾值的二值化操作,很多人可能覺得太簡單而且沒有什麼用處。可是如果改變一下方式,會得到意想不到的效果。這在公眾號上有介紹,在這裡我後面也會慢慢把一些實用的使用方式告訴大家,以後我會慢慢把公眾號的內容在這裡釋出,然後就是兩個地方同時釋出。今天開始先把opencv的安裝說一下。

首先,從opencv官網

https://

opencv。org/releases。htm

l

上下載。 最新的版本已經是5。0了,這裡還是以4。0為例,在vs2015上配置opencv

Opencv安裝教程(一)及第一個例子

圖1 opencv下載介面

如果想自己編譯opencv的編程式碼,需要下載的是Source,建議初學者不要自己去編譯原始碼,而是直接使用已經編譯好的檔案。當然,你也可以從github網站

https://

github。com/opencv/openc

v

去下載opencv的原始碼。

Opencv安裝教程(一)及第一個例子

圖2 github上的opencv原始碼

下載後,在你的電腦上應該有這樣的檔案 。其實就是一個壓縮檔案,直接雙擊,選擇安裝目錄,直接安裝就行,然後配置環境變數。如下圖

Opencv安裝教程(一)及第一個例子

圖3 配置opencv環境變數

上面的目錄是安裝opencv的目錄。這樣,就把opencv安裝好了,但是要在visual studio裡面使用opencv,還需要匯入opencv的標頭檔案,dll檔案等。首先開啟visual studio軟體,按照下圖選擇Visual c++專案,然後選擇win32控制檯應用程式,輸入名稱和位置,點選確定,然後下一步選擇空專案

Opencv安裝教程(一)及第一個例子

圖4 新建控制檯程式

Opencv安裝教程(一)及第一個例子

圖5 選擇空專案

點選確定完成,這樣就新建了一個空的win32控制檯專案。

然後選擇屬性管理器,具體位置如下圖

Opencv安裝教程(一)及第一個例子

圖6 選擇屬性管理器

在屬性管理器上右鍵新建屬性管理器,輸入名稱和位置,點選確定

下面來一個具體的例子,利用opencv顯示影片影象,如果你的電腦上有攝像頭,並且按照上面的方法配置好了opencv,那麼,下面的例子可以直接執行看得到結果。

Opencv安裝教程(一)及第一個例子

圖7 新增新專案屬性表

Opencv安裝教程(一)及第一個例子

圖8 新新增的屬性表

這時屬性管理器多了一個“opencv40”,雙擊它,彈出屬性頁對話方塊,然後按照下面的圖示配置屬性表。

Opencv安裝教程(一)及第一個例子

Opencv安裝教程(一)及第一個例子

Opencv安裝教程(一)及第一個例子

Opencv安裝教程(一)及第一個例子

如上圖,分別配置包含目錄和庫目錄以及附加依賴項,在連結器-》輸入-》附加依賴項中加入opencv_world400d。lib,直接確定,就配置完成了,有的opencv版本附加依賴項有多個lib檔案,後來的版本將多個lib檔案合併成了一個opencv_world400d。lib。以後,你可以在新建的專案裡面直接包含該屬性,這個檔案在你的專案下面,直接複製該屬性表到你新建專案的對應目錄下,以後對於新的專案,就不需要重新配置opencv了。

點選解決方案資源管理器,選擇原始檔右鍵新增新項,選擇c++原始檔,然後就可以編寫程式碼,呼叫opencv的函式,實現影象處理功能了。

Opencv安裝教程(一)及第一個例子

注意,可能執行opencv程式會出錯,因為可能有的系統會缺少類似msvcp100d。dll,msvcr100d。dll這樣的檔案,這時需要自己去下載這些檔案,放在系統資料夾下面就可以了。

#include

#include

#include

using namespace std;

using namespace cv;

int main(int arg, char** argv)

{

namedWindow(“讀取攝像頭影象”, 0);//建立一個窗體用於顯示影片影象, VideoCapture cap;//影片類

cap。open(0);//開啟攝像頭,如果開啟的是本地影片,需要該影片的路徑

Mat frame;//讀取的影片幀

while (1)//一直迴圈讀取

{

cap >> frame;//讀影片影象

if (frame。empty())

break;

imshow(“讀取攝像頭影象”, frame);//顯示

if (waitKey(33) >= 0)

break;

}

return 0;

}