这是我的第一篇博客,有点儿激动。就当是一篇小小的日记吧。刚刚大二,学习了半年的编程语言,只掌握了皮毛。想学太多东西,恨不得把要掌握的全部啃下了。我居然忘了静下心来一步步才能走得远走得稳。虽然我是个百得不能再白的小白,但是我会努力,我会一步步把我学到的东西记录下来。不走弯路,不犯同样的错误,加油!!
言归正传,今天我要记录的问题是at()函数处理像素点时CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channel报错。报错的情况如下图:
我在vs中,试着通过at()函数遍历二值图像的像素点进而确定原点的位置,错误的代码段如下:
-
for (int i = 0; i < pic.rows; i++) { for (int j = 0; j < pic.cols; j++) { if (pic.at<uchar>(i, j) == 250 && pic.at<uchar>(i, j + 1) == 0) { ver[0][0] = i; ver[0][1] = j; } } }
问题就出在遍历过程中通过矩阵点访问像素点越界了!!!原因有两点:
第一个是因为:判断了(i,j)以及(i,j+1)的像素值,当j取到cols时,j+1就超过了允许的范围!
第二是以为:当遍历已经找到了顶点坐标时,循环就可以结束了,往下继续不仅消耗内存,而且还使j能够达到cols处。
做出改变后的代码如下:
for (int i = 0; i < pic.rows; i++) {
for (int j = 0; j < pic.cols-10; j++) {
if (pic.at<uchar>(i, j) == 250 && pic.at<uchar>(i, j + 1) == 0) {
ver[0][0] = i;
ver[0][1] = j;
break;
}
}
}
让j最多遍历到cols-10,因为我需要处理的图像是这个样子的,完全不需要遍历到cols。
解答的不是很精彩,但是对于初学图片处理的我来说,这个问题困扰了我整整两天。对于我这个问题是这样解决的,一定还有其他的错误导致这个希望能对你的学习有一点点的帮助。我们一起加油哦!