7.python-opencv图像张贴 第一章 python-opencv-图片导入和显示
第二章 python-opencv图像简单处理
第三章 python-opencv图像mask掩膜处理
第四章 python-opencv图像马赛克
第五章 python-opencv人脸马赛克
第六章 python-opencv人脸检测
文章目录
- 7.python-opencv图像张贴
- 前言
- 一、完整代码
- 二、部分代码说明
-
- 1.将图片转化为灰度图
- 2.加载人脸检测器
- 3.人脸检测
- 4.提取图片中的图案
- 结果展示
前言 上一章中说明了如何检测人脸,那么,这一张将说明检测到人脸之后如何在人脸区域张贴另一张图像。
本文将代码进行了详细的标注说明。
一、完整代码
import cv2if __name__ == '__main__':
# 加载图片
img = cv2.imread('./tong.jpg')
# 将图片转化为灰度
gray = cv2.cvtColor(img, code = cv2.COLOR_BGRA2GRAY)
# 加载人脸检测器
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
# 人脸检测
faces = face_detector.detectMultiScale(gray)
# 加载要张贴的图片
heart = cv2.imread('./heart.jpg')# 提取图片中的图案
for x,y,w,h in faces:
heart1 = cv2.resize(heart, (w, h))
for i in range(w):
for j in range(h):
if not (heart1[i,j] > 200).all():
img[i+y,j+x] = heart1[i,j]cv2.imshow('picture', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、部分代码说明 1.将图片转化为灰度图
gray = cv2.cvtColor(img, code = cv2.COLOR_BGRA2GRAY)
为什么要转化为灰度图?
因为转化为灰度图后图片只有一通道,这样在人脸检测的时候可以减少计算参数,加快检测速度,当然也可以不转换。
其中参数img为要转化的图片,cv2.COLOR_BGRA2GRAY则代表将图片转化为灰度图。
2.加载人脸检测器 人脸检测模型可以直接从opencv官方网站中下载(下载地址),下载后是一个xml文件,通过加载xml文件即可进行检测。
模型加载用到的函数为cv2.CascadeClassifier(),其中括号中直接填入你下载好的检测模型的路径。
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
3.人脸检测 模型加载后便开始人脸检测,人脸检测用到的是detectMultiScale函数。
detectMultiScale函数可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)
文章图片
【python-opencv|7.python-opencv图像张贴】detectMultiScale函数的定义为:
detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
各参数含义为:
image--待检测图片,一般为灰度图像加快检测速度;objects--被检测物体的矩形框向量组;scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;minSize和maxSize用来限制得到的目标区域的范围。
检测代码:
faces = face_detector.detectMultiScale(img,
scaleFactor=1.05,#缩放每次检测范围,默认1.1
minNeighbors=3)
4.提取图片中的图案 原始的图片是这样的
文章图片
我们想要的只有图中红心的图案,岁偶一需要将团体取出来
for x,y,w,h in faces:# 遍历所有检测到的人脸区域
heart1 = cv2.resize(heart, (w, h))# 将要张贴的图像尺寸变为人脸区域大小
for i in range(w):
for j in range(h):
if not (heart1[i,j] > 200).all():
img[i+y,j+x] = heart1[i,j]
其中:
if not (heart1[i,j] > 200).all():
img[i+y,j+x] = heart1[i,j]
这里heart1[i,j] > 200为白色区域,heart1[i,j] < 200为红色区域,所以,这行代码是将红色区域的部分提取出来,然后将人脸部分对应的位置替换为要张贴的图像对应的部分。
结果展示
文章图片
推荐阅读
- Python-OpenCv-人脸识别
- python-opencv|python-opencv边缘检测
- 力扣算法题-python|力扣算法题总结(python)—二分查找
- python-opencv|5.python-opencv人脸马赛克
- Python 设计模式(单例模式)
- 人工智能|终结 Python 原生字典(这个库要逆天改命了)
- python|终结 Python 原生字典(这个库真的要逆天改命了)
- 数据库|MySQL 暴跌!
- 为什么range不是迭代器(range到底是什么类型?)