Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions Color Detection and Segmentation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# How does this algorithm work ?

<h3>
The algorithm is very similar in principle to green screening. But unlike green screening where we remove the background, in this application, we remove the foreground! As everyone is a fan of <i>Harry Potter World and Hogwartz</i>. So today, I am going to show you the magic of <u>Invisibility Cloak</u> of Harry with Computer Vision.
</h3>
<img src="invisible.gif">

<br>

<i>The project comprises of 5 simple steps:</i>

<ol>
<li>Importing the required libraries.</li>
<li>Capture and store the background frame [This will be done for some seconds]</li>
<li>Detect the red colored cloth using color detection and segmentation algorithm.</li>
<li>Segment out the red colored cloth by generating a mask. [used in code]</li>
<li>Generate the final augmented output to create a magical effect. [output.avi]</li>
</ol>

<h4>Step 1: Importing the required libraries.</h4>
We have to import all the necessary libraries into the code. “cv2” is for OpenCV, “time” is for time-related operations, and “numpy” is for numerical purposes. We are writing the video in fourcc and saving the video output as <i>output.avi.</i>

<br>

<h4>Step 2: Capture and store the background frame.</h4>
In order to create an invisible effect, we have to remove the red-colored pixels from the background and store the background image of each frame. For capturing the frame we have used cap.read(). The variable ‘ret’ is used to return the boolean value.

<br>

<h4>Step 3: Detect the red colored cloth using color detection and segmentation algorithm.</h4>
Here we will convert the RGB (Red-Blue-Green) to HSV (Hue-Saturation-Value) because RGB value is too sensitive.

<br>

<h4>Step 4: Segment out the red colored cloth by generating a mask.</h4>

<br>

<h4>Step 5: Generate the final augmented output to create a magical effect.</h4>
The final step, in which red-colored pixel is removed, and we obtain the desired output.
70 changes: 70 additions & 0 deletions Color Detection and Segmentation/colorDetectionAndSegmentation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
##Import opencv(cv2), Numpy array(numpy)
import cv2
import time
import numpy as np

## Preparation for writing the ouput video
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc,20.0, (640,480))

##reading from the webcam
cap = cv2.VideoCapture(0)

## Allow the system to sleep for 3 seconds before the webcam starts
time.sleep(3)
count = 0
background = 0

## Capture the background in range of 60
for i in range(60):
ret,background = cap.read()
background = np.flip(background,axis=1)


## Read every frame from the webcam, until the camera is open
while(cap.isOpened()):
ret, img = cap.read()
if not ret:
break
count+=1
img = np.flip(img,axis=1)

## Convert the color space from BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

## Generat masks to detect red color
lower_red = np.array([0,120,50])
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

## Open and Dilate the mask image
mask1 = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, np.ones((3,3),np.uint8))
mask1 = cv2.morphologyEx(mask1, cv2.MORPH_DILATE, np.ones((3,3),np.uint8))


## Create an inverted mask to segment out the red color from the frame
mask2 = cv2.bitwise_not(mask1)


## Segment the red color part out of the frame using bitwise and with the inverted mask
res1 = cv2.bitwise_and(img,img,mask=mask2)

## Create image showing static background frame pixels only for the masked region
res2 = cv2.bitwise_and(background, background, mask = mask1)


## Generating the final output and writing
finalOutput = cv2.addWeighted(res1,1,res2,1,0)
out.write(finalOutput)
cv2.imshow("magic",finalOutput)
cv2.waitKey(1)

cap.release()
out.release()
cv2.destroyAllWindows()
Binary file added Color Detection and Segmentation/invisible.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.