c - CvLoadImage 函数和列表



我正在使用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);

但它也行不通。它会创建一个新窗口,但不加载任何图像。

我自己没有使用过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 */
}

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

你基本上拥有的应该是这样的形式

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);
    }

相关内容

  • 没有找到相关文章