Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video

Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video

Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video

08:23 - 14/02/2022

Ở phần này chúng ta sẽ cùng tìm hiểu cách phát hiện người đi bộ trong video.

Thị giác máy tính với OpenCV-Python Bài 7 Phần 3: Nhận diện khuôn mặt
Thị giác máy tính với OpenCV-Python Bài 7 Phần 1: Phát hiện người đi bộ trong hình ảnh
Thị giác máy tính với OpenCV-Python Bài 6 Phần 2: Phép trừ nền
Thị giác máy tính với OpenCV-Python Bài 6 Phần 1: Bắt bám đối tượng với Meanshift và Camshift
Thị giác máy tính với OpenCV-Python Bài 5 Phần 3: Tìm đối tượng thông qua so khớp và phép chiếu hình học

Thuật toán ở phần này hoàn toàn tương tự như các thao tác ở phần phát hiện hiện người đi bộ trong hình ảnh trước đó, chỉ khác là thao tác trên video.

Đầu tiên chúng ta cần tìm tệp video có người đi bộ trong đó, lưu video vào cùng thư mục với đoạn code minh họa dưới đây:

  1. import cv2
  2. import numpy as np
  3. from imutils.object_detection import non_max_suppression # Để loại bỏ chồng lấn
  4.  
  5. # Đưa video vào cùng thư mục với file python của đoạn code này
  6. filename = 'pedestrians_on_street_1.mp4'
  7. file_size = (1920, 1080) # Giả sử kích thước video là 1920x1080
  8. scale_ratio = 1 # Tỉ lệ phóng đại kích thước video khi cần thiết
  9.  
  10. # Lưu video đầu ra
  11. output_filename = 'pedestrians_on_street.mp4'
  12. output_frames_per_second = 20.0
  13.  
  14. def main():
  15.  
  16.     # Khởi tạo đối tượng HOGDescriptor
  17.     hog = cv2.HOGDescriptor()
  18.      
  19.     # Khởi chạy hàm phát hiện người đi bộ
  20.     hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
  21.      
  22.     # Tải lên video
  23.     cap = cv2.VideoCapture(filename)
  24.  
  25.     # Tạo đối tượng VideoWriter để lưu video đầu ra
  26.     fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  27.     result = cv2.VideoWriter(output_filename, 
  28.                                         fourcc,
  29.                                         output_frames_per_second,
  30.                                         file_size)
  31.      
  32.     # Quá trình xử lý video
  33.     while cap.isOpened():
  34.          
  35.          # Lấy từng khung hình
  36.          success, frame = cap.read()
  37.          
  38.          # Sau khi lấy được khung hình thì tiếp tục các bước tiếp theo
  39.          if success:
  40.          
  41.              # Thay đổi kích thước khung hình
  42.              width = int(frame.shape[1] * scale_ratio)
  43.              height = int(frame.shape[0] * scale_ratio)
  44.              frame = cv2.resize(frame, (width, height))
  45.              
  46.              # Lưu khung hình ban đầu
  47.              orig_frame = frame.copy()
  48.              
  49.              # Phát hiện người đi bộ
  50.              # image: mỗi khung hình đơn lẻ trong video
  51.              # winStride: kích thước bước của cửa số trượt theo hướng trục x và y
  52.              # padding: số lượng pixel theo hướng trục x và y  
  53.              # scale: Hệ số tăng kích thước cửa sổ phát hiện  
  54.              # bounding_boxes: Vị trí người đi bộ phát hiện được
  55.              # weights: Trọng số của người đi bộ phát hiện được
  56.              (bounding_boxes, weights) = hog.detectMultiScale(frame,
  57.                                                                                        winStride=(16, 16),
  58.                                                                                        padding=(4, 4),
  59.                                                                                        scale=1.05)
  60.  
  61.              # Vẽ hình chữ nhật bao quanh người đi bộ trên khung hình
  62.              for (x, y, w, h) in bounding_boxes:
  63.                   cv2.rectangle(orig_frame,
  64.                                       (x, y), 
  65.                                       (x + w, y + h), 
  66.                                       (0, 0, 255),
  67.                                       2)
  68.                          
  69.              # Loại bỏ những hình chữ nhật chồng lấn nhau
  70.              # Thay đổi chỉ số overlapThresh để được kết quả tốt nhất
  71.              bounding_boxes = np.array([[x, y, x + w, y + h] for (
  72.                                                       x, y, w, h) in bounding_boxes])
  73.              
  74.              selection = non_max_suppression(bounding_boxes,
  75.                                                                probs=None,
  76.                                                                overlapThresh=0.45)
  77.          
  78.              # vẽ hình chữ nhật là kết quả cuối cùng
  79.              for (x1, y1, x2, y2) in selection:
  80.                    cv2.rectangle(frame,
  81.                                        (x1, y1),
  82.                                        (x2, y2),
  83.                                        (0, 255, 0),
  84.                                        4)
  85.          
  86.              # Lưu khung hình vào video đầu ra
  87.              result.write(frame)
  88.              
  89.              # Hiển thị khung hình
  90.              cv2.imshow("Frame", frame)   
  91.  
  92.              # Hiển thị khung hình trong x mili giây và quit nếu nhấn “q”
  93.              if cv2.waitKey(25) & 0xFF == ord('q'):
  94.                    break
  95.          
  96.              # Thoát ra nếu không còn khung hình nào nữa
  97.          else:
  98.              break
  99.              
  100.     # Dừng lại sau khi video kết thúc
  101.     cap.release()
  102.      
  103.     # Giải phóng quá trình ghi video
  104.     result.release()
  105.      
  106.     # Đóng tất cả các cửa sổ
  107.     cv2.destroyAllWindows()
  108.  
  109. main()

Kết quả:

 

 

Ở phần tiếp theo chúng ta sẽ cùng tìm hiểu cách phát hiện khuôn mặt và đôi mắt trong hình ảnh.

 

 

(Sưu tầm)
VIỆN IMC
Tòa nhà IMC Tower, Số 176 Trường Chinh, Phường Khương
Thượng, Quận Đống Đa, Thành phố Hà Nội, Việt Nam
Tel/Fax : (+84) 24 3566 6232 / 24 3566 6234
Email: contact@imc.org.vn   Website: https://imc.org.vn