CvLoadImage函数和列表

时间:2013-01-24 15:45:18

标签: c list opencv path

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

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

2 个答案:

答案 0 :(得分: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 */
}

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

答案 1 :(得分: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);
    }