1. 程式人生 > >Win下 C++版SDM(Supervised Descent Method)演算法實現

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編譯而成)如果選擇未編譯版則需要自己進行編譯。編譯過程如下:

  1. Win+R後彈出執行框
  2. 輸入cmd後回車進入命令列視窗
  3. 使用cd命令進入boost解壓路徑
  4. 在命令列執行bootstrap.bat檔案,操作為:輸入bootstrap.bat後回車,原路徑自動生成bjam.exe檔案
  5. 執行bjam.exe檔案(系統會自動匹配已有編譯器)
  6. 編譯完成

CMake 官網下載地址
選擇下載windows版本.msi檔案。下載完成執行,選擇安裝目錄,隨後在目錄中進入bin目錄裡雙擊cmake-gui.exe即可進入CMake的gui介面。
具體cmake過程如下:

  1. 在原始碼解壓路徑中新增build資料夾(用以放置cmake後的專案檔案,也可選擇其他路徑)

  2. 將原始碼完整路徑新增至gui介面的where is source code部分,將build資料夾完整路徑新增至where to build the binaries部分。如圖:
    這裡寫圖片描述

  3. 單擊Configure,在彈窗中選擇編譯器後回車。
    這裡寫圖片描述

  4. 找不到opencv相關檔案,出現如圖所示錯誤介面:
    這裡寫圖片描述

  5. OpenCV_DIR中新增相關路徑,我的為:F:/opencv/build

  6. 點選Configure後會出現新的錯誤,提示找不到Eigen相關檔案,在EIGEN3_INCLUDE_DIR中新增路徑F:\Eigen\Eigen3.2.9即可成功configure,截圖如下:
    這裡寫圖片描述

  7. 勾選BUILD_DOCUMENTATIONBUILD_TESTS點選Generate,完成首次Generate,出現下圖介面:
    這裡寫圖片描述

  8. 可將首次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目錄下生成。

原圖:
這裡寫圖片描述

結果圖:
這裡寫圖片描述

參考部落格
本人初次接觸人臉對齊方面的專案,十分感謝博主那年聰聰耐心解答我的疑問。