像哈利-波特电影那样用OpenCV Python制作自己的隐身衣

605 阅读7分钟

简介

在《哈利-波特》系列电影中,有一件神奇的斗篷被称为 "隐形斗篷",如果你穿上它,就能让你隐形。它看起来非常酷,吸引了每个人的想象力,尤其是孩子们。但你知道什么是更酷的--用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)

输出。

Rectangle

矩形

Circle

圆形

i) 和操作

一个双输入的操作,当且仅当两个输入都是真(或1)时才返回真。

bitAnd = cv2.bitwise_and(rectangle, circle)

AND Operation

和操作

ii) OR操作

一个双输入的操作,只有当其中一个输入为真(或1)时才返回真。

bitOr = cv2.bitwise_or(rectangle, circle)

OR Operation

OR操作

iii) NOT操作

NOT是一个单输入操作,将输入的值颠倒过来。在这种情况下,它将所有值为1的像素转换为0,反之亦然。

bitNot = cv2.bitwise_not(circle)

NOT Operation

对'圆'数组的NOT操作

四)XOR操作

XOR,或称排他性操作,可以概括为一个只有在两个操作数不同时才返回真值的函数。例如Input(1,1)或Input(0,0)的结果是假的(或0),但Input(1,0)或Input(0,1)是真的(或1)。

bitXor = cv2.bitwise_xor(rectangle, circle)

XOR operation on rectangle and circle

对矩形和圆形进行XOR操作

图像的屏蔽

屏蔽通常是通过使用位数和函数来完成的。这个函数需要一个额外的输入,称为掩码。我们传递掩码的值,然后允许我们只显示图像中在掩码中活跃的部分。

  1. 定义一个等于图像形状的numpy数组(零)(要对其进行屏蔽)。
  2. 定义你的ROI,并将其应用到遮罩上(制作一个圆形或一个白色的矩形
  3. 应用位数与运算

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 applied to an image

应用于图像的掩码。依次(从左到右)。(mask)面具,(img)查询图像,(bitwise AND)生成图像

使用OpenCV Python的隐身衣

方法

在OpenCV python中建立隐形斗篷的方法与电影中使用的绿屏技术相反。在绿屏中,我们用预先定义的图像来替换绿色的背景。但在这里,我们将用一个预定义的图像来替换前景(确切地说,是蓝色的前景)。

操作步骤

  1. 保存一张名为 "background.jpg "的图片。我们选择的颜色将自动被替换成图像,以产生一种不可见的错觉。
  2. 从网络摄像头中获取帧,并将颜色空间从BGR(蓝、绿、红)转换为HSV(色调、饱和度、数值)。
  3. 为位于蓝色的上值和下值之间的数值创建一个遮罩。颜色出现的位置的值为1,其他为0。(你可以在代码中改变这些值以使不同的颜色消失)。)
  4. 使用掩码对背景图像进行位数和运算。这个实例代表图像中存在的所有颜色在我们定义的范围内的东西。(凡是检测到颜色的地方都会被预定义的背景图像取代)
  5. 在遮罩上应用位数不运算来反转第二步中创建的实例的像素值。(它以后将被用来删除网络摄像头帧中的像素(所选颜色))。
  6. 使用在上述步骤中创建的遮罩对网络摄像头框架进行位数和操作。这有助于我们选择属于所选颜色的像素值并删除它们。
  7. 最后的结果将是步骤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行。释放网络摄像头实例并销毁所有徘徊/未关闭的窗口。

我们的隐形斗篷的演示

 Invisibility Cloak using OpenCV Python

输出

总结

希望你能发现这个在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.