Sử dụng cvSetCaptureProperty(), bạn có thể chuyển qua khung, theo mili giây hoặc theo số khung thứ tự.
int cvSetCaptureProperty(CvCapture* capture, int property_id, double value);
property_id là một tài sản mà bạn sẽ cần phải sử dụng. Nó có thể là một trong những cách sau:
- CV_CAP_PROP_POS_MSEC - vị trí trong mili giây từ tập tin bắt đầu
- CV_CAP_PROP_POS_FRAMES - vị trí trong khung
- CV_CAP_PROP_POS_AVI_RATIO - vị trí trong đơn vị tương đối (0 - bắt đầu tệp, 1 - cuối của tệp)
- CV_CAP_PROP_FRAME_WIDTH - chiều rộng của khung trong luồng video (chỉ dành cho máy ảnh)
- CV_CAP_PROP_FRAME_HEIGHT - hei ght khung trong luồng video (chỉ dành cho máy ảnh)
- CV_CAP_PROP_FPS - tốc độ khung hình (chỉ dành cho máy ảnh)
- CV_CAP_PROP_FOURCC - Mã mã gồm 4 ký tự (chỉ dành cho máy ảnh).
Hai điều đầu tiên bạn quan tâm.
EDIT: biết thêm :)
Bạn có thể lướt qua khung chỉ bằng cách liên tục gọi hàm đề cập với chỉ số khung khác nhau.
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameIndex);
Ví dụ:
IplImage* frame;
CvCapture* capture = cvCreateFileCapture("test.avi");
/* iterate through first 10 frames */
for (int i = 0; i < 10; i++)
{
/* set pointer to frame index i */
cvSetCaptureProperty(capture, CV_CAP_POS_FRAMES, i);
/* capture the frame and do sth with it */
frame = cvQueryFrame(capture);
}
Bạn có thể đặt mã tương tự để thực hiện mỗi người dùng thời gian nhấp vào một nút để chuyển tiếp/tua lại video.
Phương pháp C++ (OpenCV 2 trở lên) sẽ sử dụng phương pháp này thay vì cùng một giá trị property_id và giá trị.
bool VideoCapture::set(int property_id, double value)
Bằng cách này cũng giống như mẹo, OpenCV tìm kiếm không hoạt động đúng trên flv nếu bạn gặp khó khăn bất cứ lúc nào để tìm kiếm không hoạt động. Đã cho tôi một ngày để tìm ra nó !!! –