OpenCV: Laden Sie mehrere Bilder

Ich die Aktualisierung einige ältere OpenCV-code, der geschrieben wurde (glaube ich) ein OpenCV 1.1 Art und Weise (d.h. mit IplImages).

Was ich erreichen will ist im Moment laden Sie einfach eine Reihe von Bildern (übergeben als Kommandozeilen-Argumente) als Matten. Dies ist Teil einer größeren Aufgabe. Die erste code-Beispiel unten ist der alte code image loading-Methode. Es lädt 5 Bilder von der Kommandozeile aus und zeigt Sie in der Reihenfolge, Pause für einen Schlüssel nach jedem Treffer, dann beendet.

Dem zweiten code-Beispiel ist meine aktualisierte version mit Mat. Es funktioniert so weit, aber ist das der beste Weg, dies zu tun? Ich habe ein array von Mats. Sollte ich ein array von Zeigern auf Matten statt? Und gibt es eine Möglichkeit, dies zu tun, so dass die Anzahl der Bilder wird zur Laufzeit ermittelt aus argc und nicht eingestellt werden müssen, um vor der Zeit mit IMAGE_NUM.

Im Grunde, ich möchte in der Lage sein, um eine Nummer (innerhalb Grund) der Bilder, die als Kommandozeilen-Argumente, und die haben Sie geladen in einigen praktische-Arrays oder andere ähnliche Lagerung für die spätere Verwendung.

Dank.

Alter code:

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
using namespace std;
using namespace cv;

//the number of input images
#define IMAGE_NUM 5

int main(int argc, char **argv)
{
    uchar **imgdata;
    IplImage **img;
    int index = 0;
    char *img_file[IMAGE_NUM];

    cout << "Loading files" << endl;
    while(++index < argc)
        if (index <= IMAGE_NUM)
            img_file[index-1] = argv[index];

    //malloc memory for images
    img = (IplImage **)malloc(IMAGE_NUM * sizeof(IplImage *)); //Allocates memory to store just an IplImage pointer for each image loaded
    imgdata = (uchar **)malloc(IMAGE_NUM * sizeof(uchar *));

    //load images. Note: cvLoadImage actually allocates the memory for the images
    for (index = 0; index < IMAGE_NUM; index++) {
        img[index] = cvLoadImage(img_file[index], 1);
        if (!img[index]->imageData){
            cout << "Image data not loaded properly" << endl;
            return -1;
        }
        imgdata[index] = (uchar *)img[index]->imageData;
    }

    for (index = 0; index < IMAGE_NUM; index++){
        imshow("myWin", img[index]);
        waitKey(0);
    }

    cvDestroyWindow("myWin");
    cvReleaseImage(img);

    return 0;
}

Neuen code:

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <time.h>
using namespace std;
using namespace cv;

//the number of input images
#define IMAGE_NUM 5

int main(int argc, char **argv)
{
    Mat img[IMAGE_NUM];
    int index = 0;

    for (index = 0; index < IMAGE_NUM; index++) {
        img[index] = imread(argv[index+1]);
        if (!img[index].data){
            cout << "Image data not loaded properly" << endl;
            cin.get();
            return -1;
        }
    }

    for (index = 0; index < IMAGE_NUM; index++) {
        imshow("myWin", img[index]);
        waitKey(0);
    }
    cvDestroyWindow("myWin");
    return 0;
}
InformationsquelleAutor SSilk | 2010-07-16
Schreibe einen Kommentar