本系列文章由@淺墨_毛星雲 出品,轉載請註明出處。
文章鏈接: http://blog.csdn.net/poem_qianmo/article/details/21974023
作者:毛星雲(淺墨) 郵箱: [email protected]
寫作當前博文時配套使用的OpenCV版本: 2.4.8
這篇文章中,我們一起探討了如何通過已經安裝的OpenCV,選擇不同的編譯器類型,生成高度還原的OpenCV開發時的解決方案工程文件,欣賞OpenCV新版本中總計 六十六多萬行的精妙源代碼。我們可以對其源代碼進行再次編譯,得到二進制文件,或者修改原版官方的OpenCV代碼,並編譯後爲自己所用,爲深入理解OpenCV的開源魅力邁出了堅實的一步。
一、下載安裝cmake
想要在Windows平臺下生成OpenCV的解決方案,我們需要一個名爲cmake的開源軟件,可以在
camke的官網:http://www.cmake.org/上下載到,首先轉到其下載頁面。下載頁面的Source distributions處可以下載到cmake軟件的源碼,如果對這款開源軟件感興趣,不妨看看。
而Binary distributions處可以下載到cmake的執行文件,我們只需要下載到其執行文件即可,選擇Windows (Win32 Installer)進行下載,點擊這裏直接下載:http://www.cmake.org/files/v2.8/cmake-2.8.12.2-win32-x86.exe
這一步就是下載和安裝cmake,下載地址給出了,安裝大家都會,就不過多講。安裝完成後,
如果沒有生成桌面快捷方式,在安裝路徑下,如D:\Program Files(x86)\CMake 2.8\bin處找到cmake-gui.exe運行。
另外,關於cmake的一個簡介:
CMake,是“crossplatform make”的縮寫,它是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是 CMake 的組態檔取名爲 CmakeLists.txt。Cmake 並不直接建構出最終的軟件,而是產生標準的建構檔(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然後再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標準的方式建構他的軟件,這種可以使用各平臺的原生建構系統的能力是CMake 和 SCons 等其他類似系統的區別之處。
二、使用cmake生成OpenCV源代碼工程的解決方案
這一步是全文的核心內容。爲了講解條理清晰,我們分步介紹:
<1>運行cmake-gui
如果沒有生成桌面快捷方式,在安裝路徑下,如D:\Program Files(x86)\CMake 2.8\bin處找到cmake-gui.exe運行。
運行後得到如下的窗口:
<2>指定OpenCV的安裝路徑
如下圖,點擊紅色方框內的“Browse Source”按鈕,在彈出的對話框中指定出OpenCV安裝時源代碼的存儲路徑。
以當前最新版本的OpenCV 2.4.8安裝在D:\Program Files下爲例,則在此選擇路徑:D:\ProgramFiles\opencv\sources
其實我們可以發現,此路徑下必須會有一個名爲CMakeLists.txt的文件。
這個文件就是給cmake留下的配置文件,cmake可以根據這個配置文件,通過不同的編譯器選擇,來生成不同的解決方案,VisualStudio的編譯器對應的就生成Visual Studio版的sln解決方案。
<3>指定解決方案的存放路徑
如下圖,點擊紅色方框內的“Browse Build”按鈕,在彈出的對話框中指定我們存放生成的opencv解決方案的路徑。比如F:/opencv。
<4>第一次Configure
如圖,第一次點擊Configure按鈕。
會彈出如下進行編譯器選擇的對話框:
首先選定“Use default native compilers”,然後,我們可以發現下拉列表中提供了幾十種編譯器給我們選擇,因爲我們安裝了Visual Studio,會默認爲我們選擇好對應版本的Visual Studio編譯器,比如Visual Studio 10(即待會兒會生成對應VS2010的sln解決方案)
確認無誤後,單擊“finish”按鈕。
於是,cmake開始第一次源代碼配置過程:
在cmake處理的過程中,也許會出現諸如
“Could not copy from: D:/Program Files(x86)/CMake 2.8/share/cmake 2.8/Templates/CMakeVSMacros2.vsmacros
to: C:/Users/淺墨/Documents/VisualStudio 2010/Projects/VSMacros80/CMakeMacros/CMakeVSMacros2.vsmacros”
的紅色字樣警告,因爲這是系統用戶的路徑名有中文字符 “淺墨”照成的,因爲cmake不認中文路徑,但是隻要我們在上面的第三步中設置生成的路徑中沒有中文就行了。就算有這個因爲C:/Users/下有中文照成的錯誤,也對我們這次的生成無礙,不用去管他。
PS:關於系統用戶名爲中文,這是血的教訓。之前在玩Unity3D遊戲引擎的時候,被系統路徑爲中文虐了好一陣子,在unity官方商店下個插件就報錯。在控制面板中更改用戶名是治標不治本的辦法,最後把系統user的Documents目錄定位到別的地方纔解決。不過這會造成一些在Documents路徑下存了數據的軟件數據丟失,甚至打不開。。。。。所以,血的教訓。。。。淺墨在以後重裝系統的時候,絕對不會以中文ID作爲用戶名了。
看到進度條讀到盡頭,出現了Configuring done字樣,第一次的源碼配置就完成了,如圖
<5>第二次Configure
第一次配置完成之後,我們還需要進行第二次配置,於是再次點擊“Configure”按鈕。這次的配置是很快的,幾秒鐘就會再次出現“Configuring done”字樣,並且紅色的選中部分都正常了:
<6>點擊Generate,大功告成
這樣,就只剩下點一次Generate按鈕,來生成最終的解決方案了:
因爲之前已經有過兩次的configure過程,所以生成解決方案也將是非常的快:
看到Generating done字樣,就表示大功告成,可以去之前我們指定的F:\opencv下找尋我們生成的解決方案了。
PS:2.4.8的OpenCV用cmake生成的工程只有3點多M,相比之前2.4.6版本的OpenCV有3個多G的工程,淺墨一開始都以爲生成出錯了,但是點開sln工程,發現裏面依然可以看到源代碼。原來自從2.4.7版本起,opencv源代碼就直接包含在了opencv的安裝路徑下,我們生成的sln工程,也只是連接到了opencv安裝路徑下的源文件而已,工程本身並不大。
三、編譯OpenCV源代碼
我們懷着忐忑的心態打開剛剛生成的熱乎乎的“OpenCV.sln”解決方案,看到一個龐大的工程映入眼簾——這可是一個包含了67個項目的解決方案:
大家這個時候可以在解決方案資源管理界面,隨意地點進去一個自己感興趣的項目,比如opencv_core這個項目,在opencv_core/Src/matrix.cpp查看其中某個文件的源代碼,淺墨截的這張圖是大家都很熟悉的Mat類型的某個構造函數的源碼:
一陣對源代碼的欣賞之後,我們可以按【F5】或者使用其他各種操作來啓動調試
編譯過程:
編譯結果:
編譯用時5分鐘左右,具體時間和機器配置關係比較大。通過淺墨的截圖可以發現,這次編譯成功了62個項目,失敗了0,即沒有出簍子,全部編譯生成成功了。:D
另外,編譯完成會得到這樣的警告:
別緊張,這是正常的。因爲OpenCV2.4.8的源代碼工程默認將“ALL_BUILD”這個項目其設爲了啓動項,編譯成功後,就會默認運行它。
而“ALL_BUILD”是一個項目生成周邊的雜項,不是exe,本身不可以運行,所以就會彈出這樣的提示。
關於啓動項的指定,我們可以在解決方案資源管理器裏面,對需要設爲啓動項的那個項目反鍵點擊,在彈出的菜單項中點擊【設爲啓動項(J)】進行設定。如下圖:
其實我們編譯OpenCV,就是得到了一些二進制的生成文件,如DLL和Lib、exe。
因爲我們是在debug下編譯的,所以在工程目錄的bin\debug下會生成opencv 2.4.8的依賴庫(700多M,有點大),可以供我們以後調用opencv時使用。
四、OpenCV代碼行數統計
OpenCV到了2.4時代,源代碼src部分已經有了170多M,而源代碼行數,通過淺墨的統計,是68多萬行。(這裏淺墨不禁有些感慨,前兩天剛在搗鼓的Unreal Engine 4的源碼是144多萬行,是OpenCV的兩倍多。。。。)
可以看到,準確的OpenCV 2.4.8的源代碼,有687,870行。
OK,盛宴開始,計算機視覺領域的大寶庫——OpenCV的源碼近眼前,不虛此生地欣賞它吧。
========================================================================================================
上面爲Windows上配置,以下爲Ubuntu中OpenCV編譯及配置:
1. 安裝相關軟件包:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev2. cmake:
新建文件夾release -> cd release -> cmake -D CMAKE_BUILD_TYPE=DEBUG <OpenCV_SourceCode_Path>
3. make & make install
4. 配置library:
打開/etc/ld.so.conf.d/opencv.conf,在末尾加入/usr/local/lib (有可能是個空文件,沒關係)
sudo ldconfig -> 編輯/etc/bash.bashrc -> 加入下面內容:PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH
5. 安裝完成,測試下安裝成果:將opencv源碼包下的example/c拷貝出來,執行./build_all.sh
編譯完後試一個人臉檢測的程序:./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg