Ошибка сегментации с помощью cvCopy внутри таблицы IplImage* (IplImage**)

Я должен сохранить в памяти заранее определенное количество изображений. Я создал такой массив:

int nb_frame_decalage=10;
IplImage** accumulateur_image;
CvCapture* capture;
IplImage* Image_B_Brut;


capture=cvCreateFileCapture("./Data/video2.avi");
if (!capture) {printf("\nOuverture du flux vidéo impossible !\n");key='k';}
image_B_brut = cvQueryFrame(capture);


accumulateur_image=malloc(sizeof(IplImage*)*nb_frame_decalage);
int i;
for (i=0;i<nb_frame_decalage;i++)
{
    accumulateur_image[i]=cvCreateImage(cvGetSize(image_B_brut),
    image_B_brut->depth,
    image_B_brut->nChannels);
}
add_image(&accumulateur_image,image_B_brut,nb_frame_decalage);

После этого я зацикливаюсь на cvCapture, но при первом вызове этой функции выдает ошибку: я хочу добавить элемент в конец этого списка...

void add_image(IplImage*** accumulateur,IplImage* Image_to_add,int taille_accumulateur)
{
    int i;
    for (i=0;i<taille_accumulateur;i++)
    {
        cvCopy((*accumulateur)[i+1],(*accumulateur)[i],NULL);
    }
    cvCopy(Image_to_add,*accumulateur[taille_accumulateur],NULL);
}

Он компилируется, но кажется, что это проблема в функции add_image, потому что ошибка сегментации появляется, когда программа входит в эту функцию.

У кого-то уже есть эта ошибка?

РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТА

Наконец, этот код работает, я изменил функцию index add_image.

int nb_frame_decalage=10;
IplImage** accumulateur_image;
CvCapture* capture;
IplImage* Image_B_Brut;


capture=cvCreateFileCapture("./Data/video2.avi");
if (!capture) {printf("\nOuverture du flux vidéo impossible !\n");key='k';}
image_B_brut = cvQueryFrame(capture);


accumulateur_image=malloc(sizeof(IplImage*)*nb_frame_decalage);
int i;
for (i=0;i<nb_frame_decalage;i++)
{
    accumulateur_image[i]=cvCreateImage(cvGetSize(image_B_brut),
    image_B_brut->depth,
    image_B_brut->nChannels);
}
add_image(&accumulateur_image,image_B_brut,nb_frame_decalage);


void add_image(IplImage*** accumulateur,IplImage* Image_to_add,int taille_accumulateur)
{
    int i;
    for (i=0;i<taille_accumulateur-1;i++)
    {
        cvCopy((*accumulateur)[i+1],(*accumulateur)[i],NULL);
    }
    cvCopy(Image_to_add,(*accumulateur)[taille_accumulateur-1],NULL);
}

Спасибо Алку за его полезный ответ.

1 ответ

Решение

Если вы звоните add_image() как это

add_image(accumulateur_image, ..., nb_frame_decalage);

тогда следующая строка доступа *accumulateur за границами:

  cvCopy((*accumulateur)[i+1], ... /* for i=taille_accumulateur */

Доступ к массиву вне границ вызывает неопределенное поведение, которое во многих случаях приводит к нарушению сегментации, так называемому segfault.


Также это

cvCopy(Image_to_add,*accumulateur[taille_accumulateur],NULL);

должен быть

cvCopy(Image_to_add, (*accumulateur)[taille_accumulateur], NULL);

как [] оператор связывает крепче, чем * оператор. Но даже если исправить, как показано, код может получить доступ *accumulateur вне пределов согласно предположению, сделанному выше.

Другие вопросы по тегам