2013-01-24 18 views
0

我正在使用CvLoadImage(使用C編程語言)。CvLoadImage函數和列表

不是傳遞的路徑,或者我的名字,讓我們說,.jpg文件作爲函數的參數,我可以使用具有每.jpg形象我想開的每一個路徑列表(動態結構)?

例如,我曾經想過的代碼是這樣的:具有與該名稱的所有路徑申報清單

CvLoadImage(list->name)

的而不是這樣的:CvLoadImage("name.jpg")

在每一個手動我讀,它只是指定的函數接收的名稱或一個圖像的路徑,但我想其他的與後遞歸打開一個圖像那些來自列表的路徑,我不知道如何去做。

這是我能做什麼(有些事情是在西班牙,因爲我們講西班牙語,和其他一些東西與文件混合)

struct fotos 
{ 
    char nom[30]; 
    struct fotos *sig; 
}; 
//.... 
struct fotos *lini; 
//.... 

while(lini->sig!=0) 
    { 
    image=cvLoadImage(lini->nom,1); 
    cvNamedWindow("ejemplo", 0); 
    cvMoveWindow("ejemplo", 100, 100); 
    cvShowImage("ejemplo", image); 
    cvWaitKey(0); 
    lini=lini->sig; 
    } 
    image=cvLoadImage(lini->nom,1); 
    cvNamedWindow("ejemplo", 0); 
    cvMoveWindow("ejemplo", 100, 100); 
    cvShowImage("ejemplo", image); 
    cvWaitKey(0); 
    cvReleaseImage(&image); 

但它不會工作。它創建一個新窗口,但沒有加載圖像。

+0

你會需要自行遍歷列表,並簡單地調用cvLoadImage來獲取任何項目。 – Niko

回答

3

我沒有用CvLoadImage()我自己,而是一個快速谷歌搜索顯示,它有一個原型的形式:

IplImage* cvLoadImage(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR); 

功能顯然是爲了拿一個,只有一個文件名。它將文件加載到內存中,並返回一個指向它加載它的位置的指針,或者返回NULL以報錯。

如果你想加載多個文件,你需要重複調​​用函數,每個文件一個。您可能需要考慮的一件事是建立一個指針數組爲char:

void load_images(void) 
{ 
    int i; /* Used for looping */ 

    /* Array of filenames */ 
    char *filenames[4] = { 
     "/path/to/image0.jpg", 
     "/path/to/image1.jpg", 
     "/path/to/image2.jpg", 
     "/path/to/image3.jpg", 
    }; 

    /* Array to store the addresses of the loaded files */ 
    IplImage *file_addresses[4]; 

    for (i = 0; i < 4; i++) { 
     file_addresses[i] = cvLoadImage(filenames[i], CV_LOAD_IMAGE_COLOR);   
    } 

    /* The address of image number N, where N starts at zero 
     is now in file_addresses[N]. Don't forget to check that 
     any given address is not NULL before you use it, in case 
     there was a loading error */ 
} 

您可以輕鬆地替換陣列以鏈表或者其他任何你喜歡的數據結構。您也可以修改函數接收一個指向列表來填充,或者返回一個指向它創造了一個新的列表等

+0

這是我能做的(有些東西用西班牙語,因爲我們說西班牙語,而其他一些東西與文件混合) struct fotos { char nom [30]; struct fotos * sig; }; // ... struct fotos * lini; // ... while(lini-> sig!= 0) { image = cvLoadImage(lini-> nom,1); cvNamedWindow(「ejemplo」,0); cvMoveWindow(「ejemplo」,100,100); cvShowImage(「ejemplo」,圖片); cvWaitKey(0); lini = lini-> sig; } image = cvLoadImage(lini-> nom,1); cvNamedWindow(「ejemplo」,0); cvMoveWindow(「ejemplo」,100,100); cvShowImage(「ejemplo」,圖片); cvWaitKey(0); cvReleaseImage(&image); – Dreamgirl

0

什麼你基本上應該是這樣的形式

class list 
{ 
    element* begin; 
} MyList; 

class element 
{ 
    char name[200]; 
    element* next; 
}; 

// and you can iterate through the list like that: 

    for (element* it = MyList->begin; it != NULL; it = it->next) 
    { 
     IplImage* img = cvLoadImage(it->name); 
     doSomethingElseOn(img); 
    }