我正在更新一些OpenCV 1.1代碼(即使用IplImages)寫入的(我猜)OpenCV代碼。OpenCV:加載多個圖像
我現在想要完成的是簡單地加載一系列圖像(作爲命令行參數傳遞)作爲Mats。這是更大任務的一部分。下面的第一個代碼示例是舊代碼的圖像加載方法。它從命令行加載5個圖像並按順序顯示它們,在每個圖像之後暫停鍵擊,然後退出。
第二個代碼示例是我使用Mat的更新版本。到目前爲止它工作正常,但是這是做到這一點的最佳方式嗎?我使用了一系列的墊子。我應該使用指向Mats的指針數組嗎?有沒有辦法做到這一點,使圖像的數量在運行時從argc
確定,並不需要提前設置IMAGE_NUM
。
基本上,我想能夠通過圖像作爲命令行參數的任何數量的(在合理範圍內),並將它們加載到一些方便的陣列或其他類似的存儲以供以後參考。
謝謝。
舊代碼:
#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;
}
新代碼:
#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;
}
快速更新:當Gootik回覆時,我不熟悉Standad Template Library的std :: vector,並且沒有看到他的建議中的值。現在我對矢量更加熟悉,我更喜歡他的建議,雖然我的工作對我的目的來說確實很好。 – SSilk 2011-08-08 13:50:13