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() 

效果图:

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

结束语:

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

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

发表评论

评论已关闭。

相关文章