本人的问题就是用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;
}
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;
}
解决方案:20分
for(int i = 0; i < img_row/*这里不应该减一吧-1*/; i++) { //做循环分配出m×n个空间