opencv debug可以 release报错

问题描述

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("1n");
    for(i=0;i<240;i++)
        for(j=0;j<960;j++)
            sum[i][j]=0;
        //printf("1n");
    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("正常1n");
    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("%dn",n);
    }
    //printf("%dn",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 %dn",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 %fn",sum[i][3*j],sum[i][3*j+1],sum[i][3*j+2]);
                        //printf("%d %d %d %dn",b3[i][3*j],b3[i][3*j+1],b3[i][3*j+2],j);
                }

        }
        //printf("%dn",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;
}

解决方案

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

解决方案二:

看看你程序写的有问题没,完后看看的库的加载是否正确

时间: 2024-10-02 18:57:24

opencv debug可以 release报错的相关文章

vs2012配置opencv后,函数报错,求大神解释

问题描述 vs2012配置opencv后,函数报错,求大神解释 我在配置好opencv2.4.10之后,找了个程序测试一下,但是程序中所有的opencv库中的函数都报错,说是为定义的标示符,但是opencv的库函数我已经链接输入了.搞了好久,求大神解答额 解决方案 opencv的lib库是否也用vs2012编译的,其次,link的时候路径等是否设置争取

tomcat日志调到debug,不报错但一直循环

问题描述 tomcat日志调到debug,不报错但一直循环 springmvc + spring + mybatis tomcat日志调到debug,不报错但一直循环,如下:. Creating shared instance of singleton bean 'trendsOperatorMapper' Creating instance of bean 'trendsOperatorMapper' Eagerly caching bean 'trendsOperatorMapper' to

【Debug 报异常】Debug打断点报错

用DEBUG启动项目,项目中打断点的,然后会报异常   解决方法: 第一步: 项目-->Java编译器-->Classfile Generation 复选框 全部勾选   第二步:   替换当前文件运行的JRE为sun提供的,不能是Eclipse自带的JRE    Window--->preferences---->java---->Installed JREs--->非EC的JRE  

directx-DirectX10程序Debug模式下运行报错,Release模式运行正常一般是什么原因?

问题描述 DirectX10程序Debug模式下运行报错,Release模式运行正常一般是什么原因? 1.两种模式下,编译都没问题.2.运行Debug模式下报错,信息如下:Release模式下运行截图 附:进行了多次试验,Release总是运行正常,而Debug模式基本上都是运行出错,报错信息也是同一个(如上图),但偶尔的小概率能运行(大概百分之一二,这个概率是不确定的,只是我碰巧有一两次正常运行了)遍查了代码,发现不了问题.希望各位能够说说一般情况下可能是什么原因引起的. 解决方案 0xFFF

flash-C# winfrom项目,在debug和release模式下运行都正常,发布后却报错

问题描述 C# winfrom项目,在debug和release模式下运行都正常,发布后却报错 我写了一个C#与Flash通讯的小功能,调用了系统的Flash插件,项目在debug和release模式下都没有报错,唯独在发布打包后运行时报错:对 COM 组件的调用返回了错误 HRESULT E_FAIL 求大神提示问题和解决办法,在线等!急急急! 解决方案 没有做好发布打包 解决方案二: 很明显,发布的时候少了组件,把组件带上

想问问我建立了一个webservice应用程序客户端,直接在程序里运行调用方法是对的,但进debug或release直接运行后就报错,这是为什么啊?

问题描述 想问问我建立了一个webservice应用程序客户端,直接在程序里运行调用方法是对的,但进debug或release直接运行后就报错,这是为什么啊?感觉就是不用程序直接运行的话,其他方法运行就报错误.里面什么其他的都没做,就是直接加了web引用,然后调了一个方法而已.谁能解答一下? 解决方案 解决方案二:up

但在release版本下报错&amp;quot;

问题描述 VS2010下,一个解决方案,在Debug版本下可以,但在release版本下报错 VS2010下,一个解决方案(共7个项目),在Debug版本下可以编译通过,但在release版本下报错 解决方案 解决VS+opencv中Debug版本与Release版本lib切换的问题为什么我的程序debug版本运行没有问题,而release版本总是报错?为什么我的程序debug版本运行没有问题,而release版本总是报错? (curefull)

vs2013-VS2013下opencv环境配置,调试时一直报错,

问题描述 VS2013下opencv环境配置,调试时一直报错, 我把图片放到cpp格式的文件夹下,按F5,一直报错,就是下面几张图,求各位大神指点迷津 解决方案 图片路径是不是有问题,debug一下,有指针的地方记得判断是否为空,并打印日志 解决方案二: 你这个是指针异常了,你的代码读取图片等有问题,没有正确初始化

图像处理-opencv 操作像素报错 cv::Exception

问题描述 opencv 操作像素报错 cv::Exception 我在网上看到了很多种方法去操作图中的像素,但是无论用哪个都出现这样的错误: 0x7611b727 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0039fa94 处的 cv::Exception. 编译是正确的. 我的代码: #include #include #include #include #include int main(int argc, char** argv) { //int i = 0;