2013-04-13 2 views
3
#include "opencv2/opencv.hpp" 
#pragma comment (lib , "opencv_core244d.lib") 
#pragma comment (lib ,"opencv_highgui244d.lib") 
#pragma comment(lib , "opencv_imgproc244d.lib") 
int main(int argc, char* argv[]) 
{ 
    CvCapture* capture = cvCaptureFromFile("try.avi"); 

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

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

    return 0; 
} 

Это моя программа для получения кадров из видео, но когда я запускаю эту программу, она работает, она показывает мне видео, но не сохраняет их автоматически (без использования каких-либо кнопок или мышь), который должен сохранить в моем каталогеПолучение кадра из видео

+0

Дополнительное замечание: так как вы используете последнюю OpenCV (2.4.4) и ++ API C через opencv.hpp, вы должны в полной мере воспользоваться этим API с помощью C++ вместо C structs, то есть cv :: Mat вместо IplImage *, cv :: namedWindow() и т. Д. Вы получите много практических преимуществ, таких как автоматическое управление памятью. – sansuiso

ответ

2
#include"stdafx.h" 
#include<cv.h> 
#include<highgui.h> 
#include<cxcore.h> 


int main(int argc, char* argv[]) { 

int c=1; 
IplImage* img=0; 
char buffer[1000]; 
CvCapture* cv_cap = cvCaptureFromFile("try.avi"); 
cvNamedWindow("Video",CV_WINDOW_AUTOSIZE); 
while(1) { 

img=cvQueryFrame(cv_cap); 
cvShowImage("Video",img); 
sprintf(buffer,"D:/image%u.jpg",c); 
cvSaveImage(buffer,img); 
c++; 
    if (cvWaitKey(100)== 27) break; 
} 

cvDestroyWindow("Video"); 
return 0; 
} 

Попробуйте, это будет работать

3

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

+0

, но как сохранить эти кадры, и я хочу, чтобы программа автоматически сохраняла эти кадры. – Rocket

+0

Это так просто. просто сохраните отдельные кадры с другим именем. – Saikat

3

Для сохранения каждого кадра в отдельности,

  1. #include<stdio.h>

  2. Объявите глобальную переменную

    int flag=0;

  3. добавить следующий код чуть ниже в cvWaitKey (0):

    char *str=new char[50]; 
    
    flag++; 
    sprintf(str,"%d",flag); 
    strcat(str," frame"); 
    strcat(str,".jpg"); 
    Mat image=frame; 
    imwrite(str,image); 
    
+0

+1 для ответа, какая библиотека используется для Mat и imwrite? потому что он показывает это undefined – Rocket

+1

Эти функции находятся в пространстве имен cv ::. Поэтому вы можете использовать их с 'cv :: Mat' и' cv :: imwrite'. Или определите пространство имен с 'using namespace cv'. – Alexey

+2

Программа @baban должна автоматически сохранять кадры, я не хочу сохранять изображение через нажатие любой кнопки или любое внешнее использование – Rocket

0

Вы должны использовать cvSaveImage() явно сохранять каждый кадр.
Это должно быть сделано в вашем цикле, где вы хотите сохранить рамку.
Очевидно, что если вы хотите сохранить каждый кадр с другим именем, вы должны генерировать разные имена для каждого вызова. @baban показывает один из способов сделать это.

Смежные вопросы