import os
import cv2
import numpy as np
IMAGE_SIZE = 64
#按照指定图像大小调整尺寸, 这个函数的功能是判断图片是不是正方形,如果不是则增加短边的长度使之变成正方形
# 这样再调用cv2.resize() 函数就可以实现等比例缩放了。因为我们制定缩放的比例就是64*64,只有缩放之前图像为正方形才能确保图像不失真。
def resize_image(image, height=IMAGE_SIZE, width=IMAGE_SIZE):
top, bottom, left, right = (0, 0, 0, 0)
#获取图像尺寸h和w 最后一个是channel
h, w, c = image.shape
# print(h,w,c)
#对于长宽不相等的图片,找到最长的一边
longest_edge = max(h,w)
#计算短边需要增加多少像素宽度使其与长边等长
if h < longest_edge:
dh = longest_edge-h
top = dh//2
bottom = dh-top
elif w < longest_edge:
dw = longest_edge-w
left = dw//2
right = dw-left
else:
pass
#RGB颜色
BLACK = [0, 0, 0]
#给图像增加边界,让图片长,宽等长,cv2.BORDER_CONSTANT指定边界颜色由value制定
constant = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK)
#调整图像大小并返回
return cv2.resize(constant, (height, width))
images = []
labels = []
def read_path(path_name):
#这一步的操作是得到所有图片的绝对路径
for dir_item in os.listdir(path_name): #遍历出所有的照片名字
#从初始路径开始叠加,合并成可识别的操作路径
full_path = os.path.abspath(os.path.join(path_name, dir_item))
if os.path.isdir(full_path): #如果是文件夹,继续递归调用
read_path(full_path) #递归调用
else: #文件
if dir_item.endswith('.jpg'):
image = cv2.imread(full_path)
image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE)
#放开这个代码,可以看到 resize_image()函数的实际调用效果
cv2.imwrite('1.jpg', image)
images.append(image)
labels.append(path_name)
# 从指定路径读取训练数据
def load_dataset(path_name):
images, labels = read_path(path_name)
# print(images, labels)
#将输入的所有图片转成四维数组,尺寸为(图片数量*IMAGE_SIZE*IMAGE_SIZE*3)
#图片为64*64像素,一个像素3个颜色值(RGB)
images = np.array(images)
# print(images.shape)
#标注数据,‘zq’文件夹下都是我的脸部图像,全部指定为0,另外一个文件夹下是樊磊的,全部指定为1
labels = np.array([0 if label.endswith('zq') else 1 for label in labels])
return images, labels
if __name__ == '__main__':
images, labels = read_path('data')
Traceback (most recent call last):
File "C:/Users/ZQ/PycharmProjects/face test/4.resize.py", line 67, in <module>
images, labels = read_path('data')
TypeError: cannot unpack non-iterable NoneType object
函数调用时,如没有return语句,打印输出的数据为None,代码中的函数read_path(path_name)中缺了return,要加上return images,labels,这样在调用时才有数据返回。
您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632