看过哈利波特系列的朋友们一定会对那件哈利爸爸留给他的隐身斗篷印象深刻,有了它,无论是半夜偷偷溜出去玩、还是迎面躲开冤家路窄的尴尬,都可以轻松搞定!
不过你有没有想过,用Python也可以给自己织一件隐身斗篷呢?
虽然不能在现实中隐身,不过至少可以在屏幕上实现。可以自己录个小视频过把瘾,当然也可以分享给朋友,收获一大把崇拜的目光~
好,那我们现在就开始吧!
首先要做的准备是:找一块作为原料的红布,纯色,没花儿的。
(绿布蓝布行不行?没问题!稍微改改代码就可以了。)
然后披着这块布在镜头前录上一个放飞自我的小视频,存为video.mp4 。
事实上这个处理的原理非常简单:
- 捕捉背景图像;
- 使用颜色检测和分割算法检测到红色(或其他颜色);
- 生成一个“斗篷”覆盖相应区域;
- 输出最终神奇成品
略有想象力的小朋友应该已经想到了,这不就是电影里的“绿幕”嘛!
没错,原理是一样的,只不过绿幕遮掉的是背景,我们反向应用一下,就可以遮掉人咯。
是不是已经跃跃欲试了呢!
此处我们要用到的库是OpenCV。
代码如下:
import cv2
import numpy as np
import time
# 检查一下cv2的版本
print(cv2.__version__)
# 导入刚才的视频
capture_video = cv2.VideoCapture("video.mp4")
# 预热相机
time.sleep(1)
count = 0
background = 0
# 捕捉背景。你的视频里应该留有一点点空白背景的时间
for i in range(60):
return_val, background = capture_video.read()
if return_val == False :
continue
background = np.flip(background, axis = 1)
while (capture_video.isOpened()):
return_val, img = capture_video.read()
if not return_val :
break
count = count + 1
img = np.flip(img, axis = 1)
# 把图象从BGR转换为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 见证奇迹的时刻
# 取值范围要好好设哦
lower_red = np.array([100, 40, 40])
upper_red = np.array([100, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
# mask2
lower_red = np.array([155, 40, 40])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
# 如果你用的隐身斗篷原料是别的颜色的,这里就需要好好改咯
mask1 = mask1 + mask2
mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3, 3),
np.uint8), iterations = 2)
mask1 = cv2.dilate(mask1, np.ones((3, 3), np.uint8), iterations = 1)
mask2 = cv2.bitwise_not(mask1)
# 生成最终输出
res1 = cv2.bitwise_and(background, background, mask = mask1)
res2 = cv2.bitwise_and(img, img, mask = mask2)
final_output = cv2.addWeighted(res1, 1, res2, 1, 0)
cv2.imshow("INVISIBLE CLOAK", final_output)
k = cv2.waitKey(10)
if k == 27:
break
然后就是成品啦……让我们来看一看:
最后小编个人有六年开发经验,我自己有做python材料的整合,一个完整的python编程学习路线,学习资料和工具。想要这些资料的可以关注小编,并在后台私信:发送“01”领取,希望能帮助到你。