我对提到的 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/