Frage

Ich versuche, die Gesichtserkennung auf von der Kamera erfassten Gesichtern zu implementieren. Um einen Gesichtsdatensatz zu erstellen, muss ich mehrere Bilder einer einzelnen Person speichern. Dazu muss ich mehrere Bilder von der Kamera aufnehmen und speichern.

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

Aber in cvSaveImage muss ich dem zu speichernden Bild einen Namen geben. Die Namen sollten eindeutig sein, sonst überschreiben mehrere Frames nur ein Bild.Wie kann ich dieses Problem lösen?

War es hilfreich?

Lösung

Sie können eine Ganzzahlvariable zum Zählen der Reihenfolge verwenden

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

im getNextName() Mit dieser Funktion können Sie eine Ganzzahlkonvertierung und eine Zeichenfolgenkonvertierung durchführen .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;
} 

Ihr Bild wird automatisch unter einem neuen Namen mit fortlaufender Nummerierung gespeichert.

Andere Tipps

Sie können einfach uns ffmpeg dafür. Der folgende Code dreht ein Video auf x-Bilder generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top