0

我正在使用 IplImage 类型的动态数组来存储一些图像(我想对 cvHistogram 做同样的事情但得到相同的错误),我需要从中提取直方图数据。不幸的是,我遇到了错误并且不知道如何解决它。任何以另一种方式执行此操作的帮助和建议将不胜感激。

这是代码的一部分:

void getColorHistogram( void ){

    IplImage *images = (IplImage *)malloc( sizeof(IplImage) * 6 );

    if ( images == NULL )
    {
        printf("Memory error. EXITING...\n");
        exit( -1 );
    }

    for (int i = 0; i < 6 ; i++ ){

        char *num = (char *)malloc( sizeof(int) );
        char *extension = (char *)".jpg";
        sprintf( num, "%d", i );

        int nameLen = strlen( num ) + strlen( extension ) + 1;

        char *imgName = (char *)malloc( nameLen );
        strlcpy( imgName, num, nameLen );
        strlcat( imgName, extension, nameLen );

        images[i] = cvLoadImage( imgName, CV_LOAD_IMAGE_UNCHANGED );
    }

    free( images );

}

这是我得到的错误

    error: no match for ‘operator=’ in ‘images[i] = cvLoadImage
(((const char*)imgName), -0x00000000000000001)’
    /opt/local/include/opencv2/core/types_c.h:463: note: 
candidates are: _IplImage& _IplImage::operator=(const _IplImage&)

PS我i<6在循环中使用,因为sizeof(images)/sizeof(images[0])给了我0。

非常感谢!

4

2 回答 2

1

This is a C++ compile I assume. The function call is returning a const pointer and your array isnt a list of const pointers.

于 2013-07-03T21:08:00.617 回答
0

问题是您试图将IplImage*返回的 from分配cvLoadImage()IplImage取消引用的 from images[i]。您无法在这两种类型之间进行转换。

对此的快速修复可能是取消引用从返回的指针cvLoadImage(),如下所示:

images[i] = *cvLoadImage( imgName, CV_LOAD_IMAGE_UNCHANGED );

这可能有效,但对我来说似乎有点不正统。

更好的解决方案是不动态分配IplImage自己,而是IplImage*在堆栈上保留一个数组:

#define NUM_IMAGES 6;
IplImage *images[NUM_IMAGES];

for (int i = 0; i < NUM_IMAGES ; i++ ){

    char *num = (char *)malloc( sizeof(int) );
    char *extension = ".jpg";
    sprintf( num, "%d", i );

    int nameLen = strlen( num ) + strlen( extension ) + 1;

    char *imgName = (char *)malloc( nameLen );
    strlcpy( imgName, num, nameLen );
    strlcat( imgName, extension, nameLen );

    images[i] = cvLoadImage( imgName, CV_LOAD_IMAGE_UNCHANGED );
}

/* Release the image memory */
for (size_t i = 0; i < NUM_IMAGES; ++i)
{
    cvReleaseImage(&images[i]);
}

如果由于某种原因你必须动态分配,那么用指针来代替。将我的示例的第一行替换为:

IplImage** images = (IplImage**)malloc(sizeof(IplImage*) * 6);

然后free(images);在最后放置 a 。

附带说明一下,如果可能,请考虑切换到 C++ API。你会为自己省去很多痛苦。

于 2013-07-03T23:37:23.057 回答