灰度值为负?问题可能出在这里

最近做机器视觉实验的时候偶尔会出现灰度值为负的情况,但总是不了了之,刚刚我正写着新的报告的时候:
image.png
没有办法,索性趁这次机会弄个明白,我的错误代码简化如下:

IplImage* num;
	char str[100]; //存储路径
	sprintf(str, "C:/Users/Faccy/Desktop/机器视觉/实验图片/8/8-1.bmp");
	num = cvLoadImage(str, 0);
	int w = num->width, h = num->height;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < h; j++) {
			int grayValue = (num->imageData + i * num->widthStep)[j];
			cout << grayValue << " ";
		}
	}

读取的图片:
image.png
这是一张二值图片,理论上来说应该是很多255,中间有一些0

我使用的是IplImage的图像数据类型,打开老师的PPT:

image.png
可以看到,原来这个imageData竟然是个字符型的小可爱,那我把grayValue变量定义为char不就行了吗,然而运行的结果:
image.png
没错,结果还是一堆-1。什么?你说我这和上面是同一张图片?我承认确实,不过运行结果的确是一堆-1,只是我懒得再截图了。回到正题,为什么换成char类型后仍然没有解决问题呢?我们上百度一看,妈耶,宝友,char类型的取值范围竟然是-128 ~ 127,而咱们灰度值的范围是0 ~ 255,这可不兴用啊。那么我们继续改,换成unsigned char,这下正好是0 ~ 255了,运行看看结果:
在这里插入图片描述
最后通过的代码:

IplImage* num;
	char str[100]; //存储路径
	sprintf(str, "C:/Users/Faccy/Desktop/机器视觉/实验图片/8/8-1.bmp");
	num = cvLoadImage(str, 0);
	int w = num->width, h = num->height;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < h; j++) {
			unsigned char grayValue = (num->imageData + i * num->widthStep)[j];
			cout << grayValue + 0 << " ";
		}
	}

完事,饮茶去。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值