栈溢出出问题。0xC00000FD:Stack Overflow
当我开始调试时,总是出现一个框显示:Unhandled exception in YUV.exe:0xC00000FD:Stack Overflow
好像是指针问题,内存释放的问题,可是不清楚怎么改啊???这个是VC6和opencv库函数一起编译的。
#include <iostream>
#include <stdlib.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
using namespace std;
//void saturate_sv( IplImage* img);
int main(int argc, char** argv[]){
int key=0;
char* filename="D:/002.avi";
CvCapture* capture = cvCreateFileCapture(filename);
if(capture==NULL) {
cout<<"NO capture"<<endl;
char a=getchar();
return 1;
};
IplImage* frame;
cvNamedWindow("PlayAVI", CV_WINDOW_AUTOSIZE);
while(1) {
frame = cvQueryFrame( capture );
if(!frame) break;
int i=0,b=0,r=0,sum1=0, sum2=0,avg1=0,avg2=0;从这行起就出问题了,以下各行设断点都是这个问题的
int Y,Cb,Cr, yy[640*480],cb1[640*480],cr1[640*480],cb2[76800],cr2[76800];
for(int y=0; y<frame->height ;y++){
uchar*ptr=(uchar*)(frame->imageData+y*frame->widthStep);
for (int x=0;x<frame->width;x++ ){
Y=(int)(0.299*ptr[3*x+2]+0.587*ptr[3*x+1]+0.144*ptr[3*x]); //ptr[3*x+2]得到Y分量每个像素点采集一个Y分量
Cb=(int)(0.564*(ptr[3*x]-Y)+128);
Cr=(int)(0.713*(ptr[3*x+2]-Y)+128);
yy[i]=Y; cb1[b]=Cb; cr1[r]=Cr;
i++; r++; b++; //ptr[3*x+2] 是R红色通道,ptr[3*x+1]是G绿色通道,ptr[3*x]是B蓝色通道。
}
}
for (int k=0; k<76800; k++){ //k的取值范围是0~76800
for (int l=4*k; l<=4*k+3; l++){ //l的取值范围是0~640*480=307200
sum1+=cb1[b]; sum2+=cr1[r];
}
avg1=(int)sum1/4; avg2=(int)sum2/4;
cb2[k]=avg1; cr2[k]=avg2;
sum1=0; sum2=0;
}
FILE *file;
file=fopen("d:\\file.yuv","ab");
fwrite (yy,4,640*480,file);
fwrite (cb2,4,76800,file);
fwrite (cr2,4,76800,file);
fclose (file);
cvShowImage("PlayAVI", frame );
key = cvWaitKey(33);// quit when users press 'ESC'
if( key == 27 ) break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("PlayAVI");
return 0;
}
[解决办法]
[解决办法]
lz可以尝试以下几种方法:
1、二分法。尝试注释掉一半的代码,运行一下看看是否有问题。重复直到找到错误所在行。
2、下标检查。在每次使用下标操作符[]之前,用assert仔细检查下标是否超出范围。
3、用一款Memory debugger。Windows下推荐BoundsChecker。
[解决办法]
int Y,Cb,Cr, yy[640*480],cb1[640*480],cr1[640*480],cb2[76800],cr2[76800]; //这些占内存太大了。
int *yy=new int[640*480];
[解决办法]
既然是用C++,优先考虑vector<int>。
[解决办法]