0

カメラで撮影した顔に顔認識を実装しようとしています。顔データセットを作成するには、1人の人物の複数の画像を保存する必要があります。そのためには、カメラから複数のフレームを取得して保存する必要があります。

#include"cv.h"
#include"highgui.h"
#include <iostream>
using namespace cv;
// Grab the next camera frame. Waits until the next frame is ready, and
// provides direct access to it, so do NOT modify or free the returned image!
// Will automatically initialize the camera on the first frame.
#include"highgui.h"
#include<iostream>

using namespace cv;
IplImage* getCameraFrame(CvCapture* &camera);
int main()
{
    CvCapture* camera = 0;  // The camera device.
    while ( cvWaitKey(10) != 27 ) 
    {   // Quit on "Escape" key.
        IplImage *frame = getCameraFrame(camera);
        cvSaveImage("Frame:",frame);
    }
    return 0;
}
IplImage* getCameraFrame(CvCapture* &camera)
{
    IplImage *frame;
    int w, h;

    // If the camera hasn't been initialized, then open it.
    if (!camera) {
        printf("Acessing the camera ...\n");
        camera = cvCreateCameraCapture( 0 );
        if (!camera) {
            printf("Couldn't access the camera.\n");
            exit(1);
        }
        // Try to set the camera resolution to 320 x 240.
        cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_WIDTH, 320);
        cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_HEIGHT, 240);
        // Get the first frame, to make sure the camera is initialized.
        frame = cvQueryFrame( camera );
        if (frame) {
            w = frame->width;
            h = frame->height;
            printf("Got the camera at %dx%d resolution.\n", w, h);
        }
        // Wait a little, so that the camera can auto-adjust its brightness.
        Sleep(1000);    // (in milliseconds)
    }

    // Wait until the next camera frame is ready, then grab it.
    frame = cvQueryFrame( camera );
    if (!frame) {
        printf("Couldn't grab a camera frame.\n");
        exit(1);
    }
    return frame;
}

ただし、cvSaveImageでは、保存する画像に名前を付ける必要があります。名前は一意である必要があります。そうでない場合、複数のフレームが1つの画像でのみ上書きされます。どうすればこの問題を解決できますか?

4

2 に答える 2

1

シーケンスのカウントに整数変数を使用できます

int counter = 0;
char *filename = "Photo"

while ( cvWaitKey(10) != 27 ) 
{   // Quit on "Escape" key.
    IplImage *frame = getCameraFrame(camera);

    counter++;
    filename = getNextName(counter);
    cvSaveImage(filename ,frame);
}

関数でgetNextName()は、整数変換と文字列連結を行うことができます.jpg

char* getNextName(int counter)
{
    char buf[5];
    char *filename = "Photo";

    // convert 123 to string [buf]
    itoa(counter, buf, 10);    // int to char 
    strcat(filename, buf);     // concat "Photo" + "1" = "Photo1"
    strcat(filename, ".jpg");  // concat "Photo1" + ".jpg" = "Photo1.jpg"

   return filename;
} 

番号のシーケンスで新しい名前を使用して画像を自動的に保存します。

于 2012-02-26T04:42:23.280 に答える
0

あなたは単に私たちがそのためにffmpegすることができます。次のコードは、ビデオをX画像に変換します

ffmpeg -i video.mpg image%d.jpg
于 2012-02-26T00:11:16.097 に答える