- 人脸识别基础
- 定位图片中人脸
- 调用摄像头识别人脸
- 人脸数据清洗
- 新建项目报错"please specify a different sdk name"
- 图像清洗,得到相同数量的图片
- 人脸识别项目
print("人脸识别基础")
# OpenCV是计算机视觉和机器学习软件库
# 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成
# 实现了图像处理和计算机视觉方面的很多通用算法
# OpenCV主要倾向于实时视觉应用
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
import cv2
# 人脸识别规矩:1.不要选模糊看不清 2.尽量挑选正脸照片,侧脸需要训练
# 摄像头:逐帧,1秒24帧
def readImg():
# 读取图片
img=cv2.imread("img/ma.jpg")
# 三维数组 (856, 857, 3)高 宽 像素维度(3是因为三原色)
# 三原色rgb ---- 三原色像素BGR
print(img.shape)
# 调整图片大小
# 500x700
# img=cv2.resize(img,dsize=(300,300)) 等比例缩放图片
img=cv2.resize(img,None,fx=0.5,fy=0.5)
cv2.imshow("mayun",img) # 显示图片 imshow("窗口名称",被显示图片)
cv2.waitKey() # 等待延迟关闭的时间,单位:毫秒
cv2.destroyAllWindows() # 释放资源
readImg()
定位图片中人脸
print("定位图片中人脸")
import cv2
def showFace():
img = cv2.imread("img/physic2.jpg")
faceData = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml") #导入人脸特征数据包
img = cv2.resize(img,None,fx=0.5,fy=0.5)
# scaleFactor缩放因子,默认值1.3,值越大,扫描越粗糙 ,越容易忽略细节,优点:扫描时间会变短,值越小,会越精致,执行时间会比较长
# 缩放因子必须大于1
# minNeighbors最小邻居值,默认值3,值越大,越苛刻
faces = faceData.detectMultiScale(img,scaleFactor=1.05,minNeighbors=1) # 对图片进行人脸数据对比
# 检测成功,找到人脸,返回人脸数据,如果没有人脸,返回一个 空元组“()”,元组只能查看不能修改;数组可以增删改查
#print(faces) #[[242 123 402 402]] x,y,w宽,h高
for x,y,w,h in faces:
cv2.rectangle(img,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,225],thickness=2)
cv2.imshow("ma",img)
cv2.waitKey()
cv2.destroyAllWindows()
showFace()
调用摄像头识别人脸
import cv2
img = cv2.imread("img/ma.jpg")
img = cv2.resize(img,None,fx=0.5,fy=0.5)
print(img.shape)
img = cv2.cvtColor(img,code=cv2.COLOR_BGR2GRAY) #降维 2(to) GRAY黑色
print(img.shape)
cv2.imshow("ma",img) #(428, 428, 3) 三维数组 彩色照片 三维数组 彩色照片 降维 黑白照片二维数组
cv2.waitKey()
cv2.destroyAllWindows()
# import cv2
# img=cv2.imread("img/ma.jpeg")
# img=cv2.resize(img,None,fx=0.5,fy=0.5)
# print(img.shape)
# # (428, 428, 3)三维数组
# # 彩色照片 三维数组 100kb
# # 降维 黑白照片 二维数组 5kb
# img=cv2.cvtColor(img,code=cv2.COLOR_BGR2GRAY)
# print(img.shape)
# cv2.imshow("ma",img)
# cv2.waitKey()
# cv2.destroyAllWindows()
人脸数据清洗
print("调用摄像头识别人脸")
import cv2
def showVideoFace():
name = 1
# 调用本地摄像头,0允许被打开
video = cv2.VideoCapture(0)
faceData = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml") # 导入人脸特征数据包
#死循环无线截取人脸
while(True):
# videoImg截取到每一帧人脸图片 flag确认是否获取到人脸
flag,videoImg = video.read()
#print(videoImg.shape)
videoImg = cv2.flip(videoImg,1)
# 人脸数据对比
face = faceData.detectMultiScale(videoImg)
#print(face)
face = faceData.detectMultiScale(videoImg, scaleFactor=1.05, minNeighbors=4)
for x, y, w, h in face:
cv2.rectangle(videoImg, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 225], thickness=2)
# 如果脸部信息是非元组,说明识别到人脸
if not isinstance(face,tuple):
facePhoto = videoImg[y:y + h,x:x + w]
#将切片照片装入文件夹
cv2.imwrite("ren/0/%s.jpg"%name,facePhoto)
print("第%s张人脸数据保存完毕"%name)
name += 1
cv2.imshow("jiao ",videoImg)
index = cv2.waitKey(1000//24) #摄像头:逐帧1秒24帧
# 点击空格,关闭窗口,ascii值
if(index == 32):
print("窗口即将关闭")
break
cv2.destroyAllWindows()
showVideoFace()
新建项目报错"please specify a different sdk name"
图像清洗,得到相同数量的图片解决方法:删除红框中重复的, 问题解决。
import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split #机器学习的方法scikit-learn
from sklearn.neighbors import KNeighborsClassifier
def loadFaceData():
per = 2
dirs = os.listdir("ren/%s/"%per) #当前目录下的所有子文件
nameList = [] #存储所有图片名
for d in dirs:
nameList.append(int(d.split(".")[0])) #通过点截取每个数字
#print(nameList)
npNameList = np.array(nameList) #数据本身不会变,转化成numy,可用的方法更多
# 1.找出大于100的,flag布尔类型
flag = npNameList > 100
moreThan100 = npNameList[flag]
# 1.找出小于100的,flag布尔类型
lessThan100 = npNameList[npNameList <= 100]
# 找出小于100中少了谁
compareTo100 = np.arange(1,101) #生成1~100的完整序列
#找出两组不同,查看缺失的图片
loseName = list(set(compareTo100).difference(lessThan100))
#print(loseName)
for i,file in enumerate(moreThan100): #大于100的处理
try:
#修改图片名字rename(原名字,修改名)
os.rename("ren/%s/%s.jpg"%(per,file),"ren/%s/%s.jpg"%(per,loseName[i])) #修改图片名字
except:
os.remove("ren/%s%s.jpg"%(per,file))
for i in loseName: #小于100的处理
randomName = np.random.choice(lessThan100,size = 1)[0] #随机从小于100中复制
img = cv2.imread("ren/%s/%s.jpg"%(per,randomName))
cv2.imwrite("ren/%s/%s.jpg"%(per,i),img)
print(randomName)
for i in compareTo100:
img = cv2.imread("ren/%s/%s.jpg"%(per,i)) #将所有图片读出来
newImg = cv2.resize(img,dsize = (64,64)) #将所有图片改统一尺寸
cv2.imwrite("ren/%s/%s.jpg"%(per,i),newImg) #将修改后的图片装回去
print("successd")
loadFaceData()
人脸识别项目
from sklearn.model_selection import train_test_split #机器学习的方法scikit-learn
from sklearn.neighbors import KNeighborsClassifier
import cv2
import numpy as np
def loadData():
faceList=[]# 存放所有脸部数据
for i in range(3):
for j in range(1,101):
img = cv2.imread("ren/%s/%s.jpg"%(i,j)) #读取每个人的每一张脸
grayImg = cv2.cvtColor(img,code=cv2.COLOR_BGR2GRAY)
faceList.append(grayImg) #将脸部数据装入数组
y = []
for i in range(3):
y.append(i)
# 扩张100倍
y = y*100
y = sorted(y)
# print(y)
faceList = np.array(faceList)
y = np.array(y)
# 将数据进行机器学习处理 一共3个人 共计300张照片 每张照片有64X64=4096个像素
faceList = faceList.reshape(300,4096)
#数据拆分 300张脸 0.9的训练 0.1的测试
return train_test_split(faceList,y,test_size=0.1)
if __name__ == '__main__':
# X_train用来训练 X_test用来测试
#y_train标记训练 y_test
X_train,X_test,y_train,y_test = loadData()
label = ["jiao","xi","zi"] #按照人脸存放顺序
knn = KNeighborsClassifier(5)
knn.fit(X_train,y_train) #训练
y_ = knn.predict(X_test) #预测
for i in range(30):
cv2.namedWindow("who",flags=cv2.WINDOW_GUI_NORMAL)
cv2.resizeWindow("who",width=300,height=300)
cv2.imshow("who",X_test[i].reshape(64,64))
print("这是:",label[y_[i]])
index = cv2.waitKey()
if(index==32):
print("识别结束")
break
cv2.destroyAllWindows()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)