最近做机器视觉实验的时候偶尔会出现灰度值为负的情况,但总是不了了之,刚刚我正写着新的报告的时候:
没有办法,索性趁这次机会弄个明白,我的错误代码简化如下:
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 << " ";
}
}
读取的图片:
这是一张二值图片,理论上来说应该是很多255,中间有一些0
我使用的是IplImage的图像数据类型,打开老师的PPT:
可以看到,原来这个imageData竟然是个字符型的小可爱,那我把grayValue变量定义为char不就行了吗,然而运行的结果:
没错,结果还是一堆-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 << " ";
}
}
完事,饮茶去。