VC6.0下运行说内存出错,不能written,求高手指点迷津
我在已有的程序上加了几行代码,实现图像的面积计算。
实现的目标:点击软件中菜单下的“面积”项,出现个对话框,对话框显示为所求的面积。
实现的方法:先对图像进行外轮廓跟踪,同时把各边缘像素点坐标记录在trackDot[]中,再利用线段表求边缘围成的面积。
出现的问题:编译通过,运行程序,对话框没有数字,关闭对话框时,出现个报错窗口:“0x0042d27a”指令引用的“0x01330000”内存。该内存不能为"written"。
程序贴出来如下所示:求高手指点,
void CAACSView::OnRecArea()
{
CAreaDlg dlg;
dlg.DoModal();
// 获得文档类指针
CAACSDoc* pDoc = GetDocument();
// 输入对象
CImgProcess imgInput = pDoc->m_Image;
// 检查图像是灰度图像
if (imgInput.m_pBMIH->biBitCount!=8)
{
AfxMessageBox("不是8-bpp灰度图像,无法处理!");
return;
}
// 输出的临时对象
CImgProcess imgOutput = imgInput;
int area=imgInput.SingleArea(&imgOutput); //调用线段表计算面积的函数
char stringarea[20]; //与对话框窗口显示面积的edit对应的字符串
itoa(area,stringarea,10); //将数字转成字符串
GetDlgItem(IDC_EDIT_AREA)->SetWindowText(stringarea); //在串口显示面积字符
/* // 将结果返回给文档类
pDoc->m_Image = imgOutput;
pDoc->SetModifiedFlag(true);
pDoc->UpdateAllViews(NULL);
EndWaitCursor();*/
}
int CImgProcess::SingleArea(CImgProcess *pTo)
{
//pTo->InitPixels(255);//清空目标图像
int nHeight = GetHeight();
int nWidth = GetWidthPixel();
//循环变量
int i;
int j;
int k=0;
int* trackDot=0;
trackDot=new int[nHeight*nWidth]; //线段表初始化
//起始边界点与当前边界点
POINT ptStart;
POINT ptCur;
//搜索方向数组,{左下,下,右下,右,右上,上,左上,左}
int Direction[8][2]={ {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1}, {-1,-1}, {-1,0} };
int nCurDirect = 0; //当前探查方向
int xPos;
int yPos;
BOOL bAtStartPt; //为true表示探查刚刚时开始,为了区别ptCur == ptStart的两种情况(一种开始,一种结束)
//算法不处理边界上的点,将图像的四周的一圈边界置白
for(i=0; i<nHeight; i++)
{
SetPixel(0, i, RGB(255, 255, 255));
SetPixel(nWidth-1, i, RGB(255, 255, 255));
}
for(j=0; j<nWidth; j++)
{
SetPixel(j, 0, RGB(255, 255, 255));
SetPixel(j, nHeight-1, RGB(255, 255, 255));
}
//逐行扫描
for(i=0; i<nHeight; i++)
{
for(j=0; j<nWidth; j++)
{
if(GetGray(j, i) == 0)//找到最左上的第一个边界点
{
ptStart.x = j;
ptStart.y = i;
trackDot[k*4+1]=ptStart.y;
trackDot[k*4+2]=ptStart.x;
ptCur = ptStart;
bAtStartPt = true;
while( ( (ptCur.x != ptStart.x) || (ptCur.y != ptStart.y) ) || bAtStartPt )
{
bAtStartPt = false;
//下一个探查位置
xPos = ptCur.x + Direction[nCurDirect][0];
yPos = ptCur.y + Direction[nCurDirect][1];
int nSearchTimes = 1;
while( GetGray(xPos, yPos) == 255 )
{
nCurDirect ++; //逆时针旋转45度
if(nCurDirect >= 8)
nCurDirect -= 8;
xPos = ptCur.x + Direction[nCurDirect][0];
yPos = ptCur.y + Direction[nCurDirect][1];
if( ++nSearchTimes >= 8 ) //8邻域中都没有边界点,说明是孤立点
{
xPos = ptCur.x;
yPos = ptCur.y;
break;
}
}
//找到下一个边界点
ptCur.x = xPos;
ptCur.y = yPos;
//pTo->SetPixel(ptCur.x, ptCur.y, RGB(0, 0, 0)); //在新图像上标记边界
/************
在此处添加适当的代码,如果需要依次记录下边界点ptCur
************/
trackDot[k*4+3]=ptCur.y;
trackDot[k*4+4]=ptCur.x;
++k;
nCurDirect -= 2; //将当前探查方向顺时针回转90度作为下一次的探查初始方向
if(nCurDirect < 0)
nCurDirect += 8;
}
//return;
}// if
/************
在此处添加适当的代码,并去掉上面的return语句,如果需要跟踪图像中所有物体的边界。
************/
}// for j
}// for i
trackDot[0]=k;
//trackDot[k*4+5]=0;
//获取线段表长度
int x0,x1;
int totalarea=0; //初始化面积累加器
for(i=0;i<k;i++) //将构成区域的所有线段长度相加
{
x0=trackDot[i*4+2];
x1=trackDot[i*4+4];
totalarea+=(x1-x0+1);
}
delete [] trackDot;
trackDot=0;
return totalarea;
}