一、 实验目的
用Python-OpenCV编写一个程序能检测出给定图像中的人脸,并能给人脸添加一些装饰特效,比如给人脸加上戴眼镜或带口罩或戴帽子等装饰物。
二、实验要求
1. 用OpenCV编写一个程序能检测出给定图像中的人脸,并能给人脸添加一些装饰特效,比如给人脸加上戴眼镜或带口罩或戴帽子等装饰物,要求首先能检测出图像中的人脸,进而给人脸的一些部位添加装饰特效,并要求添加的装饰物位置准确,大小合适。
2. 认真撰写实验报告,要求说明实验原理,对实验过程叙述清楚,关键代码给出注释,对实验结果给出合理解释,实验分析部分则需要指出实验结果优劣的原因以及如何进一步提高实验性能的方法或手段。
三、实验代码及结果
3.1 实验代码
# ———————— 实验三 ——————————————import cv2# 覆盖图像def overlay_img(img, img_over, img_over_x, img_over_y):"""覆盖图像:param img: 背景图像:param img_over: 覆盖的图像:param img_over_x: 覆盖图像在背景图像上的横坐标:param img_over_y: 覆盖图像在背景图像上的纵坐标:return: 两张图像合并之后的图像"""img_h, img_w, img_p = img.shape # 背景图像宽、高、通道数img_over_h, img_over_w, img_over_c = img_over.shape # 覆盖图像高、宽、通道数if img_over_c == 3: # 通道数小于等于3img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA) # 转换成4通道图像for w in range(0, img_over_w): # 遍历列for h in range(0, img_over_h): # 遍历行if img_over[h, w, 3] != 0: # 如果不是全透明的像素for c in range(0, 3): # 遍历三个通道x = img_over_x + w # 覆盖像素的横坐标y = img_over_y + h # 覆盖像素的纵坐标if x >= img_w or y >= img_h: # 如果坐标超出最大宽高break # 不做操作img[y, x, c] = img_over[h, w, c] # 覆盖像素return img # 完成覆盖的图像face_img = cv2.imread(r".\test3.jpeg",cv2.IMREAD_REDUCED_COLOR_2) # 读取人脸图像cv2.imshow("no_sunglasses_face", face_img) # 显示未带墨镜的人脸的效果glass_img = cv2.imread(r".\glass.png", cv2.IMREAD_UNCHANGED) # 读取眼镜图像,保留图像类型height, width, channel = glass_img.shape # 获取眼镜图像高、宽、通道数# 加载识别正面人脸的级联分类器face_cascade = cv2.CascadeClassifier(r".\haarcascade_frontalface_default.xml")garyframe = cv2.cvtColor(face_img, cv2.COLOR_BGR2GRAY) # 转为黑白图像faces = face_cascade.detectMultiScale(garyframe, 1.3, 5) # 识别人脸for (x, y, w, h) in faces: # 遍历所有人脸的区域gw = w # 眼镜缩放之后的宽度gh = int(height * w / width) # 眼镜缩放之后的高度度glass_img = cv2.resize(glass_img, (gw, gh)) # 按照人脸大小缩放眼镜overlay_img(face_img, glass_img, x, y + int(h * 1 / 3)) # 将眼镜绘制到人脸上cv2.imshow("sunglasses_face", face_img) # 显示最终处理的效果cv2.waitKey() # 按下任何键盘按键后cv2.destroyAllWindows() # 释放所有窗体
3.2 实验结果
运行代码后,会完成图像读取,图像处理,并打开两个窗口,分别展示原图和加了眼镜装饰的图像:
结语
这是本人大学期间机器视觉实验报告。顺走的记得改改图片,报告内容也稍作修改、排版也别跟一样好吧。
代码打包:
/download/qq_25662827/85465828/download/qq_25662827/85465828