Lý thuyết


1. Nhận diện khuôn mặt trong ảnh

Tải thư viện haar_cascade tại link dưới, chép vào folder project

opencv/data/haarcascades at master · opencv/opencv

# import thư viện OpenCV
import cv2

# load thư viện nhận diện khuôn mặt vào biến haar_cascade (đặt tên biến tùy ý)
haar_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  
# load ảnh
img = cv2.imread('01.png')
  
# chuyển sang ảnh xám
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
# nhận diện khuôn mặt có trong hình bằng cách gọi thư viện nhận diện mặt đã khai báo
# kết quả trả về là biến faces_rect (đặt tên biến tùy ý) chứa thông tin các khuôn mặt phát hiện được
# trong đó mỗi khuôn mặt sẽ gồm 4 thông số x,y,w,h của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
# x, y: tọa độ điểm bắt đầu (góc trên bên trái) của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
# w: chiều rộng của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
# h: chiều cao của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
faces_rect = haar_cascade.detectMultiScale(gray_img, 1.1, 9)
# tham số 1.1 được điều chỉnh để đảm bảo nhận diện chính xác, ko bỏ sót khuôn mặt
  
# vẽ lại đường bao các khuôn mặt lên ảnh gốc
# vòng lặp xét lần lượt khuôn mặt đầu tiên đến khuôn mặt cuối cùng đã phát hiện được
for (x, y, w, h) in faces_rect:
    # vẽ hình chữ nhật bao quanh khuôn mặt phát hiện được
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# show ảnh kết quả
cv2.imshow('Detected faces', img)

# đợi người dùng nhấn phím bất kì
cv2.waitKey(0)
  
# xóa toàn bộ cửa sổ đã tạo ra
cv2.destroyAllWindows()

image.png

2. Làm mờ khuôn mặt trong ảnh

# import thư viện OpenCV
import cv2

# load thư viện nhận diện khuôn mặt vào biến haar_cascade (đặt tên biến tùy ý)
haar_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  
# load ảnh
img = cv2.imread('01.png')
  
# chuyển sang ảnh xám
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
# nhận diện khuôn mặt có trong hình bằng cách gọi thư viện nhận diện mặt đã khai báo
# kết quả trả về là biến faces_rect (đặt tên biến tùy ý) chứa thông tin các khuôn mặt phát hiện được
# trong đó mỗi khuôn mặt sẽ gồm 4 thông số x,y,w,h của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
# x, y: tọa độ điểm bắt đầu (góc trên bên trái) của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
# w: chiều rộng của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
# h: chiều cao của hình chữ nhật nhỏ nhất bao quanh khuôn mặt
faces_rect = haar_cascade.detectMultiScale(gray_img, 1.1, 9)
# tham số 1.1 được điều chỉnh để đảm bảo nhận diện chính xác, ko bỏ sót khuôn mặt
  
# vẽ lại đường bao các khuôn mặt lên ảnh gốc
# vòng lặp xét lần lượt khuôn mặt đầu tiên đến khuôn mặt cuối cùng đã phát hiện được
for (x, y, w, h) in faces_rect:
    # cắt ảnh vùng chứa khuôn mặt
    roi = img[y:y+h, x:x+w]
    # làm mờ vùng ảnh cắt
    roi = cv2.GaussianBlur(roi, (15, 15), 30)
    # ghép lại vùng ảnh cắt đã làm mờ vào ảnh gốc
    img[y:y+roi.shape[0], x:x+roi.shape[1]] = roi

# show ảnh kết quả
cv2.imshow('Blur faces', img)

# đợi người dùng nhấn phím bất kì
cv2.waitKey(0)
  
# xóa toàn bộ cửa sổ đã tạo ra
cv2.destroyAllWindows()

image.png

3. Mở webcam/camera

# import thư viện OpenCV
import cv2
  
# gán luồng webcam
# 0: camera builtin - thường là webcam có sẵn của máy
# 1: camera usb (gắn ngoài) thứ nhất
# 2: camera usb (gắn ngoài) thứ hai
# ...
cap = cv2.VideoCapture(0) 

# kiểm tra xem video đã được load vào cap chưa
# nếu chưa được (file lỗi/ko tồn tại) thì báo
if (cap.isOpened()== False): 
  print("Error opening video stream or file")

# đọc video đến khi kết thúc (hết frame hình)
while(cap.isOpened()):
  # load lần lượt frame 1, 2, 3... đến frame cuối
  ret, frame = cap.read()
  # nếu load dc frame
  if ret == True: 
    # hiện frame
    cv2.imshow('Frame',frame) 
    # nếu nhấn phím Q thì thoát vòng lặp -> ngừng video
    if cv2.waitKey(25) & 0xFF == ord('q'):
      break 
  # nếu ko load dc frame -> thoát vòng lặp -> ngừng video
  else: 
    break 
    
# giải phóng bộ nhớ
cap.release() 
# đóng hết cửa sổ
cv2.destroyAllWindows()

4. Mở video

Y như mở webcam/camera, chỉ khác là thay vì chỉ số camera thì thay bằng file video

# import thư viện OpenCV
import cv2
  
# gán video 01.mp4 vào biến cap
cap = cv2.VideoCapture('01.mp4') 

# kiểm tra xem video đã được load vào cap chưa
# nếu chưa được (file lỗi/ko tồn tại) thì báo
if (cap.isOpened()== False): 
  print("Error opening video stream or file")

# đọc video đến khi kết thúc (hết frame hình)
while(cap.isOpened()):
  # load lần lượt frame 1, 2, 3... đến frame cuối
  ret, frame = cap.read()
  # nếu load dc frame
  if ret == True: 
    # hiện frame
    cv2.imshow('Frame',frame) 
    # nếu nhấn phím Q thì thoát vòng lặp -> ngừng video
    if cv2.waitKey(25) & 0xFF == ord('q'):
      break 
  # nếu ko load dc frame -> thoát vòng lặp -> ngừng video
  else: 
    break 
    
# giải phóng bộ nhớ
cap.release() 
# đóng hết cửa sổ
cv2.destroyAllWindows()

image.png

Bài tập


  1. Viết chương trình đọc video 01.mp4, save lại thành video b01.mp4
  2. Viết chương trình đọc video 02.mp4, resize lại video mới có width = 640pixel (giữ nguyên tỉ lệ width:height), save lại thành video b02.mp4