python人脸照片分类_Python OpenCV 人脸识别(一)
? ? ? ?前面介紹了Numpy模塊,下面再介紹一個(gè)OpenCV模塊,就基于這兩個(gè)庫(kù)看一下當(dāng)下很火的人工智能是如何實(shí)現(xiàn)的,我們介紹幾個(gè):人臉識(shí)別(當(dāng)下非常火的)、音視頻操作等等。今天先介紹一下靜態(tài)圖片的人臉識(shí)別,后面再介紹動(dòng)態(tài)視頻以及攝像頭中的人臉識(shí)別。
一、OpenCV介紹????? OpenCV是一個(gè)基于BSD許可(開(kāi)源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),可以運(yùn)行在Linux、Windows、Android和MacOS操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。
????? OpenCV-Python是OpenCV的PythonAPI,集成了Python語(yǔ)言和C++語(yǔ)言的最優(yōu)特征,致力于支持Python解決計(jì)算機(jī)視覺(jué)問(wèn)題。OpenCV在以下領(lǐng)域有著廣泛的應(yīng)用:
1、人機(jī)互動(dòng)
2、物體識(shí)別
3、圖像分割
4、人臉識(shí)別
5、動(dòng)作識(shí)別
6、運(yùn)動(dòng)跟蹤
7、機(jī)器
8、運(yùn)動(dòng)分析
9、機(jī)器視覺(jué)
10、結(jié)構(gòu)分析
11、汽車(chē)安全駕駛
首先安裝OpenCV模塊,還是依賴于pip工具
在cmd命令中輸入pip install opencv-python,安裝完成之后,模塊是以cv2的名字存在,可以通過(guò)importcv2來(lái)調(diào)用。
二、Numpy對(duì)圖片的操作? ? ? 圖片讀入程序中后,是以numpy數(shù)組存在的。因此對(duì)numpy數(shù)組的一切功能,對(duì)圖片也適用。對(duì)數(shù)組元素的訪問(wèn),實(shí)際上就是對(duì)圖片像素點(diǎn)的訪問(wèn)。
彩色圖片訪問(wèn)方式為:img[i,j,c]。i表示圖片的行數(shù),j表示圖片的列數(shù),c表示圖片的通道數(shù)(RGB三通道分別對(duì)應(yīng)0,1,2)。坐標(biāo)是從左上角開(kāi)始。我們將使用此模塊將Python列表轉(zhuǎn)換為numpy數(shù)組,因?yàn)镺penCV人臉識(shí)別器接受numpy數(shù)組。
示例:
from PIL import Imagecat = Image.open(r'C:\Users\56331\Desktop\cat.jpg')cat>>>cat_data = np.array(cat) cat_data.shape>>>(720, 1280, 3) # 該圖片720行,1280列,3代表RGB(紅、綠、藍(lán))三通道分別對(duì)應(yīng)0,1,2cat2 = cat_data[:,::-1,:] # 將列的方向翻轉(zhuǎn),改變圖片方向Image.fromarray(cat2)>>>cat3 = cat_data[::5, ::5] # 間隔改為5,將圖片縮小Image.fromarray(cat3)>>>import matplotlib.pyplot as plt%matplotlib inlineplt.imshow(cat_data[::15,::15]) # 將圖片變成馬賽克>>>cat6 = cat_data[:,:800] # 截取圖片的一部分plt.imshow(cat6)>>>cat7 = cat_data[:,800:,::-1] # 截取圖片的一部分,并更改顏色plt.imshow(cat7)>>># 兩者拼接成一個(gè)新的圖片cat8 = np.concatenate((cat6,cat7),axis=1)plt.imshow(cat8)>>>三、OpenCV人臉識(shí)別找一張我大兄弟的照片,識(shí)別出他的臉:
先介紹一下OpenCv的常見(jiàn)操作
import numpy as npimport cv2# 讀取照片wu1 = cv2.imread(r'C:\Users\56331\Desktop\me.jpg')wu1.shape?#?查看照片尺寸>>>(300,?300,?3)?#?該照片是300x300的# 顯示圖片cv2.imshow('wu1',wu1)# 等待鍵盤(pán)輸入,單位毫秒,如果是0,無(wú)限等待cv2.waitKey(0)cv2.destroyAllWindows()>>>?#?彈出如下的照片,按q鍵結(jié)束# 把圖片變成黑白# BGR代表藍(lán)綠紅,顏色通道是BGR,區(qū)別于PIL讀取圖片的RGB通道wu2 = cv2.cvtColor(wu1,code=cv2.COLOR_BGR2GRAY)cv2.imshow('wu1',wu2)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>> # 彈出如下的照片# 調(diào)整照片的尺寸wu3 = cv2.resize(wu1,dsize=(150,150))cv2.imshow('wu1',wu3)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()# 保存圖片,成功返回Truecv2.imwrite(r'C:\Users\56331\Desktop\me2.jpg',wu3)>>> True下面開(kāi)始進(jìn)行人臉識(shí)別? ? ? opencv的包中自帶有人臉?lè)诸惼?#xff0c;可以方便實(shí)現(xiàn)對(duì)人臉、人眼和微笑的檢測(cè),值得注意的是人臉?lè)诸惼鲗?duì)于正臉有較好的提取,對(duì)于側(cè)臉就需要其他的了。
示例1:人臉 - haarcascade_frontalface_default.xml
人眼 - haarcascade_eye.xml
微笑 - haarcascade_smile.xml
對(duì)于照片中的多張人臉識(shí)別
# 多張人臉識(shí)別import numpy as npimport cv2wu = cv2.imread(r'C:\Users\56331\Desktop\me2.jpg')detector = cv2.CascadeClassifier(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')face_zone = detector.detectMultiScale(wu , scaleFactor=1.01 , minNeighbors=1 , minSize=(100,100) , maxSize=(150,150) )for x,y,w,h in face_zone: cv2.rectangle(wu,pt1=(x,y),pt2=(x+w, y+h), color = [0,0,255],thickness=2)cv2.imshow('wu3',wu)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>>?如下所示,四張人臉均被識(shí)別出來(lái)了detectMultiScale中涉及到的幾個(gè)重要參數(shù):
| image | CV_8U類型的矩陣,其中包含在其中檢測(cè)到對(duì)象的圖像。 |
| objects | 矩形向量,其中每個(gè)矩形都包含檢測(cè)到的對(duì)象,這些矩形可能部分位于原始圖像的外部。 |
| numDetections | 相應(yīng)對(duì)象的檢測(cè)編號(hào)向量。對(duì)象的檢測(cè)次數(shù)是連接在一起以形成對(duì)象的相鄰的正面分類矩形的數(shù)目。 |
| scaleFactor | 該參數(shù)指定每個(gè)圖像比例縮小多少圖像尺寸。 |
| minNeighbors | 該參數(shù)指定每個(gè)候選矩形必須保留多少個(gè)鄰居。 |
| flags | 與舊級(jí)聯(lián)的含義相同的參數(shù),與函數(shù)cvHaarDetectObjects中的含義相同。它不用于新的級(jí)聯(lián)。 |
| minSize | 最小可能的對(duì)象大小。小于此值的對(duì)象將被忽略。 |
| maxSize | 最大可能的對(duì)象大小。大于此值的對(duì)象將被忽略。如果maxSize == minSize模型以單一比例評(píng)估。 |
識(shí)別NBA全明星的臉
import numpy as npimport cv2photo = cv2.imread(r'C:\Users\56331\Desktop\NBA.jpg')detector = cv2.CascadeClassifier(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')face_zone = detector.detectMultiScale(wu , scaleFactor=1.1 , minNeighbors=1 , minSize=(10,10) , maxSize=(30,30) )num = 0 # 統(tǒng)計(jì)人數(shù)for x,y,w,h in face_zone: num = num + 1 cv2.circle(photo, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2) # 顯示文字# cv2.putText(photo, str(num), (x,y), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 1)# 總?cè)藬?shù) cv2.putText(photo, "{}people".format(num), (10,50), cv2.FONT_HERSHEY_COMPLEX, 1, (142, 125, 52), 1)cv2.imshow('NBA',photo)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>>結(jié)果如下? ? ? 識(shí)別出了11個(gè)人,有一個(gè)人識(shí)別不出來(lái),還有一處地方識(shí)別錯(cuò)誤,識(shí)別成功率比較高。需要調(diào)整相應(yīng)的參數(shù)來(lái)調(diào)整。
? ? ? 以上就是對(duì)于靜態(tài)圖片的人臉識(shí)別,當(dāng)然了前面還有對(duì)眼睛瞪的識(shí)別,可以多加嘗試。后面的話將介紹如何識(shí)別出視頻中的人臉,以及自己在攝像頭的人臉,并可以用其他圖片來(lái)代替自己的臉。
總結(jié)
以上是生活随笔為你收集整理的python人脸照片分类_Python OpenCV 人脸识别(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 括号序列
- 下一篇: python变量名可以包含的字符有问号吗