- 引子
最近剛剛開始接觸OpenCV,在這里把自己學習過程中的收獲和問題寫在這里與大家一起分享討論,畢竟一個人的力量和精力有限,希望與大家一起共勉。
聲明:1.本人也是初學,水平有限,如有錯誤之處,歡迎大家批評指正。
2.環境:Win7 ultimate 64bit + VS2010 + OpenCV2.4.3。
- Chapter 1:介紹
在這篇博文中將為大家介紹OpenCV基礎原理以及向大家展示如何完成最基礎的一些任務:例如讀取,顯示和保存圖片等。在開始編寫OpenCV程序之前,需要先安裝OpenCV Library,同時你也需要一個好的環境(IDE),在這里我用的是Microsoft Visual Studio 2010。
- Chapter 2:安裝OpenCV Library
OpenCV是一個用來開發計算機視圖應用程序的開源庫,其可用在大學或者商業程序中,在BSD證書下允許免費使用,傳播或者改編它。這一節將說明如何安裝OpenCV Library。
2.1 准備工作
訪問OpenCV的官方網站可以找到最新的發行包以及在線文檔和許多其他跟OpenCV有關的資源。
注:這里強烈建議大家下載新版的OpenCV Library,因為2.3以后的版本安裝時會自動生成一個Build文件夾,里面有編譯好的Lib和DLL,可以直接使用,如果是2.3之前的版本,則需要自己手動編譯,編譯的過程還是較為繁瑣的,這里就不一一介紹了。而且版本越新功能也就越強大,何樂而不為呢?
2.2 安裝
從官網的下載界面里找到相應的平台,這里我們選擇Windows,下好安裝包之后解壓能看到一個build文件夾,里面包含了要用到的模塊。具體安裝之后的目錄如下圖(安裝過程很簡單,選擇一個要解壓到的文件夾即可,這里就不具體說明了):
(接下來這一步可以不做,但是后章中提到包含頭文件和庫文件的時候要注意選擇相應的目錄)新建一個OpenCV的目錄,可以在這目錄下再新建不同的文件夾來存放不同版本的文件,這里為了方便把需要用到的文件:include文件夾和X64下的文件夾拷貝到剛剛新建好的文件夾里(如果是32bit的系統就拷貝X86下的文件夾),我是放在C:\Program Files\OpenCV\VS2010文件夾下,最后的結果如下圖(如果是VS2008則拷貝VC9目錄代替VC10):
2.3 OpenCV是如何工作的
從2.2版本開始,OpenCV Library分成了幾個模塊,這些模塊編譯生成的Library文件都被放在“lib”目錄下,它們分別是:
opencv_core:包含庫的核心功能,特別是基本數據結構和算法邏輯函數。
opencv_highgui:包含圖像,視頻的讀寫功能函數和其他的用戶接口函數。
opencv_imgproc:包含圖像處理函數。
opencv_features2d:表明檢測器,描述器和匹配的框架等特征。
opencv_calib3d:包含攝像校對,二維幾何估值,三維立體處理函數等。
opencv_vidio:包含了動態預測,特征跟蹤以及前景提取的函數和類。
opecv_objdetect:包含對象檢測函數,例如人臉識別等。
當然,還包括其他一些功能的庫,像opencv_ml,opencv_flann,opencv_contrib,opencv_legacy,opencv_gpu等。
在include同文件中有與這些模塊相關聯的頭文件,一般OpenCV C++代碼開始的時候都要包含所需的模塊頭文件,例如(推薦用這樣的形式來聲明):
1: #include <opencv2/core/core.hpp>2: #include <opencv2/imgproc/imgproc.hpp>3: #include <opencv2/highgui/highgui.hpp>如果你看到下面這種OpenCV代碼:
1: #include “cv.h"這是因為它用了在OpenCV庫重組成模塊之前的格式。
- Chapter 3:創建OpenCV的工程:
這一節來向大家展示怎么創建一個簡單的OpenCV工程,首先,通過VS2010的File|New Project|Project…菜單選項新建一個工程,這里選擇Win32 Console Application(Win32 控制台程序),如下圖:
點擊OK,然后點擊next
接下來選擇Empty project,點擊finish:
這樣我們就創建了一個空的OpenCV的工程,首先,在編譯和運行OpenCV程序之前,需要先告訴Visual C++去哪里找OpenCV的庫和頭文件,由於將來我們可能會創建一些OpenCV的工程,所以在這里最好的做法是創建一個屬性表,這個屬性表可以重用在其他的OpenCV工程中,這樣我們就不需要每次編寫OpenCV工程的時候去配置庫和頭文件目錄了。打開Property Manager(屬性管理器,如果找不到可以通過View|Property Manager打開)。
在Visual C++ 2010中,屬性表是一個描述工程設置的XML文件,通過右鍵點擊Debug|Win32,選擇Add New Project Property Sheet選項,可以見到下圖:
點擊Add按鈕后,就添加了一張屬性表,現在我們要對它進行編輯,雙擊剛剛新建好的屬性表,選擇VC++ Directories,如下圖:
編輯Include Directories文本框,添加OpenCV庫頭文件所在的include路徑(以各位自己安裝OpenCV的路徑為准),如下圖(下圖是我自己的路徑):
同樣處理Library Directories,這次我們添加OpenCV的庫文件路徑:
下一步要指明代碼需要鏈接的OpenCV庫文件來生成可執行程序。根據應用程序的不同需要不同的OpenCV模塊,因為我們希望屬性表可以被重用在所有的OpenCV工程中,我們簡單的添加幾個需要用到的庫模塊,在Input文本框中選擇Linker節點,如下圖:
編輯Additional Dependencies文本框然后添加下面的庫模塊:
注意這里我們指定的庫名字末尾有個字母"d”,這說明是Debug模式,我們需要創建另外一個Release模式的屬性表,重復上面的步驟,不過需要在Release|Win32節點下添加,在添加庫木塊的時候,不需要在末尾加上字母"d”,如下圖:
接下來我們准備創建,編譯和運行第一個OpenCV應用程序。在Solution Explorer中,右擊Source Files節點,選擇Add New Item…創建一個main.cpp的C++文件。然后我們在main.cpp中添加如下代碼:
1: #include <iostream>2: #include <opencv2/core/core.hpp>3: #include <opencv2/highgui/highgui.hpp>4: using namespace std;5: using namespace cv;6:
7: int main( int argc, char** argv )8: {
9: //read an image10: if ( argc != 2 )11: {
12: cout << "Usage: display_image ImageToLoadAndDisplay" << endl;13: return -1;14: }
15:
16: Mat image;
17: cout << "size: " << image.size().height << " , "18: << image.size().width << endl;
19:
20: // Read the file21: image = imread(argv[1], CV_LOAD_IMAGE_COLOR);
22:
23: // Check for invalid input24: if (!image.data)25: {
26: cout << "Could not open or find the image" << endl;27: return -1;28: }
29:
30: // Create a window for display.31: namedWindow( "Display window", CV_WINDOW_AUTOSIZE );32:
33: // Show our image inside it.34: imshow("Display window", image);35:
36: //Wait for a keystroke in the window37: waitKey(0);
38:
39: return 0;40: }
現在要設置輸入圖片的位置,在Solution Explorer中,右擊OpenCVConsole工程名,選擇Property,在Debugging節點中的Command Arguments文本框中輸入圖片的全路徑,如下圖:
然后按Ctrl+F5看下運行的效果吧!
- Chapter 4 總結及問題
在上述開發過程中遇到一個問題,如果將上述的代碼改成圖片路徑不通過參數傳遞,而是指定一個圖片,並將該圖片放在相應的Debug或Release目錄下,則會出現錯誤,希望大家如果能解決這個問題的告訴我解決方法,謝謝。附代碼和圖:
1: #include <iostream>2: #include <opencv2/core/core.hpp>3: #include <opencv2/highgui/highgui.hpp>4: using namespace std;5: using namespace cv;6:
7: int main( void )8: {
9: //read an image10:
11: Mat image;
12: cout << "size: " << image.size().height << " , "13: << image.size().width << endl;
14:
15: // Read the file16: image = imread("1.jpg", CV_LOAD_IMAGE_COLOR);17:
18: // Check for invalid input19: if (!image.data)20: {
21: cout << "Could not open or find the image" << endl;22: return -1;23: }
24:
25: // Create a window for display.26: namedWindow( "Display window", CV_WINDOW_AUTOSIZE );27:
28: // Show our image inside it.29: imshow("Display window", image);30:
31: //Wait for a keystroke in the window32: waitKey(0);
33:
34: return 0;35: }
如有錯誤的地方希望大家批評指正,轉載需注明出處,謝謝大家支持。