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私は0を与えるi<6のでループで使用しています。sizeof(images)/sizeof(images[0])

どうもありがとう!

4

2 に答える 2

1

これは、私が想定している C++ コンパイルです。関数呼び出しは const ポインターを返していますが、配列は const ポインターのリストではありません。

于 2013-07-03T21:08:00.617 に答える
0

IplImage*問題は、返された fromcvLoadImage()IplImage逆参照された fromに割り当てようとしていることですimages[i]。2 つのタイプの間で変換することはできません。

これを簡単に修正するには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 に答える