Dlib19.7編譯方法_Part1.五個步驟成功Compile Dlib_執行程式

這次要來介紹到
Dlib這套工具的使用






準備工具:
1.  Dlib
http://dlib.net
2. Cmake3.8  x64版
https://cmake.org/download/
https://cmake.org/files/

1.  Dlib
最新已經釋出至19.7版本
http://dlib.net/release_notes.html


Dlib當你完成下載完之後
解壓縮

配置路徑
C:\dlib-19.7



2. Cmake3.8  x64版 (建議下載之後存放路徑用指令編譯)





接著輸入指令(依照官網英文教程:http://dlib.net/compile.html)

用系統管理員身分執行開啟  小CMD視窗後
到Dlib該目錄下方
建立一個空目錄名為build

cd C:\dlib-19.7
mkdir build
cd build
cmake -G "Visual Studio 14 2015 Win64" ..



cmake --build . --config Release


建置好後心情就還真是不錯  GUI之前一直遇到怪異問題 = =|||

===================================================================

緊接著建新專案
試著Run程式




===================================================================
配置

Step1. VC++  Include Dependencies 
增加 C:\dlib-19.7


Step2.

Linker -->  General --> Additional Library Directories:

輸入
C:\dlib-19.7\dlib\
C:\dlib-19.7\dlib\external


Linker --> 輸入 --> Additional Dependencies :
輸入
C:\dlib-19.7\build\dlib\Release\dlib.lib



Step3.
C/C++ --->  General  ---> Additional Include Directories:
輸入
C:\dlib-19.7\dlib\external\zlib
C:\dlib-19.7\dlib\external\libpng
C:\dlib-19.7\dlib\external\libjpeg
C:\dlib-19.7\dlib\external\cblas
選 NO SDL




C/C++ --->  Preprocessor  --->  Preprocessor Definitions:
輸入
DLIB_JPEG_SUPPORT.....1
DLIB_PNG_SUPPORT.....2
DLIB_HAVE_AVX.....3

為了開啟  jpg圖檔還需加入....1
P為了開啟 NG圖檔.........2
為了加速處理加入.......3





Step4.
請加入dlib\external 下方目錄中的所有開圖檔程式原碼檔案

加入如下所列出的目錄下的  .h檔  .c檔案  .cpp檔
dlib\external\libjpeg
dlib\external\libpng
dlib\external\zlib

Step5. 進行 Fatal Error LNK 1169錯誤修正
如果直接運行會出錯
fatal error LNK1169: one or more multiply defined symbols found
錯誤原因在於剛加入至 Resource母錄下的可能有重複程式檔案名

因此
再到連結器屬性頁

可參考至MSDN 及相關Blog說明
https://msdn.microsoft.com/zh-tw/library/024awkd1.aspx
https://msdn.microsoft.com/zh-tw/library/70abkas3.aspx
http://blog.csdn.net/xcntime/article/details/4122982

=======================================================================


上面五個步驟配置流程完成了後

就可以自己寫Code或者運行dlib自帶的examples程式了。


但是官方自帶的程序都是命令行運行的
因此若要在Visual Studio中運行則需要稍作修改

把命令行參數修改為具體的文件名或者路徑。

如下參照範例先自寫一個人臉偵測例子


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<dlib/image_processing/frontal_face_detector.h>  
#include<dlib\image_processing\render_face_detections.h>  
#include<dlib\image_processing.h>  
#include<dlib\gui_widgets.h>  
#include<dlib\image_io.h>  

#include<iostream>  
#include<vector>  


//#define DDLIB_JPEG_SUPPORT  
//#define DLIB_PNG_SUPPORT  


using namespace dlib;
using namespace std;

int main(int argc, char **argv)
{
 try
 {
  frontal_face_detector detector = get_frontal_face_detector();

  image_window win;//顯示窗口物件 

  array2d<unsigned char> img;
  cout << "processing image" << argv[1] << endl;
  load_image(img, argv[1]);//載入一張圖
  pyramid_up(img);//對影像進行採樣並偵測更小人臉部分  

  //開始偵測,回傳一邊框序列
  std::vector<rectangle> dets = detector(img);//detector()回傳一系列邊界盒子  

  cout << "Number of faces detected:" << dets.size() << endl;//在原始影像上顯示運算结果   
                   
  win.clear_overlay();
  win.set_image(img);
  win.add_overlay(dets, rgb_pixel(255, 0, 0));//紅色像素通道進行偵測邊框填充
  cout << "Hit enter to process the next image..." << endl;
  cin.get();
 }
 catch (const std::exception& e)
 {
  cout << "\nexception thrown!" << endl;
  cout << e.what() << endl;
 }
 getchar();
}

第  27行  argv[1]需再額外設置圖檔路徑名字串

我取這張圖當作輸入


截自  Youtube: [Official Video] Daft Punk - Pentatonix
https://www.youtube.com/watch?v=3MteSlpxCpo&list=PLcOD6drVLxLOEpGnXRPrlLwCQco32qNhY&index=15


由於存出來之圖檔為   PNG  請先回至剛才地方多配置


int main(int argc, char **argv)

主要於平常我們會直接寫成
int main()


其實第一句是UNIX /Linux 中標準main函數命令列參數個數喔~~~

第一個int argc 是用來統計程式執行時發送給main函數之命令參數個數
(預設為1)

第二個 char **argv  或也有人寫  char *argv[]
為字串陣列

每一個當中元素各自指向一個特定含意的參數
argv[0]         ---> 程式運行之路徑全名
argv[1]         ---> 於DOS命令列中執行程式名的第一個字串
argv[2]        ---> 於DOS命令列中執行程式名的第二個字串
argv[3]        ---> 於DOS命令列中執行程式名的第三個字串
argv[argc]  -----> NULL




這裡在執行之前請在注意

運行後結果



==================================================================
參考資源:
Dlib + VS2013 人脸检测,无需CMAKE
http://blog.csdn.net/shuzfan/article/details/52149882

[随感]fatal error LNK1169: one or more multiply defined symbols found终极解决
http://blog.csdn.net/xcntime/article/details/4122982

/FORCE (強制檔案輸出)
https://msdn.microsoft.com/zh-tw/library/70abkas3.aspx
連結器屬性頁
https://msdn.microsoft.com/zh-tw/library/024awkd1.aspx

“error LNK2001: unresolved external symbol”
https://stackoverflow.com/questions/6598181/error-lnk2001-unresolved-external-symbol

How to fix?: error LNK2001: unresolved external symbol "extern "C" ........
https://social.msdn.microsoft.com/Forums/vstudio/en-US/4523e57a-c16b-4378-8c42-52f7cf5b98da/how-to-fix-error-lnk2001-unresolved-external-symbol-extern-c-?forum=vclanguage


[转载](转)error LNK2001原因总汇
http://blog.sciencenet.cn/blog-836964-693144.html


Dlib在Visual Studio 2015上的編譯和配置(超簡單版)
http://blog.csdn.net/xingchenbingbuyu/article/details/53236541

Dlib 19.2+VS2015 人脸检测(非CMake)
http://blog.csdn.net/qq_22764813/article/details/53053232





留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header