简介
在《哈利-波特》系列电影中,有一件神奇的斗篷被称为 "隐形斗篷",如果你穿上它,就能让你隐形。它看起来非常酷,吸引了每个人的想象力,尤其是孩子们。但你知道什么是更酷的--用OpenCV Python制作你自己的隐形斗篷,我们将教你如何自己做。
但在进入直接实现部分之前,我们将向你解释屏蔽的概念,因为它在OpenCV Python中创建隐形斗篷中起着根本性的作用。
了解图像处理中的遮蔽
遮罩是通过应用遮罩来修改图像的过程。这里的遮罩是一个图像,其像素强度要么为零,要么为一,即二进制。当遮罩被应用到图像上时,与遮罩中的零重合的像素(图像)被关闭。同样地,与1重合的像素也保持不变。这与位数和操作完全一样。
遮罩的用途是什么?
遮罩在数字图像处理中有多种用途
- 独立性,即用户可以自由定义一个完全任意的形状来从图像中提取,用蒙版就可以实现。
- 它可以用于图像分割、编辑和,改变。
- 在图像上添加图层,目的是为了减少噪音。
- 自动屏蔽图像的敏感部分。
- 遮罩是非破坏性的,即它们不会改变原始图像,因此所有的数据都被保存下来,并且是安全的。
OpenCV中对图像的算术运算的复习
OpenCV提供了在图像上进行算术运算的功能,如AND, OR, XOR, 和NOT。这些运算对于应用遮罩是很有用的。
我们定义numpy零数组,并在它们上面画一些形状(矩形和圆形),颜色为白色,即255,255,255)。我们将对这两个数组进行AND、OR、NOT、XOR操作,看看它们的输出。
import numpy as np
import cv2
rectangle = np.zeros((300, 300), dtype = "uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
circle = np.zeros((300, 300), dtype = "uint8")
cv2.circle(circle, (150, 150), 150, 255, -1)
输出。
矩形
圆形
i) 和操作
一个双输入的操作,当且仅当两个输入都是真(或1)时才返回真。
bitAnd = cv2.bitwise_and(rectangle, circle)
和操作
ii) OR操作
一个双输入的操作,只有当其中一个输入为真(或1)时才返回真。
bitOr = cv2.bitwise_or(rectangle, circle)
OR操作
iii) NOT操作
NOT是一个单输入操作,将输入的值颠倒过来。在这种情况下,它将所有值为1的像素转换为0,反之亦然。
bitNot = cv2.bitwise_not(circle)
对'圆'数组的NOT操作
四)XOR操作
XOR,或称排他性操作,可以概括为一个只有在两个操作数不同时才返回真值的函数。例如Input(1,1)或Input(0,0)的结果是假的(或0),但Input(1,0)或Input(0,1)是真的(或1)。
bitXor = cv2.bitwise_xor(rectangle, circle)
对矩形和圆形进行XOR操作
图像的屏蔽
屏蔽通常是通过使用位数和函数来完成的。这个函数需要一个额外的输入,称为掩码。我们传递掩码的值,然后允许我们只显示图像中在掩码中活跃的部分。
- 定义一个等于图像形状的numpy数组(零)(要对其进行屏蔽)。
- 定义你的ROI,并将其应用到遮罩上(制作一个圆形或一个白色的矩形
- 应用位数与运算
bitwise_and()函数的前两个参数需要是查询图像。因为蒙版的尺寸和查询的尺寸是不一样的。最后,定义掩码变量作为第三个参数。
# Step 1
mask = np.zeros((300, 300), dtype = "uint8")
# Step 2
cv2.rectangle(mask, (50, 250), (150, 150), 255, -1)
cv2.rectangle(mask, (150, 150), (250, 50), 255, -1)
cv2.circle(mask, (75, 75), 50, 255, -1)
cv2.circle(mask, (225, 225), 50, 255, -1)
img = cv2.imread('image.png')
img = cv2.resize(img,(300,300),cv2.INTER_AREA)
bitwiseAnd = cv2.bitwise_and(img,img,mask=mask)
# Step 3
cv2.imshow("Masked image",bitwiseAnd)
cv2.waitKey(0)
输出。
应用于图像的掩码。依次(从左到右)。(mask)面具,(img)查询图像,(bitwise AND)生成图像
使用OpenCV Python的隐身衣
方法
在OpenCV python中建立隐形斗篷的方法与电影中使用的绿屏技术相反。在绿屏中,我们用预先定义的图像来替换绿色的背景。但在这里,我们将用一个预定义的图像来替换前景(确切地说,是蓝色的前景)。
操作步骤
- 保存一张名为 "background.jpg "的图片。我们选择的颜色将自动被替换成图像,以产生一种不可见的错觉。
- 从网络摄像头中获取帧,并将颜色空间从BGR(蓝、绿、红)转换为HSV(色调、饱和度、数值)。
- 为位于蓝色的上值和下值之间的数值创建一个遮罩。颜色出现的位置的值为1,其他为0。(你可以在代码中改变这些值以使不同的颜色消失)。)
- 使用掩码对背景图像进行位数和运算。这个实例代表图像中存在的所有颜色在我们定义的范围内的东西。(凡是检测到颜色的地方都会被预定义的背景图像取代)
- 在遮罩上应用位数不运算来反转第二步中创建的实例的像素值。(它以后将被用来删除网络摄像头帧中的像素(所选颜色))。
- 使用在上述步骤中创建的遮罩对网络摄像头框架进行位数和操作。这有助于我们选择属于所选颜色的像素值并删除它们。
- 最后的结果将是步骤6和步骤4的结果的相加,即被遮蔽的背景图像的值被添加到被遮蔽的网络摄像头帧中,以后再添加到它。
实施代码
import cv2
import numpy as np
cap=cv2.VideoCapture(0)
back = cv2.imread('background.jpg')
while cap.isOpened():
ret,frame = cap.read()
if ret:
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
#cv2.imshow("HSV",hsv)
l_blue=np.array([90,70,50])
u_blue=np.array([128,255,255])
mask = cv2.inRange(hsv,l_blue,u_blue)
cv2.imshow("Mask",mask)
part1 = cv2.bitwise_and(back,back,mask=mask)
cv2.imshow("Half",part1) # all things blue
mask=cv2.bitwise_not(mask)
cv2.imshow("New mask",mask) # all things not blue
part2 = cv2.bitwise_and(frame,frame,mask=mask)
cv2.imshow("Final",part2+part1)
if cv2.waitKey(5) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
代码的解释
第4行。使用 "videocapture "函数创建一个网络摄像头实例。
第5行。定义预定义的背景图像
第7-9行:初始化一个while循环,遍历视频的帧。
第10-15行。将网络摄像头的帧转换为HSV,并定义蓝色的HSV范围。
第17-18行。使用'cv2.inRange'函数在前面几行定义的范围内创建一个遮罩。
第20-21行。在背景图像和上一步创建的遮罩上使用位数和操作。
第23-24行。第23-24行:使用位数非运算将第16行的遮罩反转。
第26-27行。再次应用AND操作,这次是在摄像头框架和第22行的反转遮罩上。
第29-30行。如果用户点击 "q",就会中断循环并停止执行。
第33-34行。释放网络摄像头实例并销毁所有徘徊/未关闭的窗口。
我们的隐形斗篷的演示

输出
总结
希望你能发现这个在OpenCV python中实现隐形斗篷的很酷的项目相当有用。你可以用它来打动你的朋友和家人。源代码可以在下面找到。
- 隐形斗篷OpenCV Python源代码在这里
- 使用这个脚本,用OpenCV点击背景图片(运行并按q键)->这里
还可以阅读 - OpenCV Python中使用Hough变换的车道检测教程
The postMake Your Own Invisibility Cloak using OpenCV Python like Harry Potter Movieappeared first onMLK - Machine Learning Knowledge.