at()函数提取像素点报错

这是我的第一篇博客,有点儿激动。就当是一篇小小的日记吧。刚刚大二,学习了半年的编程语言,只掌握了皮毛。想学太多东西,恨不得把要掌握的全部啃下了。我居然忘了静下心来一步步才能走得远走得稳。虽然我是个百得不能再白的小白,但是我会努力,我会一步步把我学到的东西记录下来。不走弯路,不犯同样的错误,加油!!

言归正传,今天我要记录的问题是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。

解答的不是很精彩,但是对于初学图片处理的我来说,这个问题困扰了我整整两天。对于我这个问题是这样解决的,一定还有其他的错误导致这个希望能对你的学习有一点点的帮助。我们一起加油哦!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值