Thị giác máy tính với OpenCV-Python Bài 2, Phần 2: Thao tác cơ bản với video
19:52 - 28/11/2021
Ở bài trước chúng ta đã học cách thao tác cơ bản với hình ảnh. Bài này sẽ hướng dẫn cách đọc, hiển thị, lưu video, lấy và hiển thị video từ camera.
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 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
Lấy video từ camera
OpenCV cung cấp một giao diện rất đơn giản cho việc lấy video live stream trên camera. Chúng ta sẽ quay video từ webcam tích hợp trên laptop, chuyển nó thành video thang độ xám và hiển thị nó.
Để lấy video, bạn cần tạo một đối tượng VideoCapture. Đối số của nó có thể là chỉ mục thiết bị hoặc tên của tệp video. Chỉ mục thiết bị là số để chỉ định camera nào. Thông thường, khi camera được kết nối, chỉ cần truyền tham số 0 (hoặc -1), hoặc có thể chọn camera thứ hai bằng cách truyền tham số 1, ... Sau đó, chúng ta có thể thu lần lượt từng khung hình. Khi kết thúc thao tác, phải nhớ giải phóng video đã thu. Xem đoạn code ví dụ dưới đây:
- import numpy as np
- import cv2
- cap = cv2.VideoCapture(0)
- while(True):
- # Thu lan luot tung khung hinh (frame-by-frame)
- ret, frame = cap.read()
- # Thao tac tren frame (chuyen thanh anh xam)
- gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
- # Hien thi frame
- cv2.imshow('frame', gray)
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
- # Giai phong video khi thuc hien xong thao tac
- cap.release()
- cv2.destroyAllWindows()
Lưu đoạn code dưới tên “video-cap.py”. Để chạy chường trình: mở cửa sổ cmd, truy cập đến thư mục chứa đoạn code và thực hiện dòng lệnh “python video-cap.py”. Kết quả nhận được như sau:
Hàm cap.read() trả về bool (Đúng/Sai). Nếu khung được đọc chính xác, nó trả về True. Vì vậy, có thể kiểm tra phần kết thúc của video bằng cách kiểm tra giá trị trả lại này. Đôi khi, hàm “cap” có thể chưa khởi tạo thu video. Trong trường hợp đó, code sẽ hiển thị lỗi. Có thể kiểm tra xem nó có được khởi tạo hay không bằng phương thức cap.isOpened(). Nếu trả về True là OK. Nếu ngược lại, hãy mở nó bằng hàm cap.open().
Ngoài ra, có thể truy cập một số tính năng của video này bằng phương thức cap.get(propId), trong đó propId là một số từ 0 đến 18. Mỗi số biểu thị một thuộc tính của video (nếu có thể áp dụng cho video đó). Một số giá trị này có thể được sửa đổi bằng cap.set(propId, value), trong đó “value” là giá trị mới mà bạn muốn.
Ví dụ, có thể kiểm tra chiều rộng và chiều cao của frame bằng cap.get(3) và cap.get(4). Theo mặc định, kết quả nhận được là 640x480. Nếu muốn sửa đổi nó thành 320x240, chỉ cần thực hiện: ret = cap.set (3, 320) và ret = cap.set (4, 240).
Phát video từ tệp
Việc này cũng giống như lấy video từ camera, chỉ cần thay đổi chỉ mục camera bằng tên tệp video. Ngoài ra, trong khi hiển thị frame, hãy sử dụng thời gian thích hợp cho cv2.waitKey(). Nếu thời gian quá ít, video sẽ rất nhanh và nếu quá dài, video sẽ chậm (Đó là cách để hiển thị video ở dạng quay chậm). Thời gian 25 mili giây ứng với trường hợp bình thường.
- import numpy as np
- import cv2
- cap = cv2.VideoCapture('skydrive.mp4')
- while(cap.isOpened()):
- ret, frame = cap.read()
- gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
- cv2.imshow('frame', gray)
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
- cap.release()
- cv2.destroyAllWindows()
Kết quả khi thực thi đoạn code trên:
Lưu video
Lưu hình ảnh khá đơn giản, chỉ cần sử dụng hàm cv2.imwrite(), nhưng với video cần phải thực hiện nhiều hơn một chút.
Để lưu video, trước tiên cần tạo một đối tượng VideoWriter. Nên chỉ định tên tệp đầu ra (ví dụ: output.avi). Sau đó, cần chỉ định mã FourCC, truyền số khung hình trên giây (fps), kích thước khung hình, và cuối cùng là cờ isColor. Nếu isColor trả về True, bộ mã hóa mong đợi khung màu, nếu không nó hoạt động với khung thang độ xám.
FourCC là một mã 4 byte được sử dụng để chỉ định codec video. Danh sách các mã có sẵn có thể được tìm thấy trong fourcc.org. Nó phụ thuộc vào nền tảng, lấy ví dụ, các codec sau tương thích trong hệ điều hành tương ứng:
Trong Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID được ưu tiên hơn. MJPG dẫn đến video có kích thước lớn. X264 cung cấp video có kích thước rất nhỏ).
Trong Windows: DIVX.
Mã FourCC được truyền dưới dạng cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') hoặc cv2.VideoWriter_fourcc (*'MJPG') cho MJPG.
Dưới đây là đoạn code minh họa:
- import numpy as np
- import cv2
- cap = cv2.VideoCapture(0)
- # Xac dinh codec and tao doi tuong VideoWriter
- fourcc = cv2.VideoWriter_fourcc(*'XVID')
- out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640,480))
- while(cap.isOpened()):
- ret, frame = cap.read()
- if ret==True:
- frame = cv2.flip(frame,0)
- # Ghi lai khung hinh
- out.write(frame)
- cv2.imshow('frame',frame)
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
- else:
- break
- # Giai phong moi thu khi thuc hien xong
- cap.release()
- out.release()
- cv2.destroyAllWindows()
Ở phần tiếp theo chúng ta sẽ tìm hiểu cách vẽ các hình cơ bản trên 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