c++ - OpenCV 文档说 "uchar"是 "unsigned integer"数据类型。如何?

标签 c++ opencv types console output

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

根据文档,如果我使用 "uchar" 创建图像,该图像的像素可以存储 unsigned integer 值,但如果我使用以下代码:

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 范围内的值。

最佳答案

如果您尝试查找 uchar 的定义(如果您使用的是 Visual Studio,则按 F12),然后您将进入 OpenCV 的 core/types_c.h:

#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);
}

关于c++ - OpenCV 文档说 "uchar"是 "unsigned integer"数据类型。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22115302/

相关文章:

c++ - 检索元素

python - 使用 Python 在 OpenCV 中获得 detectMultiscale 的置信度?

OpenCV:矩阵迭代

C#: "(subtype)data"和 "data as subtype"类型转换之间有什么区别吗?

c++ - 为什么变量和函数不能同名?

c++ - 为什么赋值运算符不会发生 RVO? (C++)

java - 如何将android volley gson请求解析为对象列表/集合

swift - 使用Any类型是一个好的解决方案时,有没有具体的例子?

c++ - C/C++ 运行时库和 C/C++ 标准库的区别

python - 在忽略边界的颜色反卷积后识别正像素