我正在使用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);
但它也不起作用。它会创建一个新窗口,但不会加载任何图像。
答案 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);
}