2013-07-03 5 views
0

일부 이미지를 저장하기 위해 IplImage 유형의 동적 배열을 사용하고 있습니다. (필자는 cvHistogram과 동일한 작업을하고 싶지만 같은 오류가 발생합니다.) 필요한 곳 히스토그램 데이터를 추출합니다. 불행히도 나는 오류를 얻고 그것을 해결하는 방법을 알지 못한다. 다른 방법으로 도움이나 제안을 해주시면 감사하겠습니다. IplImage의 동적 배열 - 'operator ='오류와 일치하지 않음

코드의 일부입니다

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&) 

P.S.를 얻을 수 있다는 오류입니다 sizeof(images)/sizeof(images[0])이 나를 제공하기 때문에 루프에 i<6을 사용하고 있습니다.

많은 감사!

+0

cvLoadImage가 반환하는 문자 유형은 무엇입니까? – ojblass

+0

C에서 operator = valid를 유효하게하는 어떤 것도 모른다. 이것을 C로 표시 하시겠습니까? – xaxxon

답변

0

cvLoadImage()에서 반환 된 IplImage*images[i]에서 역 참조 된 IplImage에 할당하려고하면 문제가 발생합니다. 두 유형 간에는 변환 할 수 없습니다.

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

이 작동 할 수 있지만, 그것은 나에게 조금 정통 보인다

이에 대한 빠른 수정 포인터가과 같이, cvLoadImage()에서 반환 된 역 참조 될 수있다. 어떤 이유로 당신이 동적으로 할당해야하는 경우

#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 직접 할당하는 대신 스택에 IplImage*의 배열을 유지하지하는 것 . 예제의 첫 번째 줄을

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

으로 바꾼 다음 끝에 free(images);을 삽입하십시오.

가능한 한 C++ API에 switching을 고려하십시오. 너는 너무 많은 고통을 스스로 구할 것이다.

+0

답변 해 주셔서 감사합니다. 처음에 나는이 방법으로 갔고이 기능에서 돌아 오는 데 몇 가지 어려움을 겪었다. 그런 다음 친구에게 도움을 청했고 그는 동적 할당으로 전환하라고 조언했습니다. 내가 이것을 사용할 것이고 불행하게도 나는 C++ API로 바꿀 수 없다;) 다시 한번 감사드립니다! – Moirae

+0

또 다른 질문은 지금이 방법을 사용하여 IplImage 배열을 반환하는 방법일까요? – Moirae

+0

[이 질문] (http://stackoverflow.com/q/1453410/1601291)을보십시오. 이미지를 반환해야한다면'IplImage ** '방식을 사용할 것입니다. – Aurelius

1

이것은 내가 생각하는 C++ 컴파일입니다. 함수 호출은 const 포인터를 반환하고 배열은 const 포인터 목록이 아닙니다.

+0

또한 답변의 역사를 살펴보십시오. – ojblass