OpenCV文档说"uchar"是"unsigned integer"数据类型。如何?
OpenCV documentation says that "uchar" is "unsigned integer" datatype. How?
我对这里提到的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 范围内的值。
如果你试图找到uchar
的定义(如果你使用的是Visual Studio,则按F12),那么你最终会进入OpenCV的核心/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);
使用采用 unsigned char
( char
) 的重载operator<<
,它以字符形式而不是数字的形式打印传递的值。
但是,显式强制转换会导致使用另一个版本的<<
:
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);
}
简单地说
,因为尽管uchar
是整数类型,但流操作<<
打印它表示的字符,而不是数字序列。传递类型int
你会得到同一流操作的不同重载,这确实会打印一系列数字。
相关文章:
- 如何计算数据类型的范围,例如int
- 如何获取C++字符数据类型的地址
- 如何使映射键具有两种不同的数据类型?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 如何为我的数组选择更大的数据类型?
- 如果用户不小心给出了不正确的数据类型,cin 如何工作?
- 如何在变量中插入多种不同长度的数据类型?
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 如何使用 dart:ffi 将 Uint8List 转换为 C 等效数据类型
- 如何使用C++中可以具有多种数据类型的单个变量
- 如何使虚函数接受仅在派生类中定义的数据类型?
- 如何使用模板获取向量中的数据类型?
- 如何使用宏根据参数定义不同的数据类型?
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- 重载数据类型如何从函子调用
- 数据类型如何与C#中的C#一起使用c 和数据类型
- Java 编程语言中的数据类型如何映射到本机编程语言(如 C 和 C++)中的数据类型
- 根据具体情况在if语句中声明不同的数据类型:如何关闭编译器
- wchar_t数据类型如何工作
- 提振.图-有2个简单类和一个类-数据类型如何创建一个图