Khái niệm: video là 1 file chứa hình ảnh & âm thanh được đồng bộ với nhau, được tạo ra bởi 1 chuẩn nén nào đó, như MPEG, XviD, H264,… Các định dạng phổ biến nhất là MP4, AVI, WMV,.. và mới nhất hiện nay là WEBM. Để xử lý hình ảnh từ video thì phải decode ra thành những frame hình rồi mới xử lý.
Trong xử lý ảnh không quan tâm đến audio. Video file được xem như là chuỗi các hình ảnh liên tiếp nhau, như file video 24 fps (frame per second) thì ta thu được 24 hình mỗi giây sau khi extract. Tương tự ảnh gif cũng có thể dùng chung code đọc video vì bản chất của video và gif tương tự nhau.
Khi xử lý thì trích xuất khung hình ra nhờ thư viện ffmpeg đi kèm sẵn trong thư viện OpenCV. OpenCV đã làm sẵn phần đọc video file, chúng ta không cần quan tâm đến chuẩn nén hay các thông số khác của video. Để có thể xử lý video cần copy file opencv_ffmpeg320.dll vào cùng folder với file exe output (giả sử đang dùng OpenCV 3.2.0)
Các hàm hữu dụng
Play video
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cv::VideoCapture mCap = cv::VideoCapture(videoFilePath); int startIndex = 0; mCap.set(CV_CAP_PROP_POS_FRAMES, startIndex); cv::Mat frame; while (true) { mCap.read(frame); if (!frame.data) { break; } cv::imshow("frame", frame); cv::waitkey(1) } |
Đếm tổng số frame của video
1 2 |
cv::VideoCapture mCap = cv::VideoCapture("E:\\video1.mp4"); int amountOfFrame = mCap.get(CV_CAP_PROP_FRAME_COUNT); |
Trích xuất hình ảnh từ 1 frame bất kỳ
1 2 3 4 |
cv::VideoCapture mCap = cv::VideoCapture("E:\\video1.mp4"); mCap.set(CV_CAP_PROP_POS_FRAMES, frameIndex); cv::Mat frame; mCap.read(frame); |