因工作的原因,每年11月都要处理很多(1000张以上)的照片,并而要把照片处理成一寸大小。因为传统的方式一张一张处理,很费时间,只要是学过计算机都不可能一张一张处理的,之前我都是用软件的批理处理实现的,但是总会有照片,会被裁剪没有耳朵,或者没有头发。早就听说python语言语可以实现人工智能,那思路很简单。让python自动识别人脸,然后裁剪出指定大小,不就可以了吗。
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,每一步都很百度了很久,比如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%,就是一百张照片里有一张或二张没有达到我的要求 。
效果如下:
如果出现下面错误提示
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上的文章来实现自己工作中遇到的问题。如果能对你有所帮助最好了,没有就可以划过去,谢谢。