opencv读取并显示几百张图片,当读取和显示20张时,系统报错:std::bad_a。急求帮助

C++语言 码拜 7年前 (2017-04-15) 1343次浏览
报错:Microsoft C++ 异常: 内存位置 0x0037ed40 处的 std::bad_alloc。急求高手帮忙解决问题。谢谢!
代码大致如下:
IplImage *imgl = cvLoadImage(“E:\2013-09-16testimage\2899.bmp”, 0);
IplImage *imgLl = cvLoadImage(“E:\2013-09-16testimage\2899.bmp”, 3);
IplImage *testImage,*result;
CRsLSM lsm;    //定义一个类
char filename[100];
int t;
for (t=2899;t<=3099;t++)
{
sprintf(filename,”E:\2013-09-16testimage\%d.bmp”,t);
IplImage *imgr = cvLoadImage(filename, 0);
IplImage *imgRr = cvLoadImage(filename,3);
char *filenameL=”E:\2013-09-16testimage\2899.bmp”;
char *filenameR=filename;
int *imgL,*imgR;
imgL=new int [imgl->height*imgl->width];
imgR=new int [imgr->height*imgr->width];
imgL=GetGrayValue(filenameL);
imgR=GetGrayValue(filenameR);  当运行到第20次的时候,就报错了
//}catch(const bad_alloc & e){return -1;}
double **m=ReadPoint(“test.txt”);
//cout<<m[0][1]<<” “<<m[0][1]<<endl;
double xl;
double yl;
for (int i=0;i<8;i++)
{
yl=double(m[i][2]);
xl=double(m[i][1]);
//double xl=1017.5;
//double yl=756.;
double xr=0,yr=0;
CvRect rect1;
rect1.x=xl-10,rect1.y=yl-10,rect1.width=20,rect1.height=20;
//CvSize size=cvSize(20,20);
cvSetImageROI(imgl,rect1);
IplImage *templat=cvCreateImage(cvSize(20,20),imgl->depth,imgl->nChannels);
cvCopy(imgl,templat);
CvRect rect;
rect.x=xl-20,rect.y=yl-20,rect.width=40,rect.height=40;
testImage=cvCreateImage(cvSize(40,40),8,0);
cvSetImageROI(imgr,rect);
cvCopy(imgr,testImage);
int testImageW, testImageH, templatW, templatH, resultH, resultW;
testImageW = testImage->width;
testImageH = testImage->height;
templatW = templat->width;
templatH = templat->height;
if(testImageW < templatW || testImageH < templatH)
{
cout <<“原图像不能比模板小” << endl;
return 0;
}
resultW = testImageW – templatW + 1;
resultH = testImageH – templatH + 1;
result = cvCreateImage(cvSize(resultW, resultH), IPL_DEPTH_32F , 1);
cvMatchTemplate(testImage, templat, result, CV_TM_CCORR_NORMED);
double minValue, maxValue;
CvPoint minLoc, maxLoc;
cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);
xr=maxLoc.x+10+xl-20;
yr=maxLoc.y+10+yl-20;
/*cvLine(imgLl,cvPoint(xl-5,yl),cvPoint(xl+5,yl),CV_RGB(255,0,0),1,CV_AA,0);
cvLine(imgLl,cvPoint(xl,yl-5),cvPoint(xl,yl+5),CV_RGB(255,0,0),1,CV_AA,0);
cvLine(imgRr,cvPoint(xr-5,yr),cvPoint(xr+5,yr),CV_RGB(255,0,0),1,CV_AA,0);
cvLine(imgRr,cvPoint(xr,yr-5),cvPoint(xr,yr+5),CV_RGB(255,0,0),1,CV_AA,0);*/
int MatchWindowsHei=5,MatchWindowsWid=5;
double a1=1,a2=0,b1=0,b2=1;
double *cc;
cc=new double [MatchWindowsHei*MatchWindowsWid];
lsm.LSM( xl,yl,xr,yr,MatchWindowsHei,MatchWindowsWid,a1,a2,b1,b2,*cc);
cvLine(imgLl,cvPoint(xl-5,yl),cvPoint(xl+5,yl),CV_RGB(255,0,0),1,CV_AA,0);
cvLine(imgLl,cvPoint(xl,yl-5),cvPoint(xl,yl+5),CV_RGB(255,0,0),1,CV_AA,0);
cvLine(imgRr,cvPoint(xr-5,yr),cvPoint(xr+5,yr),CV_RGB(255,0,0),1,CV_AA,0);
cvLine(imgRr,cvPoint(xr,yr-5),cvPoint(xr,yr+5),CV_RGB(255,0,0),1,CV_AA,0);

//cvRectangle(testImage, maxLoc, cvPoint(maxLoc.x + templatW, maxLoc.y+ templatH), cvScalar(0,0,255));
}
cvNamedWindow(“Right”,0);
cvShowImage(“Right”,imgRr);
//cvNamedWindow(“srcResult”, 0);
//cvShowImage(“srcResult”, testImage);
cvWaitKey(2000);
delete []imgL;
delete []imgR;
imgL=NULL;
imgR=NULL;
cvDestroyAllWindows();
}
cvNamedWindow(“Left”,0); //创建窗体
cvShowImage(“Left”,imgLl);//显示图片
cvReleaseImage(&testImage);

return 0;

解决方案

5

std::bad_alloc 一般的开辟内存失败。
你的 imgL imgR
imgL=new int [imgl->height*imgl->width];
imgR=new int [imgr->height*imgr->width];
new 出来了有根本没有用,不如去掉。

5

本人觉得应该是你的内存不够或碎片太多。像你这样反复NEW再DELETE很容易产生那样的问题。或数组越界。

10

仅供参考,不一定对:

IplImage *imgl = cvLoadImage("E:\2013-09-16testimage\2899.bmp", 0);
IplImage *imgLl = cvLoadImage("E:\2013-09-16testimage\2899.bmp", 3);
IplImage *testImage,*result;
CRsLSM lsm;    //定义一个类
char filename[100];
int t;
testImage=cvCreateImage(cvSize(40,40),8,0);
IplImage *templat=cvCreateImage(cvSize(20,20),imgl->depth,imgl->nChannels);
double *cc;
cc=new double [MatchWindowsHei*MatchWindowsWid];
for (t=2899;t<=3099;t++) {
    sprintf(filename,"E:\2013-09-16testimage\%d.bmp",t);
    IplImage *imgr = cvLoadImage(filename, 0);
    IplImage *imgRr = cvLoadImage(filename,3);
    char *filenameL="E:\2013-09-16testimage\2899.bmp";
    char *filenameR=filename;
    int *imgL,*imgR;
    imgL=new int [imgl->height*imgl->width];
    imgR=new int [imgr->height*imgr->width];
    imgL=GetGrayValue(filenameL);
    imgR=GetGrayValue(filenameR);  //当运行到第20次的时候,就报错bad_alloc
    double **m=ReadPoint("test.txt");
    //cout<<m[0][1]<<" "<<m[0][1]<<endl;
    double xl;
    double yl;
    for (int i=0;i<8;i++) {
        yl=double(m[i][2]);
        xl=double(m[i][1]);
        //double xl=1017.5;
        //double yl=756.;
        double xr=0,yr=0;
        CvRect rect1;
        rect1.x=xl-10,rect1.y=yl-10,rect1.width=20,rect1.height=20;
        //CvSize size=cvSize(20,20);
        cvSetImageROI(imgl,rect1);
        cvCopy(imgl,templat);
        CvRect rect;
        rect.x=xl-20,rect.y=yl-20,rect.width=40,rect.height=40;
        cvSetImageROI(imgr,rect);
        cvCopy(imgr,testImage);
        cvReleaseImage(&imgr);
        int testImageW, testImageH, templatW, templatH, resultH, resultW;
        testImageW = testImage->width;
        testImageH = testImage->height;
        templatW = templat->width;
        templatH = templat->height;
        if(testImageW < templatW || testImageH < templatH) {
            cout <<"原图像不能比模板小" << endl;
            return 0;
        }
        resultW = testImageW - templatW + 1;
        resultH = testImageH - templatH + 1;
        result = cvCreateImage(cvSize(resultW, resultH), IPL_DEPTH_32F , 1);
        cvMatchTemplate(testImage, templat, result, CV_TM_CCORR_NORMED);
        double minValue, maxValue;
        CvPoint minLoc, maxLoc;
        cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);
        cvReleaseImage(&result);
        xr=maxLoc.x+10+xl-20;
        yr=maxLoc.y+10+yl-20;
        /*cvLine(imgLl,cvPoint(xl-5,yl),cvPoint(xl+5,yl),CV_RGB(255,0,0),1,CV_AA,0);
        cvLine(imgLl,cvPoint(xl,yl-5),cvPoint(xl,yl+5),CV_RGB(255,0,0),1,CV_AA,0);
        cvLine(imgRr,cvPoint(xr-5,yr),cvPoint(xr+5,yr),CV_RGB(255,0,0),1,CV_AA,0);
        cvLine(imgRr,cvPoint(xr,yr-5),cvPoint(xr,yr+5),CV_RGB(255,0,0),1,CV_AA,0);*/
        int MatchWindowsHei=5,MatchWindowsWid=5;
        double a1=1,a2=0,b1=0,b2=1;
        lsm.LSM( xl,yl,xr,yr,MatchWindowsHei,MatchWindowsWid,a1,a2,b1,b2,*cc);
        cvLine(imgLl,cvPoint(xl-5,yl),cvPoint(xl+5,yl),CV_RGB(255,0,0),1,CV_AA,0);
        cvLine(imgLl,cvPoint(xl,yl-5),cvPoint(xl,yl+5),CV_RGB(255,0,0),1,CV_AA,0);
        cvLine(imgRr,cvPoint(xr-5,yr),cvPoint(xr+5,yr),CV_RGB(255,0,0),1,CV_AA,0);
        cvLine(imgRr,cvPoint(xr,yr-5),cvPoint(xr,yr+5),CV_RGB(255,0,0),1,CV_AA,0);
        //cvRectangle(testImage, maxLoc, cvPoint(maxLoc.x + templatW, maxLoc.y+ templatH), cvScalar(0,0,255));
    }
    cvNamedWindow("Right",0);
    cvShowImage("Right",imgRr);
    //cvNamedWindow("srcResult", 0);
    //cvShowImage("srcResult", testImage);
    cvWaitKey(2000);
    delete []imgL;
    delete []imgR;
    imgL=NULL;
    imgR=NULL;
    cvDestroyAllWindows();
    cvReleaseImage(imgRr);
}
cvNamedWindow("Left",0); //创建窗体
cvShowImage("Left",imgLl);//显示图片
cvReleaseImage(&testImage);
return 0;

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明opencv读取并显示几百张图片,当读取和显示20张时,系统报错:std::bad_a。急求帮助
喜欢 (0)
[1034331897@qq.com]
分享 (0)