各位是否有時候會想要對拍下來的圖片做一些處理,如簡單的縮放、翻轉、顏色修改甚至是加入一些特效到圖片上如馬賽克,或是做人臉識別、微笑識別、車牌識別、行人偵測等等等許多相關的需求呢?
那麼這邊就跟各位介紹一下這個好用方便的開發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官方網站,並下載軟體
下載完後會有這樣一個OpenCV的官方圖示的軟體:
2.解壓縮檔案,並移動至C槽
移動到C槽是個不成文的規定,多數使用OpenCV的人都會直接放置在C槽目錄下
3﹒建立你要使用OpenCV的專案
這邊以C++的專案為例,因為我們要介紹如何在Visual Studio 2012(以下簡稱VS2012)中使用OpenCV並作開發,所以開啟VS2012,並選擇C++空專案(之後再自己加入main.cpp)
4﹒進入專案屬性,做些設定
5﹒在VC++目錄->include目錄中加入之後要include的openCV檔案路徑
C:\opencv\build\include\opencv
C:\opencv\build\include\opencv2
C:\opencv\build\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)
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
你會看到lib檔的前面名稱尾部都帶有d這個字(如:246d),代表是使用debug時使用,如果哪天你的專案要release請記得換掉(沒有d的是release版本喔!)
8﹒加入系統環境變數,並重新開機!
電腦->內容->進階系統設定->環境變數,並在系統環境變數的Path值中尾部加入(vc11一樣要注意,依照你用的VS版本選擇對的vc):
C:\opencv\build\x86\vc11\bin
並重新開機
程式碼測試-開啟攝影機為例
這邊有一小段的程式碼可以供測試,主要是用來開啟筆電攝影機或如果你的電腦有攝影機的話
#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;
}
結果畫面
結論
OpenCV真的是一個很方便又強大的函式庫工具,在這邊稍微整理做一個介紹與安裝,以後也會不定期介紹一些功能與效果
希望可以讓想要做影像處理的人可以方便上手 =)
參考資料:
【情報】opencv 2.4.5在vc2010上使用方法教學
Include folder structure: opencv and/or opencv2?
http://docs.opencv.org/modules/core/doc/intro.html
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝