Win下 C++版SDM(Supervised Descent Method)演算法實現
前期相關安裝配置工作:
OpenCV version >= 2.4.3 (我使用的版本為2.4.9)官網下載地址
下載後解壓至相關路徑(我的解壓路徑為:F:/opencv,新增環境變數(右鍵我的電腦->屬性->高階系統設定->環境變數)
在系統變數Path
中新增F:\opencv\build\x64\vc12\bin;
新建變數OpenCV
,值為:F:\opencv\build;
新建環境變數OpenCV_include
,值為:F:\opencv\build\include;F:\opencv\build\include\open;F:\opencv\build\include\opencv2;
開啟VS2013,新建win32控制檯專案進行VS中opencv的配置。
右鍵選擇專案屬性,在VC++目錄包含目錄中新增
F:\opencv\build\include;F:\opencv\build\include\open;F:\opencv\build\include\opencv2;
在VC++目錄庫目錄中新增F:\opencv\build\x86\vc12\lib;
連結器->輸入->附加依賴項,新增所需lib檔案即完成配置。
Eigen version >= 3.2(我使用的版本為3.2.9)官網下載地址
我的解壓路徑為:F:\Eigen\Eigen3.2.9
Boost version >=1.54.0 (我使用的版本為1.61.0) 未編譯版本、已編譯版本
我的解壓路徑為:F:\Boost\boost_1_61_0
新建環境變數BOOST_LIBRARYDIR
,值為:F:\Boost\boost_1_61_0\lib64-msvc-12.0
環境變數BOOST_ROOT
,值為:F:\Boost\boost_1_61_0
注:已編譯版本下載時注意編譯器版本一定要相同(如:boost_1_61_0-msvc-12.0-64.exe,則為64位系統,VS2013編譯而成)如果選擇未編譯版則需要自己進行編譯。編譯過程如下:
- Win+R後彈出執行框
- 輸入cmd後回車進入命令列視窗
- 使用cd命令進入boost解壓路徑
- 在命令列執行bootstrap.bat檔案,操作為:輸入bootstrap.bat後回車,原路徑自動生成bjam.exe檔案
- 執行bjam.exe檔案(系統會自動匹配已有編譯器)
- 編譯完成
CMake 官網下載地址
選擇下載windows版本.msi檔案。下載完成執行,選擇安裝目錄,隨後在目錄中進入bin目錄裡雙擊cmake-gui.exe即可進入CMake的gui介面。
具體cmake過程如下:
在原始碼解壓路徑中新增build資料夾(用以放置cmake後的專案檔案,也可選擇其他路徑)
將原始碼完整路徑新增至gui介面的where is source code部分,將build資料夾完整路徑新增至where to build the binaries部分。如圖:
單擊Configure,在彈窗中選擇編譯器後回車。
找不到opencv相關檔案,出現如圖所示錯誤介面:
在
OpenCV_DIR
中新增相關路徑,我的為:F:/opencv/build
點選Configure後會出現新的錯誤,提示找不到Eigen相關檔案,在
EIGEN3_INCLUDE_DIR
中新增路徑F:\Eigen\Eigen3.2.9
即可成功configure,截圖如下:
勾選
BUILD_DOCUMENTATION
與BUILD_TESTS
點選Generate,完成首次Generate,出現下圖介面:
可將首次Generate後出現的未勾選框勾選後進行第二次Generate,截圖如下:
至此完成前期工作。
注:boost庫編譯生成的檔案命名格式為boost_xxx-vc1x0-mt-1_61.lib/dll或是boost_xxx-vc1x0-mt-gd-1_61.lib/dll,但是cmake中僅識別命名格式為boost_xxx.lib/dll格式的檔案(我不知道怎麼修改這個識別問題),因此我將該專案中所需要的lib檔案進行了名稱的更改:
boost_xxx-vc1x0-mt-gd-1_61.lib 改為 boost_xxx.lib。
測試程式
測試landmark_detection專案:
將opencv路徑中的haarcascade_frontalface_alt2.xml檔案移至相關位置。
將landmark_detection.cpp中與路徑有關的程式碼進行更改:
(380行)
("data,d", po::value<fs::path>(&trainingset)->required()->default_value("D:\\superviseddescent-master\\examples\\data\\ibug_lfpw_trainset"),
"path to ibug LFPW example images and landmarks")
("mean,m", po::value<fs::path>(&meanfile)->required()->default_value("D:\\superviseddescent-master\\examples\\data\\mean_ibug_lfpw_68.txt"),
"pre-calculated mean from ibug LFPW")
("facedetector,f", po::value<fs::path>(&facedetector)->required()->default_value("D:\\superviseddescent-master\\examples\\haarcascade_frontalface_alt2.xml"),
"full path to OpenCV's face detector (haarcascade_frontalface_alt2.xml)")
;
即可執行。
執行結果比較
執行結果圖在D:\superviseddescent-master\build\examples
目錄下生成。
原圖:
結果圖:
參考部落格
本人初次接觸人臉對齊方面的專案,十分感謝博主那年聰聰耐心解答我的疑問。