Ошибка сегментации с помощью 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
вне пределов согласно предположению, сделанному выше.