日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python人脸照片分类_Python OpenCV 人脸识别(一)

發(fā)布時(shí)間:2023/12/10 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python人脸照片分类_Python OpenCV 人脸识别(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ?前面介紹了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

import numpy as npimport cv2# 讀取圖片wu = cv2.imread(r'C:\Users\56331\Desktop\me.jpg')# 人臉數(shù)據(jù),級(jí)聯(lián)分類器,給人臉特征數(shù)據(jù),返回可以識(shí)別人臉的對(duì)象detector = cv2.CascadeClassifier(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')# 獲取人臉區(qū)域face_zone = detector.detectMultiScale(wu)# 繪制人臉框for x,y,w,h in face_zone: cv2.rectangle(wu,pt1=(x,y),pt2=(x+w, y+h), color = [0,0,255])cv2.imshow('wu',wu)cv2.waitKey(5000) # 停留5scv2.destroyAllWindows()>>>?如下所示,識(shí)別出了帥氣的臉

示例2:

對(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ù):

imageCV_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)估。
示例3:

識(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。