Python用 opencv识别文件中所有照片出现人脸的图片(效果很差,可以自己改进,优点速度快)

代码:

import cv2
import os
import numpy as np
'''
用opencv 识别人脸效果太差  单独照片还好 手机随即拍摄的效果太差
'''
# 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
def read_directory(directory_name):
    for filename in os.listdir(directory_name):
        a= filename.split(".")[-1]
        if str(a) in ["JPG",'PNG','jpg','png']:
            # 用matplotlib的路径
            img1 = directory_name + "\\" + filename
            img =  cv2.imdecode(np.fromfile(img1, dtype=np.uint8), -1) #防止地址中有中文
            #resize(img, frame, Size(800, 600), 0, 0, CV_INTER_LINEAR)
            #img = cv2.resize(img2, (800, 600))
            # print(img1)
            #img = cv2.imread(img1)  # 读取图片
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换灰色cv2.COLOR_BGR2GRAY 换了下
            # OpenCV人脸识别分类器
            classifier = cv2.CascadeClassifier(
                'D:\Study\python__gongju\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml' #不要有中文
            )
            color = (0, 255, 0)  # 定义绘制颜色
            # 调用识别人脸
            faceRects = classifier.detectMultiScale(
                gray, scaleFactor=1.2, minNeighbors=5, minSize=(5, 5))
            if len(faceRects) > 0:  # 大于0则检测到人脸
                for faceRect in faceRects:  # 单独框出每一张人脸
                    x, y, w, h = faceRect
                    # 框出人脸
                    cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
                    # 左眼
                    cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),
                               color)
                    # 右眼
                    cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),
                               color)
                    # 嘴巴
                    cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),
                                  (x + 5 * w // 8, y + 7 * h // 8), color)
                '''
                cv2.imshow("image", img)  # 显示图像
                k = cv2.waitKey(0)
                if k == ord("s"):
                    cv2.imwrite("imagePath/9-2.png", img)
                '''
                b = filename.split(".")[-2]
                cv2.imwrite(r"H:\renwu__opencv\nnn%s.%s" %(b,a), img) #识别有人脸的图片 保存地址 不想有方框 参考dlib识别全部图片
                # print(filename)
                cv2.destroyAllWindows()
        else:
            print('跳过!')




read_directory(r'H:\renwu__opencv')#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)不要有中文

 

posted @ 2020-10-22 18:32  凹凸曼大人  阅读(417)  评论(0)    收藏  举报