Hướng dẫn đọc nhiều camera trong OpenCV bằng multithread

Giả sử bạn đang thực hiện bài toán detect khuôn mặt bằng Python và bạn có 3 camera với ID là 0,1,2. Thông thường bạn sẽ có 2 cách thực hiện:

  1. Truyền tham số khi gọi file, hàm __main__ sẽ nhận ID của camera và play. Cách này có nhược điểm là bạn phải gọi 3 lần.
  2. Viết vòng lặp trong vòng lặp để đọc từng camera, đọc camera này rồi tới camera kia. Cách này có nhược điểm là camera phải chờ nhau nếu camera không cùng FPS hoặc xử lý khác nhau

Bài viết này sẽ hướng dẫn đọc nhiều camera trong OpenCV bằng multithread. Ưu điểm là mỗi camera sẽ chạy ở 1 thread độc lập, không ảnh hưởng nhau. Camera ID được khai báo trong 1 mảng nên không cần gọi nhiều lần.

Source code và giải thích

Bên dưới là source code hoàn chỉnh, các bạn có thể save thành webcam_multithread.py để chạy. Giả sử bạn có 1 webcam và 2 camera IP được khai báo trong cameraIDs

Hàm PlayCamera nhận vào là ID của webcam hoặc stream url của camera IP. Trong hàm có vòng lặp để đọc frame và hiển thị hình ảnh như thông thường.

Phần quan trọng là khai báo Thread, do số lượng camera khai báo tùy ý nên cần viết 1 vòng lặp để khởi tạo. Cú pháp tạo thread là
t = threading.Thread(target=PlayCamera, args=(id,))

Truyền tham số target là tên hàm, các tham số thì truyền vào args.
Lưu ý: nếu bạn chỉ truyền 1 tham số thì sau tham số đó phải có dấu phẩy, ở trên là sau biến id có dấu phẩy. Nếu không có dấu phẩy sẽ xảy ra lỗi nếu như id là string.

Thông tin thêm

Ở trên là code đơn giản nhất để các bạn hiểu về lập trình đa luồng trong OpenCV. Có 1 số ghi chú như sau:

  • Do mỗi camera play ở 1 thread nên ấn nút Q ở window nào sẽ tắt window đó mà không ảnh hưởng window khác
  • Các thread không sử dụng chung tài nguyên nên trong trường hợp này không cần join()