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