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;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie mit einem vector statt array:
beispielsweise
Es dauerte eine Weile, um wieder um zu sehen, aber was ich habe, bis dieser Vorgang beendet ist, wie folgt, die wohl funktionell die gleiche wie Gootik Vorschlag. Das hat gut für mich gearbeitet. Beachten Sie, dass für Funktionen, die
Mat&
(D. H. eine einzelnecv::Mat
), Sie können nur de-ref array von Matten und pass auf, das ist eine Schreibweise, ich bin noch komfortabler mit nach tun eine Menge von Bild-Verarbeitung in Matlab.