在网上爬取了成吨的图像之后,要想对人脸进行特征提取或者转换等一系列后续操作,还需要将人脸部分截取出来。
使用github上一个基于opencv的工具:nagadomi/lbpcascade_animeface。
虽然他给了一个例子,但还是需要自己调整编写一下使用代码。
import cv2,random
from PIL import Image
from PIL import ImageFile
import imghdr
import sys
import os.path
from glob import glob
def detect(filename, cascade_file="../lbpcascade_animeface.xml"):
if not os.path.isfile(cascade_file):
raise RuntimeError("%s: not found" % cascade_file)
cascade = cv2.CascadeClassifier(cascade_file)
# 这一段是为了防止数据集中有非jpg的图像,如果有,即转换一下格式
ImageFile.LOAD_TRUNCATED_IMAGES = True
if imghdr.what(filename) == "png":
Image.open(filename).convert("RGB").save(filename)
######
image = cv2.imread(filename)
# print(image.shape)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
faces = cascade.detectMultiScale(gray,
# detector options
scaleFactor=1.1,
minNeighbors=5,
minSize=(48, 48))
for i, (x, y, w, h) in enumerate(faces):
face = image[y:y + h, x:x + w, :]
face = cv2.resize(face, (96, 96))
save_filename = '%s-%d.jpg' % (os.path.basename(filename).split('.')[0], i)
cv2.imwrite("faces/" + save_filename, face)
if __name__ == '__main__':
if os.path.exists('faces') is False:
os.makedirs('faces')
file_list = glob('C:\\Users\changjianhui\Pictures\imgs\FStar\*.jpg')
for filename in file_list:
# print(filename)
detect(filename)
由于我们在网上下的图像的实际类型比较杂,经常混有许多实际类型不是.jpg,或者图像类型不明的图,此时就会持续报一个错:
cv2.error: C:\ci\opencv_1512688052760\work\modules\imgproc\src\color.cpp:11048: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor
我在调试时,读取图像之后,使之输出:
print(image.shape)
即可获得每一张图像的通道数,当nonType的图像出现,我们可以判定这张图是非法图像,去除即可。出现其他错误优先检查路径和类型是否正确。
效果图如下:
处理之前
处理之后
网友评论