2013-04-08 3 views
2

Вопрос для новичков и да, я потратил много времени, просеивая похожие вопросы и ответы без везения.сохранение последовательности изображений из видео с помощью opencv2

То, что я пытаюсь сделать, это сохранить кадры из видеофайла в последовательном порядке. Мне удалось сохранить одно изображение с помощью c, и после этого я не могу сохранить изображения. Я начал использовать C++ в opencv вместо c, и все, что я могу сделать, это просмотреть видео и не сохранять никаких jpg из него.

Я использую opencv2.4.4a на mac, если это помогает. ниже моего с примером

#include <stdio.h> 
#include <stdlib.h> 
#include <opencv/cv.h> 
#include <opencv/highgui.h> 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main (int argc, char** argv) 
{ 
//initializing capture from file 
CvCapture * capture = cvCaptureFromAVI ("/example/example.mov"); 

//Capturing a frame 
IplImage* img = 0; 
if(!cvGrabFrame(capture))  //capture a frame 
{ 
printf)Could not grab a fram\n\7"); 
exit(0); 
} 
img=cvRerieveFrame(capture); //retrieve the captured frame 

//writing an image to a file 
if (!cvSaveImage("/frames/test.jpg", img)) 
printf("Could not save: %s\n","test.jpg"); 

//free resources 
cvReleaseCapture(&capture); 

} 

Спасибо заранее

редактировать к вышесказанному.

Я добавил к вышеуказанному коду, который приводит к тому, что изображение будет сохранено с помощью test.jpg, а затем будет перезаписано со следующим кадром. Как сообщить opencv не копировать по последнему изображению и переименовать следующий кадр в test_2.jpg например, test_1.jpg, test_2.jpg и так далее?

double num_frames = cvGetCaptureProperty (capture, CV_CAP_PROP_FRAME_COUNT); 

for (int i = 0; i < (int)num_frames; i++) 
{ 
img = cvQueryFrame(capture); 
cvSaveImage("frames/test.jpg", img); 
} 

cvReleaseCapture(&capture); 
} 

ответ

0

Используйте индекс, который будет отслеживать номер детали в имени файла. В цикле захвата изображения добавьте индекс с именем файла и создайте окончательное имя файла.

вот пример:

while(1) 
{ 
    cap.read (frame); 
    if(frame.empty()) break; 
    imshow("video", frame); 
    char filename[80]; 
    sprintf(filename,"C:/Users/cssc/Desktop/testFolder/test_%d.png",i); 
    imwrite(filename, frame); 
    i++; 
    char key = waitKey(10); 
    if (key == 27) break; 
} 
+0

Благодарю Баршана! Мне пришлось включить int i = 0; я ++; и это сработало – geophotologist

1

Это мой код ... Я судимое много и, наконец, сделал это это C++ с использованием OpenCV 3 ... надеюсь, что это работает

#include "opencv2/opencv.hpp" 
#include <sstream> 
#include <iostream> 


using namespace cv; 
using namespace std; 

Mat frame,img; 
    int counter; 

int main(int,char**) 
    { 
     VideoCapture vid("video3.avi"); 


while (!vid.isOpened()) 
{ 
    VideoCapture vid("video2.MOV"); 
    cout << "charging" << endl; 
    waitKey(1000); 

} 

cout << "Video opened!" << endl; 

while(1) 
{ 
    stringstream file; 

    vid.read(frame); 
    if(frame.empty()) break; 
    file << "/home/pedro/workspace/videoFrame/Debug/frames/image" << counter << ".jpg"; 
    counter++; 
    imwrite(file.str(),frame); 

    char key = waitKey(10); 
if (key == 27) 
{break;} 


} 


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