在IplImage *表中使用cvCopy进行分段错误(IplImage **)

时间:2014-01-27 19:05:02

标签: c opencv 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上循环,但它在第一次调用此函数时出错: 我想将Element添加到此列表的末尾...

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函数中的问题,因为当程序进入此函数时会出现分段错误。

有人已经犯了这个错误吗?

在回答后编辑

最后,这段代码有效,我修改了索引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);
}

感谢alk提供的有用答案。

1 个答案:

答案 0 :(得分: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