OpenCV文档说“uchar”是“无符号整数”数据类型。怎么样?

时间:2014-03-01 13:57:15

标签: c++ opencv types console output

我对提到的here的openCV文档感到困惑。

根据文档,如果我使用“uchar”创建图像,该图像的像素可以存储无符号整数值但是如果我使用以下代码:

Mat image;
image = imread("someImage.jpg" , 0); // Read an image in "UCHAR" form

或通过

image.create(10, 10, CV_8UC1);
for(int i=0; i<image.rows; i++)
{
    for(int j=o; j<image.cols; j++)
    {
        image.at<uchar>(i,j) = (uchar)255;
    }
}

然后如果我尝试使用

打印值
cout<<"  "<<image.at<uchar>(i,j);

然后我在终端得到一些奇怪的结果,但如果我使用以下语句,那么我可以得到介于0-255之间的值。

cout<<"  "<<(int)image.at<uchar>(i,j); // with TYPECAST

问题:如果图像本身可以存储“无符号整数”值,为什么我需要进行类型转换才能打印0-255范围内的值。

2 个答案:

答案 0 :(得分:17)

如果您尝试查找uchar的定义(如果您使用的是Visual Studio,则按F12),那么您将最终进入OpenCV的 core / types_c.h :< / p>

#ifndef HAVE_IPL
   typedef unsigned char uchar;
   typedef unsigned short ushort;
#endif

定义无符号整数8位类型(即“8位无符号整数”)的标准和合理方法,因为标准确保char总是需要1字节的内存。这意味着:

cout << "  " << image.at<uchar>(i,j);

使用带operator<<unsigned char)的重载char,它以字符形式打印传递的值,而不是数字。

然而,显式强制转换会导致使用另一版本的<<

cout << "  " << (int) image.at<uchar>(i,j);

因此它打印数字。此问题与您完全使用OpenCV无关。


简单示例:

char           c = 56; // equivalent to c = '8'
unsigned char uc = 56;
int            i = 56;
std::cout << c << " " << uc << " " << i;

输出:8 8 56

如果它是一个模板的事实让你困惑,那么这种行为也等同于:

template<class T>
T getValueAs(int i) { return static_cast<T>(i); }

typedef unsigned char uchar;

int main() {
    int i = 56;
    std::cout << getValueAs<uchar>(i) << " " << (int)getValueAs<uchar>(i);
}

答案 1 :(得分:4)

简单地说,因为虽然uchar是整数类型,但流操作<<打印它所代表的字符,而不是数字序列。传递类型int会得到相同流操作的不同重载,它会打印一系列数字。