我正在尝试使用此代码计算我的二进制图像像素值:
int main()
{
Mat img;
img=imread("/home/2b.jpeg", CV_LOAD_IMAGE_UNCHANGED);
namedWindow("win", WINDOW_AUTOSIZE);
imshow("win", img);
for(int i=0; i< img.rows ;i++)
{
for(int j=0; j< img.cols ; j++)
{
cout<<setw(10)<<img.at<int>(i,j);
}
cout<<endl<<endl<<endl;
}
waitKey(0);
return 0;
}
但我得到3种类型的值:0,-1和一些大的不同数字,如(24342234,1324244242等)
有什么问题?我在绘画程序中画了一条黑线并保存图像,或者从网上下载二进制图像但我得到的结果相同!
我想当我使用二进制图像时,白色像素必须为0,黑色像素为255。
答案 0 :(得分:2)
首先,您应该使用uchar
(unsigned char
)而不是int
来访问其像素。
当cout
时,您必须明确转换为其他类型,例如int
才能正确打印,因为cout
在打印unsigned char
时它的值很奇怪大于127
。否则,它将打印一些垃圾值(或没有),因为它只是一个 不可打印的 ASCII字符,无论如何都要打印。查看Why "cout" works weird for "unsigned char"?。
cout << setw(10) << (int) img.at<uchar>(i,j);
^^^^^ ^^^^^
答案 1 :(得分:0)
尝试将其加载为CV_IMAGE_GRAYSCALE,并使用image.at< uchar>(y,x)
访问像素值。
答案 2 :(得分:0)
您正在尝试访问整数值,而实际上您的mat是uchar。尝试将内部循环线更改为:
cout<<setw(10)<<img.at<uchar>(i,j);