VC6.0下运行说内存出错,不能written,求高手指点迷津

dongchunbo 2012-02-18 04:17:14
我在已有的程序上加了几行代码,实现图像的面积计算。
实现的目标:点击软件中菜单下的“面积”项,出现个对话框,对话框显示为所求的面积。
实现的方法:先对图像进行外轮廓跟踪,同时把各边缘像素点坐标记录在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;
}

...全文
290 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongchunbo 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heksn 的回复:]
调试运行 出错后看Call Stack便知程序报错的地方
[/Quote]用Call Stack了,停留在堆栈那了,好像是堆栈,就是有很多整齐的东东,那是哪里的问题呢?
playStudy 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heksn 的回复:]

调试运行 出错后看Call Stack便知程序报错的地方
[/Quote]
顶你
schlafenhamster 2012-02-18
  • 打赏
  • 举报
回复
dlg.DoModal();//返回IDOK、时再接着做:
if(IDOK==dlg.DoModal())
{//

}
  • 打赏
  • 举报
回复
调试运行 出错后看Call Stack便知程序报错的地方
dongchunbo 2012-02-18
  • 打赏
  • 举报
回复
1楼是我的补充,我初步推测是数组或者指针出问题了,但是我又找不出来,麻烦大家帮看看。
shn521 2012-02-18
  • 打赏
  • 举报
回复
单步调试,定位出错的地方,发代码。弄一堆怎么看?
dongchunbo 2012-02-18
  • 打赏
  • 举报
回复
这个程序里我只写了以下几行:

void CAACSView::OnRecArea()
{
// TODO: Add your command handler code here

//计算边界提取后车体面积

// 获得文档类指针
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 k=0;
int* trackDot=0;
trackDot=new int[nHeight*nWidth]; //线段表初始化

trackDot[k*4+1]=ptStart.y;
trackDot[k*4+2]=ptStart.x;

trackDot[k*4+3]=ptCur.y;
trackDot[k*4+4]=ptCur.x;
++k;

trackDot[0]=k;

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;
VC6下安装与配置 Wikipedia,自由的百科全书 本手册适应 OpenCV 1.0 安装。 目录 [隐藏] 1 安装Visual C++ 6.0 2 安装OpenCV 3 配置Windows环境变量 4 配置Visual C++ 6.0 4.1 全局设置 4.2 项目设置 [编辑]安装Visual C++ 6.0 略。 [编辑]安装OpenCV 从http://www.opencv.org.cn/ 下载OpenCV安装程序。假如要将OpenCV安装到C:\\Program Files\\OpenCV。(下面附图为OpenCV 1.0rc1的安装界面,OpenCV 1.0安装界面与此基本一致。)在安装时选择\"将\\OpenCV\\bin加入系统变量\"(Add\\OpenCV\\bin to the systerm PATH)。 [编辑]配置Windows环境变量 检查C:\\Program Files\\OpenCV\\bin是否已经被加入到环境变量PATH,如果没有,请加入。 [编辑]配置Visual C++ 6.0 [编辑]全局设置 菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径: C:\\Program Files\\OpenCV\\lib 然后选择include files,在下方填入路径: C:\\Program Files\\OpenCV\\cxcore\\include C:\\Program Files\\OpenCV\\cv\\include C:\\Program Files\\OpenCV\\cvaux\\include C:\\Program Files\\OpenCV\\ml\\include C:\\Program Files\\OpenCV\\otherlibs\\highgui C:\\Program Files\\OpenCV\\otherlibs\\cvcam\\include [编辑]项目设置 每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib 如果你不需要这么多lib,你可以只添加你需要的lib。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧