帮忙写一段程序,扣取人脸,并把图像等比例缩放至10K以内
时间: 2024-03-02 10:52:30 浏览: 109
好的,您需要安装以下库:cv2、os、shutil、Pillow。
以下是代码:
```python
import cv2
import os
import shutil
from PIL import Image
# 加载人脸分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 定义函数,扣取人脸并等比例缩放
def face_resize(src_path, dst_path, max_size):
img = cv2.imread(src_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces) != 0:
# 取第一个人脸
x, y, w, h = faces[0]
# 扣取人脸
face_img = img[y:y+h, x:x+w]
# 计算缩放比例
width, height = face_img.shape[:2]
ratio = 1
if width > height and width > max_size:
ratio = max_size / width
elif height > width and height > max_size:
ratio = max_size / height
# 缩放并保存图像
resized_img = cv2.resize(face_img, (int(width * ratio), int(height * ratio)))
cv2.imwrite(dst_path, resized_img)
return True
return False
# 定义函数,处理目录下的所有图像文件
def process_images(src_dir, dst_dir, max_size):
if os.path.exists(dst_dir):
shutil.rmtree(dst_dir)
os.makedirs(dst_dir)
for filename in os.listdir(src_dir):
src_path = os.path.join(src_dir, filename)
if os.path.isfile(src_path):
ext = os.path.splitext(filename)[1].lower()
if ext in ['.jpg', '.jpeg', '.png', '.bmp']:
dst_path = os.path.join(dst_dir, filename)
if face_resize(src_path, dst_path, max_size):
print('Processed', src_path)
print('Done!')
# 测试
src_dir = 'input'
dst_dir = 'output'
max_size = 10000 # 10K
process_images(src_dir, dst_dir, max_size)
```
请将上面代码保存为 `face_resize.py` 文件,并将 `haarcascade_frontalface_default.xml` 文件放在同一目录下。
使用方法:
1. 将需要处理的图像文件放在 `input` 目录下。
2. 运行以下命令:`python face_resize.py`
3. 处理后的图像文件将保存在 `output` 目录下。
注意事项:
1. `max_size` 参数表示缩放后图像的最大大小,单位为字节。
2. 程序只会处理 `jpg`、`jpeg`、`png`、`bmp` 四种格式的图像文件。
3. 如果一个图像文件中没有人脸,将不会处理该文件。
4. 程序会先删除 `output` 目录,然后重新创建。
5. 如果同名文件已经存在于 `output` 目录中,将会被覆盖。
阅读全文