mike1199 2015-04-13 13:57 采纳率: 0%
浏览 2431

opencv debug可以 release报错

opencv配置正确。debug没有问题。release下提示在倒数5,6行使用了未初始化的b1,b2(是注释掉的两行,b1,b2在main函数下第三行声明),代码生成失败。想问问是什么原因。我把这两行注释掉了,程序可以运行,但是不delete好么,会不会有什么弊端。以下是代码。

#include<cv.h>
#include<highgui.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<cxcore.h>
//#define N 500
#define E 3.3554//本文用基于T分布的变化监测
int main()
{   int i,j,k,dif[3][9],n=1,m,c[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}},e[8]={1,0,1,0,1,0,1,0};
    char *a1,*a2,*a3,**b1,**b2,**b3;
    float s[3],f[3],t[3],sum[240][960];
    IplImage*fram,*pimg1,*pimg2,*pimg3;
    //读视频
    printf("稍微等一会儿\n");
    CvCapture *capture;

    capture=cvCreateFileCapture("C:\\Users\\luxu\\Documents\\Visual Studio 2013\\Projects\\Project4\\Debug\\video1.avi");//为了方便将测试视频重命名为test.avi
    fram=cvQueryFrame(capture);
    cvSaveImage("test1.bmp",fram);
    pimg1=cvLoadImage("test1.bmp",1);
    //创建一个同规格的图像用来存储背景图像
    CvSize size=cvSize(pimg1->width,pimg1->height);
    pimg3=cvCreateImage(size,pimg1->depth,3);
    a3=pimg3->imageData;
    b3=new char*[pimg3->height];
    for(i=0;i<pimg3->height;i++)
        b3[i]=&a3[i*pimg3->widthStep];

    int **count;
    count=new int*[240];
    for(i=0;i<240;i++)
        count[i]=new int[320];
    //初始化
    //printf("1");
    for(i=0;i<240;i++)
        for(j=0;j<320;j++)
            count[i][j]=0;
        //printf("1\n");
    for(i=0;i<240;i++)
        for(j=0;j<960;j++)
            sum[i][j]=0;
        //printf("1\n");
    while(n<200)//取前100帧图像用于重建背景
    {//一维数组变二维
        b1=new char*[pimg1->height];
        a1=pimg1->imageData;
        for(i=0;i<pimg1->height;i++)
            b1[i]=&a1[i*pimg1->widthStep];

        fram=cvQueryFrame(capture);
        if(!fram)
            break;
        cvSaveImage("test2.bmp",fram);
        pimg2=cvLoadImage("test2.bmp",1);

        b2=new char*[pimg2->height];
        a2=pimg2->imageData;
        for(i=0;i<pimg2->height;i++)
            b2[i]=&a2[i*pimg2->widthStep];
        for(i=0;i<3;i++)
        {
            s[i]=0;
            f[i]=0;
        }
        //printf("正常1\n");
    for(i=1;i<pimg1->height-1;i++)
    {
        for(j=1;j<pimg1->width-1;j++)
        {   for(k=0;k<8;k++)
            {   //选取领域的窗口为3*3对每一个像素点进行T分布变换监测
                dif[0][k]=unsigned char(b2[i+c[k][0]][3*(j+c[k][1])])-unsigned char(b1[i+c[k][0]][3*(j+c[k][1])]);
                dif[1][k]=unsigned char(b2[i+c[k][0]][3*(j+c[k][1])+1])-unsigned char(b1[i+c[k][0]][3*(j+c[k][1])+1]);
                dif[2][k]=unsigned char(b2[i+c[k][0]][3*(j+c[k][1])+2])-unsigned char(b1[i+c[k][0]][3*(j+c[k][1])+2]);

                f[0]+=dif[0][k];
                f[1]+=dif[1][k];
                f[2]+=dif[2][k];
            }
            dif[0][8]=unsigned char(b2[i][3*j])-unsigned char(b1[i][3*j]);
            dif[1][8]=unsigned char(b2[i][3*j+1])-unsigned char(b1[i][3*j+1]);
            dif[2][8]=unsigned char(b2[i][3*j+2])-unsigned char(b1[i][3*j+2]);
            f[0]+=dif[0][8];
            f[1]+=dif[1][8];
            f[2]+=dif[2][8];
            f[0]/=9;
            f[1]/=9;
            f[2]/=9;
            for(k=0;k<9;k++)
            {
                s[0]+=(dif[0][k]-f[0])*(dif[0][k]-f[0]);
                s[1]+=(dif[1][k]-f[1])*(dif[1][k]-f[1]);
                s[2]+=(dif[2][k]-f[2])*(dif[2][k]-f[2]);
            }
            s[0]/=8;
            s[1]/=8;
            s[2]/=8;
            s[0]=sqrt(s[0]);s[1]=sqrt(s[1]);s[2]=sqrt(s[2]);
            //计算t
            t[0]=(3*f[0]/s[0]);
            t[1]=(3*f[1]/s[1]);
            t[2]=(3*f[2]/s[2]);
            if(fabs(t[0])<E&&fabs(t[1])<E&&fabs(t[2])<E)//这里的E是当α=0.001自由度为8时差T分布表所得的置信区间
            {
                sum[i][3*j]+=(unsigned char)b2[i][3*j];
                sum[i][3*j+1]+=(unsigned char)b2[i][3*j+1];
                sum[i][3*j+2]+=(unsigned char)b2[i][3*j+2];
                count[i][j]+=1;
            }
        }
    }
cvReleaseImage(&pimg1);
pimg1=cvLoadImage("test2.bmp",1);
cvReleaseImage(&pimg2);
n++;
//printf("%d\n",n);
    }
    //printf("%d\n",b1[8][22]);
    for(i=1;i<pimg1->height-1;i++)
    {
        for(j=1;j<pimg1->width-1;j++)
        {   m=count[i][j]; 
    //printf("%d %d\n",m,j);
            //m=100;
        //计算背景图像的像素值
            if(m!=0)
                {   b3[i][3*j]=sum[i][3*j]/m;
                    b3[i][3*j+1]=sum[i][3*j+1]/m;
                    b3[i][3*j+2]=sum[i][3*j+2]/m;
                    //if(i==2)
                        //printf("%f %f %f\n",sum[i][3*j],sum[i][3*j+1],sum[i][3*j+2]);
                        //printf("%d %d %d %d\n",b3[i][3*j],b3[i][3*j+1],b3[i][3*j+2],j);
                }

        }
        //printf("%d\n",i);
    }
cvSaveImage("backgroud1.bmp",pimg3);
//cvSaveImage("test1.bmp",pimg1);
cvReleaseImage(&pimg1);
cvReleaseImage(&pimg3);
//delete []b1;
//delete []b2;
for(i=0;i<240;i++)
delete []count[i];
delete []count;
return 0;
}
  • 写回答

2条回答 默认 最新

  • oyljerry 2015-04-13 14:13
    关注

    你b1,b2是二级指针,需要从最里面一层层释放

    评论

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)