5/05/2015

Video Processing with OpenCV


OpenCV có hỗ trợ xử lí video. Có 2 dạng hỗ trợ, thứ nhất là video thu nhận từ webcam và thứ hai là video đọc từ tập tin video.

Tôi chưa bao giờ dùng OpenCV để đọc file video cho xử lí của mình nên không rành lắm. Tuần rồi, tôi với Phong dùng code STIP của Ivan Laptev để extract space time interest points mới đụng chuyện này. Code STIP của Laptev (chạy trên Windows) viết bằng OpenCV, do đó việc đọc dữ liệu video được giao cho OpenCV xử lí. Rắc rối ở đây là có những tập tin video đưa vào, chương trình nó chỉ báo một câu lỗi duy nhất rồi thoát ra luôn. 

Để có thể hiểu rõ hơn về hỗ trợ của OpenCV trong xử lí các tập tin video, link này là quan trọng nhất: http://opencv.willowgarage.com/wiki/VideoCodecs

Có thể nói tóm tắt như thế này: Với mỗi tập tin video, có 2 khái niệm cần được phân biệt, đó là container và codec. Ví dụ AVI là container, còn DivX là codec. Container liên quan đến định dạng của tập tin video, ví dụ qui định video, audio, subtitle lưu như thế nào để chương trình đọc nó có thể đọc lên và synchronize; trong khi đó codec liên quan đến thuật toán nén dữ liệu. Sự kết hợp của container và codec sẽ cho ra nhiều output khác nhau. Chính vì sự phức tạp như vậy nên nhiều khi cùng là một tập tin có phần mở rộng là avi, nhưng có máy lại đọc được có máy lại đọc không được. Lí do chính nằm ở chỗ, codec có thể khác nhau, và nếu máy không cài phần mềm hỗ trợ codec đó thì nó không đọc được. Sự nhầm lẫn còn là do đôi lúc người ta gộp 2 khái niệm lại làm một, ví dụ khi nói đến file .mp4 cho iPhone, thực ra là người ta đang nói đến container mp4, và codec là H.264/AVC.

Trên Windows, OpenCV chỉ hỗ trợ các tập tin video được lưu theo container dạng AVI (điều này cũng dễ hiểu vì AVI là định dạng do Microsoft đề xuất), còn codec là loại dữ liệu không nén. Dữ liệu không nén tất nhiên sẽ cho kích thước rất lớn, gấp cả trăm lần so với dữ liệu được nén (ví dụ dùng H.264/AVC). Cứ tưởng tượng phải xử lí 100G video dạng nén với OpenCV, thì sẽ thấy dữ liệu dạng không nén lớn khủng khiếp như thế nào. Việc OpenCV chỉ hỗ trợ video dạng không nén, có lẽ là do vấn đề bản quyền.

Có một thực tế là dù trong danh sách này http://opencv.willowgarage.com/wiki/VideoCodecs, có thể coi OpenCV không đọc được mp4. Tuy nhiên vẫn có máy chạy được, có máy không. Lí do vì sao? Rất đơn giản, nếu Windows Media Player đọc được tập tin dữ liệu nào (nghĩa là codec tương ứng đã được cài đặt vào máy) thì OpenCV sẽ đọc được dạng đó. Do đó, bạn nên cài vào máy của mình các codec cơ bản nhất bằng cách dùng K-Lite Codec Pack. Cài đặt các phần mềm như DivX Player hay VLC cũng là một cách bổ sung codec cho máy của mình.

Ngoài Virtual Dubb khá thông dụng cho việc chuyển đổi các định dạng video, phần mềm sau cũng cực kì hữu ích SUPER: http://www.erightsoft.com/SUPER.html. Dùng nó có thể convert qua lại đủ loại video cho đủ loại device từ mobile phone, iphone, cho đến PC.

Nguồn: Blog Lê Đình Duy

No comments:

Post a Comment