2013-03-11 4 views
3

Я новичок в OpenCV, и я хочу воспроизвести видео в OpenCV. Я сделал код, но он отображает только одно изображение. Я использую OpenCV 2.1 и Visual Studio 2008. Я был бы очень признателен, если бы кто-то руководил мной, где я ошибаюсь. Вот мой вставили код:Воспроизведение видео в OpenCV

#include "stdafx.h" 
#include "cv.h" 
#include "highgui.h" 

int main() 
{ 
CvCapture* capture = cvCaptureFromAVI("C:/OpenCV2.1/samples/c/tree.avi"); 
IplImage* img = 0; 
if(!cvGrabFrame(capture)){    // capture a frame 
printf("Could not grab a frame\n\7"); 
exit(0);} 
cvQueryFrame(capture); // this call is necessary to get correct 
        // capture properties 
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); 
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); 
int fps  = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); 
///numFrames=total number of frames 



printf("Number of rows %d\n",frameH); 
printf("Number of columns %d\n",frameW,"\n"); 
printf("frames per second %d\n",fps,"\n"); 
printf("Number of frames %d\n",numFrames,"\n"); 

for(int i=0;i<numFrames;i++) 
{ 
IplImage* img = 0; 
img=cvRetrieveFrame(capture); 
cvNamedWindow("img"); 
cvShowImage("img", img); 

} 
cvWaitKey(0); 
cvDestroyWindow("img"); 
cvReleaseImage(&img); 
cvReleaseCapture(&capture); 


return 0; 
} 

ответ

3

Вы должны использовать cvQueryFrame вместо cvRetrieveFrame. Также, как указано @Chipmunk, вы должны добавить задержку после cvShowImage.

#include "stdafx.h" 
#include "cv.h"  
#include "highgui.h" 
cvNamedWindow("img"); 
for(int i=0;i<numFrames;i++) 
{ 
    IplImage* img = cvQueryFrame(capture); 
    cvShowImage("img", img); 
    cvWaitKey(10); 
} 

Вот полный метод для воспроизведения видео с помощью OpenCV:

int main() 
{ 
    CvCapture* capture = cvCreateFileCapture("C:/OpenCV2.1/samples/c/tree.avi"); 

    IplImage* frame = NULL; 

    if(!capture) 
    { 
     printf("Video Not Opened\n"); 
     return -1; 
    } 

    int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH); 
    int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT); 
    double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
    int frame_count = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); 

    printf("Video Size = %d x %d\n",width,height); 
    printf("FPS = %f\nTotal Frames = %d\n",fps,frame_count); 

    while(1) 
    { 
     frame = cvQueryFrame(capture); 

     if(!frame) 
     { 
      printf("Capture Finished\n"); 
      break; 
     } 

     cvShowImage("video",frame); 
     cvWaitKey(10); 
    } 

    cvReleaseCapture(&capture); 
    return 0; 
} 
+0

Функции cvQueryFrame() и cvWaitKey(), похоже, решили issue.Thank you :) –

+0

@AaymanKhalid Вы можете считать [принятие ответа] (http://meta.exechange.com/a/5235). :) – sgarizvi

+0

еще одна вещь, какая разница между createFileCapture и captureFromAVI ??? –

1

После показа образа на окне, должно быть задержка или ждать до следующего изображения может быть шоу, я думаю, что вы можете догадаться, почему это. Хорошо, поэтому за эту задержку мы используем cvWaitKey(). И вот что я добавил в код цикла.

cvNamedWindow("img"); 
for(int i=0;i<numFrames;i++) 
{ 
    IplImage* img = 0; 
    img=cvRetrieveFrame(capture); 

    cvShowImage("img", img); 
    cvWaitKey(10); 

} 
+0

Это не похоже на работу :(Я понимаю вещь, которую я использую кузен петли я знаю numbre из кадры, но цель цикла - это в основном доступ к индексу элементов по индексу. Есть ли способ захватить индекс кадров по индексу? @chipmunk –

+0

' IplImage * frame = NULL; cvNamedWindow (" img ", CV_WINDOW_AUTOSIZE); while (key! = 'q') { frame = cvQueryFrame (capture); если (! Рама) { печатьf ("!!! cvQueryFrame не удалось: нет кадров \ п "); перерыв; } cvShowImage (" IMG», кадр); ключ = cvWaitKey (27); }' – Chipmunk

+0

То, что я сделал выше, создается окно снаружи петля и изображение IPL, которое я объявил oustside.Это также увеличит вашу производительность, и, конечно, это в цикле while, и вам не нужно получать frameCount. – Chipmunk