opencv1.exe 中的 0x00e91bb3 处有未经处理的异常: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突

幼稚园接悟空 2014-09-25 07:28:13
我的问题就是用opencv读取一幅图像32×32的 获取灰度值的时候报错了 是写入位置发生冲突 我用debug一步一步跟的 我是按行按列做循环 直到最后一个值该跳出的时候报这个错误 所以有没有可能是我内存不够?求教各位大神帮解决


int** readImg(char* imagename) {

Mat img = imread(imagename);
int channels = img.channels();

img_row = img.rows;
img_col = img.cols;

//如果读入图像失败
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);

exit;
}

int **matrix = NULL; //定义二维指针数组
matrix = new int *[img_row]; //new出m个空间,里面存的都是地址

for(int i = 0; i < img_row-1; i++) { //做循环分配出m×n个空间
matrix[i] = new int[img_col];
}

switch(channels){
case 1:
cout << "channels = " << channels << " ==> ";
for (int col = 0; col < img_col; col++)
{
for (int row = 0; row < img_row; row++)
{
matrix[row][col] = (int)(*(img.data + img.step[0] * row + img.step[1] * col));
//cout << (int)(*(img.data + img.step[0] * row + img.step[1] * col)) << " ==> ";
//获取第[row,col]个像素点的地址并用 * 符号解析
//*(img.data + img.step[0] * row + img.step[1] * col) = 255;

cout << (int)(*(img.data + img.step[0] * row + img.step[1] * col)) << endl;
}
}
case 3:
for (int row = 0; row < img.rows; row++)
{
for (int col = 0; col < img.cols; col++)
{

matrix[row][col] = 1/3 * (img.at<Vec3b>(row, col)[0] + img.at<Vec3b>(row, col)[1] + img.at<Vec3b>(row, col)[2]);
/* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,
所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里
提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */
//if(img.at<Vec3b>(row, col)[2] > 128)
//img.at<Vec3b>(row, col) = Vec3b(255, 255, 255);
}
}
}

//显示图像,在哪个个窗口显示
imshow("image", img); //void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE)//用来创建窗口的函数
//此函数等待按键,按键盘任意键就返回
waitKey();

return matrix;
}
...全文
2374 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengu8130 2016-12-05
  • 打赏
  • 举报
回复
请问楼主解决了吗?我也碰到了相似的错误
墨痕yy 2015-11-01
  • 打赏
  • 举报
回复
赵4老师 2014-09-26
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
幼稚园接悟空 2014-09-25
  • 打赏
  • 举报
回复
你能告诉我什么我这个代码需要在什么地方delete吗
幼稚园接悟空 2014-09-25
  • 打赏
  • 举报
回复
对对 是这个问题 我刚才也找到了 现在不知道为什么又报HEAP[opencv1.exe]: Invalid address specified to RtlValidateHeap( 004B0000, 004B4140 ) Windows 已在 opencv1.exe 中触发一个断点。 其原因可能是堆被损坏,这说明 opencv1.exe 中或它所加载的任何 DLL 中有 Bug。 这个错了
brookmill 2014-09-25
  • 打赏
  • 举报
回复
0xcdcdcdcd是个很有意思的值,VS用它来标记未初始化的堆内存,所以一看就知道问题是和malloc或new相关的。 http://blog.csdn.net/bluefatty001/article/details/8454760
brookmill 2014-09-25
  • 打赏
  • 举报
回复
for(int i = 0; i < img_row/*这里不应该减一吧-1*/; i++) {  //做循环分配出m×n个空间

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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