сохранение последовательности изображений из видео с помощью opencv2
Вопрос новичка и да, я потратил много времени, просеивая подобные вопросы и ответы, но безуспешно.
Я пытаюсь сохранить кадры из видеофайла в последовательном порядке. Мне удалось сохранить одно изображение с помощью c, и я не могу сохранить изображения после этого. Я начал использовать c++ в opencv вместо c, и все, что я могу сделать, это просмотреть видео и не сохранять из него jpg.Я использую opencv2. 4. 4 a на 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 framn7");
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: %sn","test.jpg");
//free resources
cvReleaseCapture(&capture);
}
Заранее благодарю вас
Отредактируйте вышеизложенное.
Я добавил к приведенному выше коду, который приводит к изображению, которое будет сохранено с тестом.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);
}
2 ответа:
Используйте индекс, который будет отслеживать числовую часть в имени файла. В цикле захвата изображений добавьте индекс с именем файла и создайте окончательное имя файла.
Вот пример:
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; }
Это мой код... Я много старался и в конце концов добился своего. это 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;} } }