嘿,朋友,送你一件免费的隐身斗篷哦
效果展示
原理
电影特效常用绿幕来"删除背景",而这里是用纯色布来"删除前景"!在这篇文章中,我们基于Python和OpenCV创建了“隐形斗篷”。原理介绍请参考:OpenCV黑魔法之隐身衣 | 附源码,英文原文请见文末网址1。基本思想如下图,主要包括:
1. 开始摄像,保存背景图片A;
2. 获得实时图像B,检测红布;
3. 红布内部显示背景图片A,外部显示实时图像B。
4. 叠合以上两个区域。
代码
1# coding=utf-8
2
3import cv2
4import numpy as np
5import time
6
7# 创建一个VideoCapture对象,用于视频中图片的获取
8cap = cv2.VideoCapture(0)
9# 给一定的时间来启动电脑的摄像头,此时要遮挡的人或物体先别进入镜头
10time.sleep(3)
11count = 0
12background = 0
13# 捕获并存储静态背景
14for i in range(60):
15 ret, background = cap.read()
16
17while cap.isOpened(): # 当摄像头打开时
18 ret, img = cap.read()
19 if not ret:
20 break
21 count += 1
22
23 # 将颜色从BGR转换为HSV
24 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
25
26 # 检测红色,生成遮罩层
27 lower_red = np.array([0, 120, 70])
28 upper_red = np.array([10, 255, 255])
29 mask1 = cv2.inRange(hsv, lower_red, upper_red)
30
31 lower_red = np.array([170, 120, 70])
32 upper_red = np.array([180, 255, 255])
33 mask2 = cv2.inRange(hsv, lower_red, upper_red)
34
35 mask1 = mask1 + mask2
36
37 # 完善遮罩层,获取布内部(mask1)和外部(mask2)遮罩层
38 mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8), iterations=2) # 先腐蚀后膨胀
39 mask1 = cv2.dilate(mask1, np.ones((3, 3), np.uint8), iterations=1) # 膨胀
40 mask2 = cv2.bitwise_not(mask1) # 通过反转mask1的图像创建布外部遮罩层
41
42 # 生成最后的结果
43 res1 = cv2.bitwise_and(background, background, mask=mask1) # 使用位“与”运算来获取mask1(遮布内)所对应的背景
44 res2 = cv2.bitwise_and(img, img, mask=mask2) # 使用位“与”运算来获得mask2(遮布外)所对应实时图像
45 final_output = cv2.addWeighted(res1, 1, res2, 1, 0) # 叠加res1和res2
46
47 cv2.imshow('invisibility cloak', final_output)
48 k = cv2.waitKey(10)
49 if k == 27: # 按Esc键退出
50 break
*注:原始英文版代码请见文末网址5,此处做了部分注释;安装了Python和OpenCV包,复制代码可一键运行。
以上代码中采用红色的布,我采用了蓝色的布,大家也可以根据自己布的颜色,按下表数据来修改代码。比如这里我们修改mask1为蓝色(如不懂原理,请参考文末网址2):
1 # 将颜色从BGR转换为HSV
2 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
3
4 # 检测蓝色,生成遮罩层
5 lower_blue = np.array([100, 43, 46])
6 upper_blue = np.array([124, 255, 255])
7 mask1 = cv2.inRange(hsv, lower_blue, upper_blue)
8
9 # 完善遮罩层
10 mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8), iterations=2) # 先腐蚀后膨胀
基于这个原理还可以实现很多其他的特效,有兴趣的小伙伴可以自己试试。
最后,给大家看一下本文视频中的主角,披着蓝布的小兔纸:
参考
https://www.learnopencv.com/invisibility-cloak-using-color-detection-and-segmentation-with-opencv/
https://www.cnblogs.com/wangyblzu/p/5710715.html
https://blog.csdn.net/zh_jessica/article/details/77992578
https://www.jianshu.com/p/ee72f5215e07
https://github.com/spmallick/learnopencv/blob/master/InvisibilityCloak