Bài viết tiếp theo trong series Tự học và phát triển ứng dụng thực tế AI, ML, DL, DS, Ngô Tôn .IT sẽ hướng dẫn các bạn Tạo Virtual Background cho Video bằng Python và OpenCV.
Trong năm qua, dịch Covid-19 đã khiến cuộc sống của chúng ta thay đổi rất nhiều, cũng nhờ đó mà chúng ta thấy được tầm quan trọng của công nghệ thông tin, cụ thể là ứng dụng trí tuệ nhân tạo (AI, Machine Learning, Deep Learning, Computer Vision) đối với tất cả lĩnh vực trong đời sống, từ thương mại điện tử cho tới giáo dục….
Nếu những ai là học sinh, sinh viên hay cả những nhân viên văn phòng, vừa qua đã được sử dụng công cụ Zoom, Google Meet để học cũng như làm việc trực tuyến. Có một tính năng khá là hay được nhiều người sử dụng đó là Virtual Background.
Virtual Background là gì?
Virtual Background còn được gọi là hình nền ảo, là một tính năng cho phép làm mờ nền, thay đổi nền hoặc thêm hình nền khi tham gia cuộc gọi trên Zoom và Google Meet.
Tính năng hình nền ảo làm cho môi trường xung quanh bạn mất nét và mờ đi, để mọi người không thể nhìn thấy chi tiết những gì đang diễn ra phía sau bạn. Ngoài ra, bạn còn có thể thay thế hoàn toàn hình nền video của mình bằng một trong các hình nền đặt sẵn hoặc thêm hình nền của riêng bạn.
Tạo Virtual Background cho Video bằng Python và OpenCV
Bây giờ, chúng ta sẽ thử code để tạo Virtual Background cho video sử dụng OpenCV trong Python.
Đầu tiên, lúc nào cũng vậy chúng ta import một số packages để sử dụng
1 2 3 |
import cv2 import numpy as np import sys |
Mở camera và load vào 1 video để làm background
1 2 3 |
video = cv2.VideoCapture(0) oceanVideo = cv2.VideoCapture("ocean.mp4") success, ref_img = video.read() |
Resize để khớp giữa foreground và background
1 2 3 4 5 |
success, img = video.read() success2, bg = oceanVideo.read() bg = resize(bg,ref_img) if flag==0: ref_img = img |
Hàm resize nội dung như sau:
1 2 3 4 5 6 |
def resize(dst,img): width = img.shape[1] height = img.shape[0] dim = (width, height) resized = cv2.resize(dst, dim, interpolation = cv2.INTER_AREA) return resized |
Tạo mặt nạ (mask)
1 2 3 4 5 6 7 8 9 |
# create a mask diff1=cv2.subtract(img,ref_img) diff2=cv2.subtract(ref_img,img) diff = diff1+diff2 diff[abs(diff)<13.0]=0 gray = cv2.cvtColor(diff.astype(np.uint8), cv2.COLOR_BGR2GRAY) gray[np.abs(gray) < 10] = 0 fgmask = gray.astype(np.uint8) fgmask[fgmask>0]=255 |
Đảo ngược lại mặt nạ và trích xuất các điểm liên quan giữa foreground và background
1 2 3 4 5 |
#invert the mask fgmask_inv = cv2.bitwise_not(fgmask) #use the masks to extract the relevant parts from FG and BG fgimg = cv2.bitwise_and(img,img,mask = fgmask) bgimg = cv2.bitwise_and(bg,bg,mask = fgmask_inv) |
Kết hợp foreground và background lại
1 2 3 |
#combine both the BG and the FG images dst = cv2.add(bgimg,fgimg) cv2.imshow('Background Removal',dst) |
Chúng ta sẽ có code đầy đủ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import cv2 import numpy as np import sys def resize(dst,img): width = img.shape[1] height = img.shape[0] dim = (width, height) resized = cv2.resize(dst, dim, interpolation = cv2.INTER_AREA) return resized video = cv2.VideoCapture(0) oceanVideo = cv2.VideoCapture("ocean.mp4") success, ref_img = video.read() flag = 0 while(1): success, img = video.read() success2, bg = oceanVideo.read() bg = resize(bg,ref_img) if flag==0: ref_img = img # create a mask diff1=cv2.subtract(img,ref_img) diff2=cv2.subtract(ref_img,img) diff = diff1+diff2 diff[abs(diff)<13.0]=0 gray = cv2.cvtColor(diff.astype(np.uint8), cv2.COLOR_BGR2GRAY) gray[np.abs(gray) < 10] = 0 fgmask = gray.astype(np.uint8) fgmask[fgmask>0]=255 #invert the mask fgmask_inv = cv2.bitwise_not(fgmask) #use the masks to extract the relevant parts from FG and BG fgimg = cv2.bitwise_and(img,img,mask = fgmask) bgimg = cv2.bitwise_and(bg,bg,mask = fgmask_inv) #combine both the BG and the FG images dst = cv2.add(bgimg,fgimg) cv2.imshow('Background Removal',dst) key = cv2.waitKey(5) & 0xFF if ord('q') == key: break elif ord('d') == key: flag = 1 print("Background Captured") elif ord('r') == key: flag = 0 print("Ready to Capture new Background") cv2.destroyAllWindows() video.release() |
Lưu lại và chạy thử xem sao
1 |
$ python background-removal.py |
Các bạn bấm phím “d” để tạo ra virtual background, và phím “r” để chỉ hiện video nền.
Xem kết quả thế nào.
Vậy là xong, chúc các bạn thành công!
Leave a Reply