OpenCv人脸检测技术-(实现抖音特效-给人脸戴上墨镜)

博客 分享
0 315
优雅殿下
优雅殿下 2023-04-21 19:27:28
悬赏:0 积分 收藏

OpenCv人脸检测技术-(实现抖音特效-给人脸戴上墨镜)

OpenCv人脸检测技术-(实现抖音特效-给人脸戴上墨镜)

本文章用的是Python库里的OpenCv。

OpenCv相关函数说明

import cv2 # 导入OpenCv库
cv2.imread(filename) # 读取图像
object = cv2.CascadeClassifier() # 括号里面填Haar级联分类器
"""
CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器。并且既可以使用Haar,也可以使用LBP特征。Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。
"""
object.detectMultiScale(image, scaleFactor, minNeighbors)
"""
detectMultiScale是CascadeClassifier的子类;
image:待分析的图像。
scaleFactor:扫描图像时缩放的比例。
minNeighbors:保留多少检测结果,该值越大误差越小。
etc...
"""
cv2.waitKey(delay) # 等待用户按下键盘后等待delay毫秒
cv2.destroyAllWindows() # 销毁所有窗口

分析人脸位置

人脸检测,把图像分成一个个小块,对每一个小块判断是否是人脸,假如一张图被分成了5000块,则速度非常慢。
为了提高效率,OpenCV 提供 cascades 来避免这种情况。提供了一系列的xml文件
cascades :翻译 :小瀑布 级联
cascade 对于每个数据块,它都进行一个简单快速的检测。若过,会再进行一个更仔细的检测。该算法有 30 到 50 个这样的阶段,或者说 cascade。只有通过全部阶段,cascade才会判断检测到人脸。这样做的好处是:大多数小块都会在前几步就产生否定反馈,节约时间。
资源链接,该资源不仅仅包括人脸xml,还有其他眼睛等。赚取点积分吧。
OpenCV人脸识别xml文件.zip或者从官网Sources里找资源,data文件夹中有是特征文件,我们一般选用haarcascade_frontalface_default.xml

资料来源于网络,侵删。

import cv2
img = cv2.imread("/Users/duanhao/Desktop/photo/liukun.jpg")
# 加载识别人脸的级联分析器
faceCascade = cv2.CascadeClassifier("/Applications/anaconda/anaconda3/lib/python3.9/site-packages/cv2/data/haarcascade_frontalface_default.xml")
faces = faceCascade.detectMultiScale(img, 1.15, 5)
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)
cv2.imshow("image", img)
cv2.waitKey()
cv2.destroyAllWindows()

给人脸戴上墨镜

准备阶段:我们可以读取视频,也可以读取人脸,这里我准备了一张含有人脸的照片;

如果要读取视频需要用:VideoCapture类方法。

素材:一张墨镜???的图片,用于后期覆盖原始图像。

代码:

import cv2
def over_img(img, img_over, over_x, over_y):
    img_h, img_w, c = img.shape
    img_over_h, img_over_w, over_c = img_over.shape
    if over_c == 3:
        img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)
    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 = over_x + w
                    y = over_y + h
                    if x >= img_w or y >= img_h:
                        break
                    img[y, x, c] = img_over[h, w, c]
    return img

img = cv2.imread("/Users/duanhao/Desktop/photo/liukun.jpg")
glass = cv2.imread("/Users/duanhao/Desktop/photo/glass.png", cv2.IMREAD_UNCHANGED) # 保留图像类型
height, weight, channel = glass.shape
# 加载人脸识别联结器
faceCascade = cv2.CascadeClassifier("/Applications/anaconda/anaconda3/lib/python3.9/site-packages/cv2/data/haarcascade_frontalface_default.xml")
face = faceCascade.detectMultiScale(img, 1.15, 4)
for (x, y, w, h) in face:
    gw = w
    gh = int(height * gw/weight)
    img_over_new = cv2.resize(glass, (gw, gh))
    img = over_img(img, img_over_new, x, y+int(h*1/3))
    # cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)
cv2.imshow("screen", img)
cv2.waitKey()
cv2.destroyAllWindows()

效果图:

结束语:

上面是我五个室友的合照。当时因为有一个算法比赛,我在寝室里备战算法竞赛,所以没和室友一起出去,所以上面的合照没有我。后面我有时间,一定要把我自己P上去!!

最后,祝所有奋斗的人都能收获到好的结果。

posted @ 2023-04-21 18:46  猫吃耗子  阅读(16)  评论(1编辑  收藏  举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2017 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员