人生苦短,我用python —— 29行代碼實(shí)現(xiàn)人臉識(shí)別
0x00環(huán)境搭建
- VS 2017:提供C++編譯環(huán)境(C++IDE可自行選擇,非不必選安裝)
- 需要將cl.exe配置到環(huán)境變量中,
- cmd中輸入cl,若提示不可運(yùn)行,證明沒(méi)有將VS配置到環(huán)境變量中
- eg:本地cl.exe路徑添加到Path路徑中
-
D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64
cl_02.PNG
-
- 官方文檔VS Command Prompt 工具打開(kāi)方法
-
cmake 官方下載地址
- 功能介紹:Cmake是用來(lái)makefile的一個(gè)工具:讀入所有源文件之后,自動(dòng)生成makefile。
- 圖形界面下一步到最后,安裝過(guò)程順利暫時(shí)無(wú)坑可踩
本地安裝路徑: D:\CMake
-
boost:官網(wǎng)下載
功能介紹:一個(gè)開(kāi)源的C++庫(kù),豐富強(qiáng)大解壓,運(yùn)行批處理,生成bjam.exe,可執(zhí)行文件
-
解壓后路徑地址: D:\Program Files (x86)\boost_1_69_0- 為了支持跨平臺(tái)性,一部分的功能庫(kù),需要根據(jù)用戶(hù)操作系統(tǒng)編譯完成才可以使用
-
編譯步驟
-
首先運(yùn)行批處理腳本,生成編譯引擎bjam.exe。
- 打開(kāi)VS的Native Tools Command,進(jìn)入boost目錄運(yùn)行批處理文件bootstrap回車(chē)
cmd下也可以,在命令行中直接輸入.bat文件的名稱(chēng),回車(chē)即可 - 文件夾內(nèi)會(huì)生成b2.exe, bjam.exe, project-config.jam, 和bootstrap.log四個(gè)文件
-
細(xì)節(jié):
- bjam.exe與b2.exe作用相同,bjam是舊版,b2是新版編譯
- bjam.exe必須與boost-build.jam在同級(jí)目錄,其中jam文件為編譯引擎的配置讀取
-
PS : 通過(guò)命令行運(yùn)行bootstrap.bat和直接雙擊效果相同,但是在命令行中運(yùn)行你會(huì)看到如下提示比一閃而過(guò)要好得多:
run_bat_result.PNG
- 打開(kāi)VS的Native Tools Command,進(jìn)入boost目錄運(yùn)行批處理文件bootstrap回車(chē)
-
開(kāi)始編譯,運(yùn)行bjam.exe(PS:還是推薦用命令方式啟動(dòng)運(yùn)行,有完全編譯和指定編譯兩種選擇)
-
完全編譯在命令行運(yùn)行bjam.exe或b2.exe可執(zhí)行文件,缺省命令參數(shù),根據(jù)已經(jīng)安裝的C++ IDE環(huán)境自行設(shè)置
run_b2.PNG優(yōu)點(diǎn):適用今后開(kāi)發(fā)場(chǎng)景,所有源碼編譯,方便查看源代碼和排查問(wèn)題
-
缺點(diǎn):需要較大的硬盤(pán)空間,編譯時(shí)間長(zhǎng)————看其他大神的安裝教程里提到的
- 自己用公司電腦測(cè)試,編譯完占用5.59G,用時(shí)大約30分鐘左右,感覺(jué)還好了,可以接受
-
編譯順利完成,截圖如下:
run_b2_02.PNG指定設(shè)置參數(shù)編譯:本次未涉及,待后續(xù)試驗(yàn)再補(bǔ)齊
-
完全編譯在命令行運(yùn)行bjam.exe或b2.exe可執(zhí)行文件,缺省命令參數(shù),根據(jù)已經(jīng)安裝的C++ IDE環(huán)境自行設(shè)置
-
配置IDE路徑和環(huán)境變量Path路徑
- 設(shè)置環(huán)境變量
- BOOST_ROOT = D:\Program Files (x86)\boost_1_69_0
- BOOST_LIBRARYDIR = D:\Program Files (x86)\boost_1_69_0\stage\lib
- IDE設(shè)置 以VS2017為例
-
新建一個(gè)C++項(xiàng)目用以測(cè)試boost環(huán)境
test_03.PNG- 源文件--新建test01.cpp,代碼如下。輸入完成后,會(huì)看到有報(bào)錯(cuò)提示,證明此時(shí)VS未加載到boost類(lèi)庫(kù)
#include <boost/lexical_cast.hpp> #include <iostream> int main() { using boost::lexical_cast; int a = lexical_cast<int>("123"); double b = lexical_cast<double>("123.12"); std::cout << a << std::endl; std::cout << b << std::endl; return 0; }
-
設(shè)置VS中boost加載路徑:菜單欄--項(xiàng)目--項(xiàng)目名屬性(Boostest屬性)-- 配置屬性
test_02.PNG- VC++目錄中設(shè)置
- 包含目錄 中 添加 D:\Program Files (x86)\boost_1_69_0
- 庫(kù)目錄 中 添加 D:\Program Files (x86)\boost_1_69_0\stage\lib
- 鏈接器
- 附件庫(kù)目錄 添加 D:\Program Files (x86)\boost_1_69_0\stage\lib
- 疑問(wèn) 為什么我直接仿照配置文件中語(yǔ)法
$(BOOST_ROOT); $(BOOST_LIBRARYDIR); 不識(shí)別呢???
- VC++目錄中設(shè)置
-
編譯
- 配置完boost路徑后,代碼中紅線(xiàn)消失,F(xiàn)5 開(kāi)始編譯代碼,輸出目錄生成exe文件
- 疑問(wèn) 控制臺(tái)中大量“無(wú)法查找或打開(kāi)PDB文件”的解決方法”,原因缺少符號(hào)解析
- 解決 菜單欄--調(diào)試--選項(xiàng)--調(diào)試--
- 常規(guī)設(shè)置 右邊勾選啟用源服務(wù)器支持
-
符號(hào)設(shè)置 右邊勾選微軟符號(hào)服務(wù)器
運(yùn)行完成,不會(huì)再提示無(wú)法查找或打開(kāi)PDB文件了
)
- 解決 菜單欄--調(diào)試--選項(xiàng)--調(diào)試--
-
在命令行打開(kāi)如圖
測(cè)試正常
-
- 設(shè)置環(huán)境變量
-
運(yùn)行實(shí)例驗(yàn)證結(jié)果
- 官方示例
-
-
文檔資料
- dlib
- 類(lèi)庫(kù)介紹
-
下載安裝
- 直接使用pip安裝,電腦安裝了python2和python3兩個(gè)版本,在python3下安裝如下:
-
python3 -m pip install dlib
-
- 直接使用pip安裝,電腦安裝了python2和python3兩個(gè)版本,在python3下安裝如下:
- 使用文檔
- 驗(yàn)證測(cè)試
- 參考資料
- OpenCV
- 下載安裝 pip install opencv_python
0x01人臉識(shí)別示例代碼
import sys
import dlib
import cv2
# 人臉?lè)诸?lèi)器
detector = dlib.get_frontal_face_detector()
for f in sys.argv[1:]:
img = cv2.imread(f, cv2.IMREAD_COLOR)
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
dets = detector(img, 1)
print("Number of faces detected: {}".format(len(dets))) # 打印識(shí)別到的人臉個(gè)數(shù)
for index, face in enumerate(dets):
print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(),
face.bottom()))
left = face.left()
top = face.top()
right = face.right()
bottom = face.bottom()
cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)
cv2.namedWindow(f, cv2.WINDOW_AUTOSIZE)
cv2.imshow(f, img)
# 等待按鍵,隨后退出,銷(xiāo)毀窗口
k = cv2.waitKey(0)
cv2.destroyAllWindows()
驗(yàn)證效果