用python祝别人生日快乐源码_用Python披上隐形斗篷 | 附源码

嘿,朋友,送你一件免费的隐身斗篷哦

效果展示

原理

电影特效常用绿幕来"删除背景",而这里是用纯色布来"删除前景"!在这篇文章中,我们基于Python和OpenCV创建了“隐形斗篷”。原理介绍请参考:OpenCV黑魔法之隐身衣 | 附源码,英文原文请见文末网址1。基本思想如下图,主要包括:

1. 开始摄像,保存背景图片A;

2. 获得实时图像B,检测红布;

3. 红布内部显示背景图片A,外部显示实时图像B。

4. 叠合以上两个区域。

e1fceb35696f64742323a2cd2d5b4665.gif

代码

 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)  # 先腐蚀后膨胀

12a4976027991a3111ce9b0a61bd131b.png

基于这个原理还可以实现很多其他的特效,有兴趣的小伙伴可以自己试试。

最后,给大家看一下本文视频中的主角,披着蓝布的小兔纸5e3900cf1c8029c128bf3b16d7b4a15f.png

5dd32f21deaada2ba8cc6da6762e08d0.png

参考

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值