对于访问单点,我正在使用此行代码,并且可以正常工作
int intensity = gray_image.at<uchar>(Point(100, 100));
但是,当我使用此代码访问图像中的所有像素时,会出现内存错误,
for (int i = 0; i < gray_image.rows;i++)
{
for (int j = 0; j < gray_image.cols; j++) {
intensity += gray_image.at<uchar>(Point(i, j));
}
}
当我运行以上代码时,它不会给出编译时错误,但会给出内存异常。我要去哪里错了?
答案 0 :(得分:1)
您请求的像素(j,i)不存在。这不是正方形图像(行数=列数)中的错误,但是您使用的是矩形图像。
Mat :: at函数具有多个原型,您要关注的两个原型是:
C++: template<typename T> T& Mat::at(int i, int j)
C++: template<typename T> T& Mat::at(Point pt)
Mat :: at的documentation指出Point pt被定义为指定为Point(j,i)的Element位置,因此您已经有效地交换了行和列。
发生这种情况的原因是因为图像存储在一维像素阵列中,并且为了获得像素,点(r,c)转换为p = r * image.cols + c;
答案 1 :(得分:1)
您可以跳过Point的使用,然后执行以下操作。
for (int i = 0; i < gray_image.rows;i++)
{
for (int j = 0; j < gray_image.cols; j++) {
intensity += gray_image.at<uchar>(i, j);
}
}