0

我正在使用 CvLoadImage(在 C 编程语言中)。

我可以使用包含我要打开的每个图像的每个路径的列表(动态结构),而不是传递我的路径或名称,比方说,.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);

但这也行不通。它创建一个新窗口,但没有加载图像。

4

2 回答 2

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 */
}

您可以轻松地将数组替换为链表或您喜欢的任何其他数据结构。您还可以修改函数以接收指向要填充的列表的指针,或返回指向它创建的新列表的指针等。

于 2013-01-24T16:12:30.580 回答
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);
    }
于 2013-01-24T17:51:26.117 回答