首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用cvCopy分割IplImage*表中的故障(IplImage**)

用cvCopy分割IplImage*表中的故障(IplImage**)
EN

Stack Overflow用户
提问于 2014-01-27 19:05:01
回答 1查看 295关注 0票数 0

我必须将预定义的图像保存在记忆中。我已经创建了这样一个数组:

代码语言:javascript
复制
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上循环之后,但是它在这个函数的第一个调用中出现了一个错误:我想在这个列表的末尾添加元素.

代码语言:javascript
复制
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函数。

代码语言:javascript
复制
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);
}

感谢阿尔克对我的回答。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-27 19:23:39

假设你这样调用add_image()

代码语言:javascript
复制
add_image(accumulateur_image, ..., nb_frame_decalage);

然后,下面的行将*accumulateur超出界限:

代码语言:javascript
复制
  cvCopy((*accumulateur)[i+1], ... /* for i=taille_accumulateur */

访问超出界限的数组会引发未定义的行为,这在许多情况下会导致分段违规(也称为分段错误)。

也是这个

代码语言:javascript
复制
cvCopy(Image_to_add,*accumulateur[taille_accumulateur],NULL);

应该是

代码语言:javascript
复制
cvCopy(Image_to_add, (*accumulateur)[taille_accumulateur], NULL);

由于[]运算符比*运算符绑定得更紧。但是,即使如图所示的修复了,代码也可能在上述假设下访问超出界限的*accumulateur

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21389437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档