2010-07-16 169 views
0

我正在更新一些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; 
} 

回答

2

,你可以用它代替陣列中的向量:

例如

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

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

    for (index = 0; index < IMAGE_NUM; index++) { 

     //img[index] = imread(argv[index+1]); 
     img.push_back(imread(argy[index+1])); 

     if (!img[index].data){ 
      cout << "Image data not loaded properly" << endl; 
      cin.get(); 
      return -1; 
     } 
    } 

    vector<Mat>::iterator it; 

    for (it = img.begin(); it != img.end() ; it++) { 
     imshow("myWin", (*it)); 
     waitKey(0); 
    } 
    cvDestroyWindow("myWin"); 
    return 0; 
} 
0

我花了一段時間後回到這個,但我最終做的是如下,這可能在功能上與Gootik的建議相同。這對我來說很好。請注意,對於採取Mat&(即單次cv::Mat)功能,你可以去參考墊的陣列和傳遞,這是一個符號,我更舒服Matlab中做了很多圖像處理工作後。

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

int main(int argc, char **argv) 
{ 
    if (argc==1){ 
     cout << "No images to load!" << endl; 
     cin.get(); 
     return 0; 
    } 

    int index = 0; 
    int image_num = argc-1; 

    Mat *img = new Mat[image_num]; // allocates table on heap instead of stack 

    // Load the images from command line: 
    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"); 

    delete [] img; // notice the [] when deleting an array. 
    return 0; 
} 
+0

快速更新:當Gootik回覆時,我不熟悉Standad Template Library的std :: vector,並且沒有看到他的建議中的值。現在我對矢量更加熟悉,我更喜歡他的建議,雖然我的工作對我的目的來說確實很好。 – SSilk 2011-08-08 13:50:13