2012-02-12 46 views
5
#include "cv.h" 
#include "highgui.h" 
int main(int argc, char** argv) 
{ 
CvCapture* capture=0; 
IplImage* frame=0; 

capture = cvCaptureFromAVI("C:\\boy walking back.avi"); // read AVI video 
if(!capture) 
    throw "Error when reading steam_avi"; 

cvNamedWindow("w", 1); 

for(; ;) 
{ 
/* int cvGrabFrame (CvCapture* capture); 
    IplImage* cvRetrieveFrame (CvCapture* capture)*/ 
    frame = cvQueryFrame(capture); 
if(!frame) 
     break; 
    cvShowImage("w", frame); 

} 
cvWaitKey(0); // key press to close window 
cvDestroyWindow("w"); 
cvReleaseImage(&frame); 
} 

Tôi đang sử dụng openCV với VS2008. Tôi đã đọc trong một tệp video và đã sử dụng CV_CAP_PROP_FRAME_COUNT để có được số lượng khung hình xấp xỉ 130 cho một video clip dài 4 giây. Tôi đang thực hiện một chuyển động nhận dạng của đi bộ vì vậy tôi cần phải nhận được mỗi 5 khung hình khác kể từ giữa 5 khung hình, có rất ít thay đổi trong chuyển động của cơ thể. Tôi có một chương trình cho đến nay cho phép tôi có được một khung hình của video clip. Tuy nhiên, tôi không thể có được khung hình khác nhau và cũng có thể, tôi không chắc chắn làm thế nào để đi về nhận được mỗi 5 khung hình khác. Ở trên là mã được sử dụng để có được một khung hình của video.Nhận các khung từ video .avi bằng cách sử dụng OpenCV

Trả lời

6

Bạn có thể bỏ qua 4 khung và sau đó giữ khung thứ 5. Dưới đây là một ví dụ nhỏ tôi đã viết để chứng minh điều này:

IplImage* skipNFrames(CvCapture* capture, int n) 
{ 
    for(int i = 0; i < n; ++i) 
    { 
     if(cvQueryFrame(capture) == NULL) 
     { 
      return NULL; 
     } 
    } 

    return cvQueryFrame(capture); 
} 


int main(int argc, char* argv[]) 
{ 
    CvCapture* capture = cvCaptureFromFile("../opencv-root/samples/c/tree.avi"); 

    IplImage* frame = NULL; 
    do 
    { 
     frame = skipNFrames(capture, 4); 
     cvNamedWindow("frame", CV_WINDOW_AUTOSIZE); 
     cvShowImage("frame", frame); 
     cvWaitKey(100); 
    } while(frame != NULL); 

    cvReleaseCapture(&capture); 
    cvDestroyWindow("frame"); 
    cvReleaseImage(&frame); 

    return 0; 
} 

Hy vọng rằng sẽ giúp :)

+0

Nhờ sự giúp đỡ của bạn. Tha thứ cho tôi nếu tôi xuất hiện ngớ ngẩn, nhưng tôi khá mới với OpenCV. Khi mã của bạn được chạy, video clip chạy ở tốc độ nhanh hơn, tất nhiên, có thể được thay đổi bằng cách điều chỉnh thời gian trễ từ 100 v.v. Tuy nhiên, có cách nào để có được 1 trong 5 khung hình của video không? Ví dụ, đầu ra của mã sẽ là một khung hiển thị người ở giữa chuyển động. Nhưng cảm ơn bạn rất nhiều vì sự hỗ trợ của bạn cho đến nay. –

+1

Vì vậy, bạn có hỏi liệu bạn có thể tìm kiếm khung X, trong đó X có thể là bất kỳ khung hình nào từ 1 đến 5 không? – mevatron

+0

tôi đã có thể trích xuất rất 1 trong 5 khung hình. Cảm ơn sự giúp đỡ của bạn :) Tôi hiện đang cố gắng tạo hình ảnh mặt nạ hoặc hình ảnh được sao chép của một khung trong video. Tôi muốn tải lên 2 hình ảnh để cho bạn thấy những gì tôi đang cố gắng hoàn thành nhưng tôi chưa có danh tiếng 10:/Bạn vẫn có thể tư vấn cho tôi về chức năng openCV nào sẽ sử dụng? –

Các vấn đề liên quan