What will we cover in this tutorial?
How to create this effect.
The idea behind the code
The idea behind the above effect is simple. We will use a background subtractor, which will get the background of an image and make a mask of the foreground.
The it simple follows this structure.
- Capture a frame from the webcam.
- Get the foreground mask fg_mask.
- To get greater effect dilate the fg_mask.
- From the original frame, create a cartoon frame.
- Use the zero entries of fg_mask as index to copy the cartoon frame into frame. That is, it overwrites all pixel corresponding to a zero (black) value in fg_mask to the values of the cartoon in the original frame. That results in that we only get cartoon effect in the background and not on the objects.
- Show the frame with background cartoon effect.
The code you need to create the above effect
This is all done by using OpenCV. If you need help to install OpenCV I suggest you read this tutorial. Otherwise the code follows the above steps.
import cv2
backSub = cv2.createBackgroundSubtractorKNN(history=200)
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
fg_mask = backSub.apply(frame)
fg_mask = cv2.dilate(fg_mask, None, iterations=2)
_, cartoon = cv2.pencilSketch(frame, sigma_s=50, sigma_r=0.3, shade_factor=0.02)
idx = (fg_mask < 1)
frame[idx] = cartoon[idx]
cv2.imshow('Frame', frame)
cv2.imshow('FG Mask', fg_mask)
keyboard = cv2.waitKey(1)
if keyboard == ord('q'):
break