2

初心者の質問です。はい、同様の質問と回答をふるいにかけるのに多くの時間を費やしましたが、うまくいきませんでした。

私がやろうとしているのは、ビデオ ファイルからフレームを順番に保存することです。cを使用して1つの画像を保存できましたが、その後画像を保存できないようです。cの代わりにopencvでc ++の使用を開始しましたが、できることはビデオを表示することだけで、そこからjpgを保存することはできません。

それが役立つ場合、私はMacでopencv2.4.4aを使用しています。以下は私のcの例です

#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);
}
4

3 に答える 3

1

これは私のコードです...私は多くのことを試しましたが、最終的にこれはopencv 3を使用したc ++になりました...うまくいくことを願っています

#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;}


}


} 
于 2015-07-06T18:51:37.270 に答える
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;
}
于 2013-04-08T05:46:10.310 に答える