python 识别图片中的人脸,并裁人脸,将图片转化成指定大小,并将图片再原文件名保存。

      因工作的原因,每年11月都要处理很多(1000张以上)的照片,并而要把照片处理成一寸大小。因为传统的方式一张一张处理,很费时间,只要是学过计算机都不可能一张一张处理的,之前我都是用软件的批理处理实现的,但是总会有照片,会被裁剪没有耳朵,或者没有头发。早就听说python语言语可以实现人工智能,那思路很简单。让python自动识别人脸,然后裁剪出指定大小,不就可以了吗。

        说干就干先百度一下,找到了下面的文章,python 识别图片中的人脸,并裁人脸,将图片转化成指定大小,并将图片再原文件名保存。_第1张图片

 import cv2
import os
import glob
#最后剪裁的图片大小
size_m = 48
size_n = 48
def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:, 2:] += rects[:, :2]
    return rects
 
cascade = cv2.CascadeClassifier("cascades\\haarcascade_frontalface_alt2.xml")
imglist=glob.glob("data/image/jaffe/*")
for list in imglist:
    
    #print(list)
    # cv2读取图像
    img = cv2.imread(list)
    dst=img
    rects=detect(dst,cascade)
    for x1,y1,x2,y2 in rects:
        #调整人脸截取的大小。横向为x,纵向为y
        roi = dst[y1+10 :y2+20, x1+10 :x2 ]
        img_roi = roi
        re_roi = cv2.resize(img_roi, (size_m, size_n))
        
        #新的图像存到data/image/jaffe_1
        f = "{}/{}".format("data/image", "jaffe_1")
        #print(f)
        if not os.path.exists(f):
            os.mkdir(f)
        #切割图像路径
        path=list.split(".")
        
        #新的图像存到data/image/jaffe_1   并以jpg 为后缀名
        cv2.imwrite("{}/{}_{}.jpg".format(f,path[1],path[2]), re_roi)

以上是“工科扫地僧”的代码。首先要感谢,他的分享。第一步就是搭建环境,发现在dos 一句一句的输入代码太痛苦了。所以下载了vs2019 。python 识别图片中的人脸,并裁人脸,将图片转化成指定大小,并将图片再原文件名保存。_第2张图片

 方便调试。因本人也是第一次用python,每一步都很百度了很久,比如opencv下载安装用了一天多。告诉大家一个方法,遇到困难或错误提示百度一下,但是基本上关于编程方面的问题,csdn上面是最多的,也是最靠普的。下面我把自己的代码贴出来,大家参考一下。

import cv2
import os
import glob
#最后剪裁的图片大小
size_m = 295
size_n = 413
def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:, 2:] += rects[:, :2]
    return rects
 
cascade = cv2.CascadeClassifier("d:\\cascades\\haarcascade_frontalface_alt2.xml")
# print (cascade)
imglist=glob.glob("d:\data\image\jaffe\*.jpg")
 # print glob.glob("data\image\jaffe\*")
# print (imglist)
for list in imglist:    
    # print(list)
    # cv2读取图像
    img = cv2.imread(list)
    dst=img
    rects=detect(dst,cascade)
    for x1,y1,x2,y2 in rects:
        #调整人脸截取的大小。横向为x,纵向为y 
        roi = dst[y1-700 :y2+500, x1-400 :x2+350]  
        img_roi = roi
        re_roi = cv2.resize(img_roi, (size_m, size_n))
        
        #新的图像存到data/image/jaffe_1
        f = "{}/{}".format("d:/data/image", "jaffe_1")
        print(f)
        if not os.path.exists(f):
            os.mkdir(f)
        #切割图像路径
        path=list.split("\\")
        print(path)
        # print(path[1])
        # print(path[1])
        #新的图像存到data/image/jaffe_1   并以jpg 为后缀名
        cv2.imwrite("{}/{}".format(f,path[4]), re_roi)

这是我修改后可以用的代码。识别率能达到98%,就是一百张照片里有一张或二张没有达到我的要求 。

效果如下:

python 识别图片中的人脸,并裁人脸,将图片转化成指定大小,并将图片再原文件名保存。_第3张图片

 如果出现下面错误提示

Message=OpenCV(4.5.4-dev) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\resize.cpp:4051: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

把这里dst[y1-700 :y2+500, x1-400 :x2+350]  的数值改小一点,我想应该照片左上的坐标程序取不到,或者是超出照片的范围了。

好了,其实我也不是专业的,只是有这个想法,然后通过csdn上的文章来实现自己工作中遇到的问题。如果能对你有所帮助最好了,没有就可以划过去,谢谢。

你可能感兴趣的:(python,学习编程,python,开发语言,后端)