Day6:人脸识别基础、定位图片中人脸、调用摄像头识别人脸、人脸数据清洗、新建项目报错“please specify a different sdk name“、人脸识别

Day6:人脸识别基础、定位图片中人脸、调用摄像头识别人脸、人脸数据清洗、新建项目报错“please specify a different sdk name“、人脸识别,第1张

人脸识别基础

这里写目录标题
  • 人脸识别基础
  • 定位图片中人脸
  • 调用摄像头识别人脸
  • 人脸数据清洗
  • 新建项目报错"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()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719141.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存