说明
在使用深度学习模型推理的时候,通常输入图片都是一个正方形,而摄像头采集的图片通常是长方形的,这就要把图片的边上填充一些像素,从而变成所需的正方形。
在opencv中copyMakeBorder可做填充的工作,非常适合做深度学习图片的前处理。
FDDB数据集是用于人脸检测的,经过处理的图片如下所示:
函数原型
https://docs.opencv.org/3.4/d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36
python代码示例
这个例子把图片转换为320X320的正方形图片。
import cv2
import numpy as np
import os
#入参是:源图,目标宽度,目标长度
#长宽不等的图片,本函数resize后会在短的那个边上做填充,从而保证图片比例不变
def resize_image(srcimg, targetHeight, targetWidth):
padh, padw, newh, neww = 0, 0, targetHeight, targetWidth
if srcimg.shape[0] != srcimg.shape[1]:
hw_scale = srcimg.shape[0] / srcimg.shape[1] #shape[0]-h, shape[1]-w
if hw_scale > 1: #高度比较大
newh, neww = targetHeight, int(targetWidth / hw_scale)
img = cv2.resize(srcimg, (neww, newh), interpolation=cv2.INTER_AREA)
padw = int((targetWidth - neww) * 0.5)
img = cv2.copyMakeBorder(img, 0, 0, padw, targetWidth - neww - padw, cv2.BORDER_CONSTANT,
value=0) # add border
return img
else:
newh, neww = int(targetHeight * hw_scale) + 1, targetWidth
img = cv2.resize(srcimg, (neww, newh), interpolation=cv2.INTER_AREA)
padh = int((targetHeight - newh) * 0.5)
img = cv2.copyMakeBorder(img, padh, targetHeight - newh - padh, 0, 0, cv2.BORDER_CONSTANT, value=0)
return img
else:
img = cv2.resize(srcimg, (targetWidth, targetHeight), interpolation=cv2.INTER_AREA)
return img #, newh, neww, padh, padw
f = open("facepictures.txt")
line = f.readline()
num = 0
while line:
imgpath=line.strip()
print (num, ":", imgpath)
img = cv2.imread(imgpath)
resize_img = resize_image(img, 320, 320)
newpath = os.path.join("./FDDB/", str(num)+".jpg")
print("newpath:", newpath)
cv2.imwrite(newpath, resize_img)
line = f.readline()
num+=1
# if num > 10 :
# break
f.close()