Python3結合Dlib實現人臉識別和剪下

2022-09-28 20:51:22 字數 2895 閱讀 3180

利用python開發,借助dlib庫進行人臉識別,然後將檢測到的人臉剪下下來,依次排序顯示在新的影象上;

實現的效果如下圖所示,將圖1原圖中的6張人臉檢測出來,然後剪下下來,在影象視窗中依次輸出顯示人臉;

實現比較簡單,**量也比較少,適合入門或者興趣學習。

圖1 原圖和處理後得到的影象視窗

python:  3.6.3

dlib:    19.7

opencv, numpy

import dlib # 人臉識別的庫dlib

import numpy as np # 資料處理的庫numpy

import cv2 # 影象處理的庫opencv

工作內容主要以下兩大塊:dlib人臉檢測 和 繪製新影象

2.1 dlib人臉檢測:

dlib的使用,在我之前另一篇部落格裡面介紹過(link: 

2.2 繪製新影象:

2.2.1 確定空白影象尺寸

這部分首先要根據檢測到的人臉數和人臉大小,來確定繪製影象所需要的尺寸:      

多張人臉要輸出到一行,先進行一次人臉的遍歷,記每張人臉的尺寸為height*width(高度和寬度說明見圖2),

我取的生成影象的尺寸:height_max(最大高度)和width_sum(寬度之和),然後根據尺寸大小來新建空白影象:

img_blank = np.zeros((height_max, width_sum, 3), np.uint8)

2.2.2 影象填充

然後再進行一次人臉遍歷,這次進行空白影象img_blank進行填充:

for i in range(height):

for j in range(width):

img_blank[i][blank_start+j] = img[d.top()+i][d.left()+j]

圖2 影象尺寸說明

如果想訪問影象的某點畫素,可以利用img[height][width]:

儲存畫素其實是乙個三維陣列,先高度height,然後寬度wwww.cppcns.comidth;

返回的是乙個顏色陣列(0-255,0-255,0-255),按照(bwww.cppcns.com, g, r)的順序,比如 藍色 就是(255,0,0),紅色 是(0,0,255);

# 2018-01-22

# by timestamp

# #cnblogs: http://ww程式設計客棧w.cnblogs.com/adaminxie/

import dlib # 人臉識別的庫dlib

import numpy as np # 資料處理的庫numpy

import cv2 # 影象處理的庫opencv

# dlib**器

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

# 讀取影象

# dlib檢測

d程式設計客棧ets = dete程式設計客棧ctor(img, 1)

print("人臉數:", len(dets))

# 記錄人臉矩陣大小

height_max = 0

width_sum = 0

# 計算要生成的影象img_blank大小

for k, d in enumerate(dets):

# 計算矩形大小

# (x,y), (寬度width, 高度height)

pos_start = tuple([d.left(), d.top()])

pos_end = tuple([d.right(), d.bottom()])

# 計算矩形框大小

height = d.bottom()-d.top()

width = d.right()-d.left()

# 處理寬度

width_sum += width

# 處理高度

if height > height_max:

height_max = height

else:

height_max = height_max

# 繪製用來顯示人臉的影象的大小

print("img_blank的大小:")

print("高度", height_max, "寬度", width_sum)

# 生成用來顯示的影象

img_blank = np.zeros((height_max, width_sum, 3), np.uint8)

# 記錄每次開始寫入人臉畫素的寬度位置

blank_start = 0

# 將人臉填充到img_blank

for k, d in enumerate(dets):

height = d.bottom()-d.top()

width = d.right()-d.left()

# 填充

for i in range(height):

for j in range(width):

img_blank[i][blank_start+j] = img[d.top()+i][d.left()+j]

# 調整影象

blank_start += width

cv2.namedwindow("img_faces", 2)

cv2.imshow("img_faces", img_blank)

cv2.waitkey(0)

結果:圖3 原圖和處理後得到的影象視窗

Python3結合Sciter編寫桌面程式第三節

繼續.基礎框架搭好了,下面來正式的來乙個專案吧 behance 全球設計師的作品展示平台 就從這拉幾張圖吧,具體的網頁解析方式網上有很多,在此略過,我已經取出了一些位址,儲存在了list.txt裡,這次就用這些吧。即asyncio 框架則用了aiohttp 問題這裡可以在程式啟動的時候設定乙個配置列...

python3實現CryptoJS AES加密演算法

from crypto.cipher import aes from binascii import b2a hex,a2b hex import base64 class aescrypt def init self,key self.key key.encode utf8 self.mode a...

python3 dlib實現人臉識別和情緒分析

一 介紹 我想做的是基於人臉識別的表情 情緒 分析。看到網上也是有很多的開源庫提供使用,為開發提供了很大的方便。我選擇目前用的比較多的dlib庫進行人臉識別與特徵標定。使用python也縮短了開發周期。官網對於dlib的介紹是 dlib包含廣泛的機器學習演算法。所有的設計都是高度模組化的,快速執行,...