[OpenCV]影像處理API-OpenCV介紹與安裝教學(OpenCV2.4.x在VS2012)

各位是否有時候會想要對拍下來的圖片做一些處理,如簡單的縮放、翻轉、顏色修改甚至是加入一些特效到圖片上如馬賽克,或是做人臉識別、微笑識別、車牌識別、行人偵測等等等許多相關的需求呢?

那麼這邊就跟各位介紹一下這個好用方便的開發API-OpenCV

前言

 


 

各位是否有時候會想要對拍下來的圖片做一些處理,如簡單的縮放、翻轉、顏色修改甚至是加入一些特效到圖片上如馬賽克,或是做人臉識別、微笑識別、車牌識別、行人偵測等等等許多相關的需求呢?

 

那麼這邊就跟各位介紹一下這個好用方便的開發API-OpenCV

 

OpenCV介紹

 


 

OpenCV(Open Source Computer Vision)是一個包含許多電腦視覺相關演算處理的開放原始碼Library,並且OpenCV可以在Android、ios上開發,支援的程式語言也有C/C++,Java,Python

 

電腦視覺這門領域主要研究如何讓機器「看」這個世界,了解這個世界能夠解讀影像的涵義與訊息。

 

學習電腦視覺會需要其他領域的知識,如:影像處理、機器學習、資訊檢索、模式識別、統計學、線性代數等許多領域的知識。

 

另外在電腦視覺的領域中包含以下幾項分支:

場景重建,事件監測,目標跟蹤,目標識別,機器學習,索引建立,圖像恢復

 

場景重建(Scene Reconstruction):試著透過多張場景畫面或影片片段來重建目標的場景,場景重建主要是針對建立三維空間場景為主(立體場景)

事件偵測(Detection):針對目標物是否在畫面中做偵測,並回應告知

識別(Recognition):從影像中透過影像的處理與擷取影像特徵,做統計分析識別出目標物體

目標追蹤( Tracking):偵測影片中的目標移動物並追蹤此物體目標

影像恢復(Image restoration):把一些不清晰的影像或模糊影像試著還原成原圖或是使影像清晰

除此之外,像是Photoshop中的影像處理也可以透過OpenCV完成。

 

所以如果需要處理到跟影像相關的技術就可透過OpenCV完協助。

 

小例子如下:

例如此圖為OpenCV官方範例的圖示-物件匹配(識別)

 

例如此圖為OpenCV官方範例的圖示- 偵測出影像中的邊緣

 

 

在OpenCV中包含了許多不同的模組

 


 

core:包含儲存影像的資料結構、影像明亮、繪圖、檔案處理,擷取攝像頭等

imgproc:影像的處理如:翻轉縮放、灰階、二值化、邊緣偵測、值方圖等操作

video:有關影片分析的部分、影片中的物件追蹤、影片中前後影像的背景相減

calib3d:影像校正

features2d:影像特徵點擷取(也又是影像中最特別最有特色的地方如:邊緣、顏色變化明顯等),描述子表示

objdetect:物件偵測

highgui:簡單的一些視窗介面或是鍵盤輸入操作功能提供

gpu:透過gpu去處理影像

flann:高維度的特徵處理等演算法如:LSH(局部敏感雜湊)

ml:機器學習相關演算法,如分類KNN、貝式機率分類器、SVM(是SMV 筆誤 感謝網友告知),如分群Kmean

等多樣化的模組,其中也包含了其他領域的一些演算法在其中。

 

OpenCV安裝

 


 

發此篇文章時OpenCV已到了2.4.6版本,在2.4.x的版本基本上安裝設置步驟皆可使用(例如之前剛好有使用2.4.4與2.4.5,皆有安裝成功),而這邊則以2.4.6為範例做安裝

1﹒進到OpenCV官方網站,並下載軟體

homepage

下載完後會有這樣一個OpenCV的官方圖示的軟體:

opencv_file

 

2.解壓縮檔案,並移動至C槽

移動到C槽是個不成文的規定,多數使用OpenCV的人都會直接放置在C槽目錄下

move_to_C

 

3﹒建立你要使用OpenCV的專案

這邊以C++的專案為例,因為我們要介紹如何在Visual Studio 2012(以下簡稱VS2012)中使用OpenCV並作開發,所以開啟VS2012,並選擇C++空專案(之後再自己加入main.cpp)

build project

 

4﹒進入專案屬性,做些設定

properties

 

5﹒在VC++目錄->include目錄中加入之後要include的openCV檔案路徑


C:\opencv\build\include\opencv
C:\opencv\build\include\opencv2
C:\opencv\build\include

add include

這邊稍微提一下:

opencv與opencv2幾本上裡面都有包含相同的模組,唯一的差別在於說opencv是早期Opencv1.x API的檔案

裡面是以C語言的函式所編寫成,opencv2在後來2.0後才擁有,以類別的方式去編寫,有著新的呼叫與操作方式;opencv2中的檔案是使用.hpp檔案去編寫header檔,所以使用時要記得include .hpp檔

 

不過這部分是看開發者,使用opencv或opencv2都能完成你所想要的功能

在來如果你想要在程式撰寫include時區分出是使用哪個版本(opencv or opencv2),你也可以在這邊的include目錄單純只打上


C:\opencv\build\include

之後在程式中在如下要使用opencv2就打


#include <opencv2/highgui/highgui.hpp>

或是要使用opencv就打


#include <opencv/highgui.h>

 

6﹒加入函式庫


C:\opencv\build\x86\vc11\lib

這邊路徑中的vc11是針對使用VS2012的版本,如果你是使用VS2010請記得換成VC10(VS2008->VC9)

add lib

 

7﹒在連結器(Linker)->輸入->加入相依性的檔案

這邊可以依照你要使用什麼library而引入想要使用lib檔

例如core與highgui是我等下會使用到的所以便加入進去使用(11/4 感謝網友的告知修正!,圖片明明貼正確 卻手殘打錯@@)


C:\opencv\build\x86\vc11\lib\opencv_core246d.lib
C:\opencv\build\x86\vc11\lib\opencv_highgui246d.lib

要做一些影像處理便可加入


C:\opencv\build\x86\vc11\lib\opencv_imgproc246d.lib

add_link_dependacy

你會看到lib檔的前面名稱尾部都帶有d這個字(如:246d),代表是使用debug時使用,如果哪天你的專案要release請記得換掉(沒有d的是release版本喔!)

 

8﹒加入系統環境變數,並重新開機!

電腦->內容->進階系統設定->環境變數,並在系統環境變數的Path值中尾部加入(vc11一樣要注意,依照你用的VS版本選擇對的vc):


C:\opencv\build\x86\vc11\bin

並重新開機

system variable

 

 

程式碼測試-開啟攝影機為例

 


 

這邊有一小段的程式碼可以供測試,主要是用來開啟筆電攝影機或如果你的電腦有攝影機的話


#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main(){

    //抓取攝影機
    VideoCapture cap(0);
    //嘗試開啟攝影機
    if(!cap.isOpened()) return -1;

    //用矩陣紀錄抓取的每張frame
    Mat frame;
    //建立一個視窗,名稱為camera
    namedWindow("camera",1);
    for(;;)
    {
        //把取得的影像放置到矩陣中
        cap >> frame;
        //顯示frame到camera名稱的視窗
        imshow("frame", frame);
        if(waitKey(30) >= 0) break;
    }
    system("PAUSE");
    return 0;
}

結果畫面

show image

 

結論

 


 

OpenCV真的是一個很方便又強大的函式庫工具,在這邊稍微整理做一個介紹與安裝,以後也會不定期介紹一些功能與效果

希望可以讓想要做影像處理的人可以方便上手 =)

 

參考資料:

【情報】opencv 2.4.5在vc2010上使用方法教學

Computer vision

Include folder structure: opencv and/or opencv2?

http://docs.opencv.org/modules/core/doc/intro.html

 

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝