1 说明
=====
1.1 孙悟空可以实现人的隐身和消失。
1.2 今天,我们用python-opencv实现摄像头视频中人的消失,就是隐身术。
2 效果展示
3 分析
=====
3.1 注意掩膜与实时背景的色彩,可以微调,主要是便于观察和展示。
3.2 目前适用于固定摄像头背景的隐身,如果是视频,比如mp4的隐身,可能在获取背景上需要下很大功夫,暂时提供思维。
3.3 源代码来自:其中的InvisibilityCloak文件夹的InvisibilityCloak.py文件进行修改、注释、删减和调试等等操作。
https://github.com/spmallick/learnopencv
3.4 讲解清楚,注释仔细,运行成功,小白秒懂,适合收藏,经典。
3.5 环境:python3.8+opencv4.4.0+深度deepin-linux操作系统+微软编辑器vscode。
4 我修改后的代码讲解InvisibilityCloak.py
==============================
4.1 头注释部分,可以只是看看
#摄像头隐身术
#第一步:固定摄像头位置,获取背景
#第二步:人出现在摄像头内
#第三步:一部分红色类物体,及放大后起到隐身人的作用
#位操作==按位运算
#包括按位操作有:AND,OR,NOT,XOR等。提取图片一部分的时候会很有用。
#比如有要将一个logo的中间部分挖掉放到另一个图里,使用简单的ROI操作是办不到的。
#bitwise_not是对二进制数据进行“非”操作,
#即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1
'''
参数
cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化
参数说明:src传入的图片,op进行变化的方式, kernel表示方框的大小
op = cv2.MORPH_OPEN 进行开运算,指的是先进行腐蚀操作,再进行膨胀操作
op = cv2.MORPH_CLOSE 进行闭运算, 指的是先进行膨胀操作,再进行腐蚀操作
开运算:表示的是先进行腐蚀,再进行膨胀操作
闭运算:表示先进行膨胀操作,再进行腐蚀操作
'''
4.2
#第1步:导入模块
import cv2
import numpy as np
4.3
#第2步:初始化
#图像摄入
cap = cv2.VideoCapture(0) #来自摄像头
#参数初始化
count = 0
background=0
# Capturing and storing the static background frame
#背景图读取和存储,人先不要出现60秒
for i in range(60):
ret,background = cap.read()
4.4
#第3步:循环
while(cap.isOpened()):
#3-1:获取摄像头实时的图片
#第一个参数ret 为True 或者False,代表有没有读取到图片
#第二个参数frame(img)表示截取到一帧的图片
ret, img = cap.read()
#3-2:退出设置
#如果没有读取到图片
if not ret:
#退出
break
#退出设置
k = cv2.waitKey(10)
if k == 27:
break
#3-3:读取图片和颜色转换
#计数
count+=1
#图像左右互换
#img = np.flip(img,axis=1)
#背景转换
# Converting the color space from BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#3-4:掩膜
#技术要点
#下面的数据是针对用红色布进行隐身
# Generating mask to detect red color
lower_red = np.array([0,120,70])
upper_red = np.array([10,255,255])
mask1 = cv2.inRange(hsv,lower_red,upper_red)
#掩膜
lower_red = np.array([170,120,70])
upper_red = np.array([180,255,255])
mask2 = cv2.inRange(hsv,lower_red,upper_red)
mask1 = mask1+mask2
# Refining the mask corresponding to the detected red color
#开运算:表示的是先进行腐蚀,再进行膨胀操作
mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3,3),np.uint8),iterations=2)
#进行膨胀操作
#原来是3和3
#300和300是隐身范围大小,推荐
mask1 = cv2.dilate(mask1,np.ones((300,300),np.uint8),iterations = 1)
#位操作==按位运算
#bitwise_not是对二进制数据进行“非”操作
mask2 = cv2.bitwise_not(mask1)
#是对二进制数据进行“和”操作
res1 = cv2.bitwise_and(background,background,mask=mask1)
res2 = cv2.bitwise_and(img,img,mask=mask2)
#3-5:Generating the final output
final_output = cv2.addWeighted(res1,1,res2,1,0)
#窗口视频展示
cv2.imshow('Magic !!!',final_output)
5 操作步骤
========
5.1 打开摄像头。
5.2 打开代码,微软编辑器,首先人不要对着摄像头,偏离,点击运行按钮,获取摄像头固定静态背景图。
5.3 出现展示框,代表摄像头实时视频,人然后出现摄像头内,只要出现一点红色的布,就可以产生大约300和300的隐身范围。我用的是小学生的红领巾。
5.4 本人已经亲测,可行!
分享出来,超级强和经典。