use*_*695 3 c++ console opencv types output
我对这里提到的openCV文档感到困惑.
根据文档,如果我使用"uchar"创建图像,该图像的像素可以存储无符号整 数值,但如果我使用以下代码创建图像:
Mat image;
image = imread("someImage.jpg" , 0); // Read an image in "UCHAR" form
Run Code Online (Sandbox Code Playgroud)
或通过做
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试使用打印值
cout<<" "<<image.at<uchar>(i,j);
Run Code Online (Sandbox Code Playgroud)
然后我在终端得到一些奇怪的结果,但如果我使用以下语句,那么我可以得到0-255之间的值.
cout<<" "<<(int)image.at<uchar>(i,j); // with TYPECAST
Run Code Online (Sandbox Code Playgroud)
问题:如果图像本身可以存储"无符号整数"值,为什么我需要进行类型转换才能打印0-255范围内的值.
Lih*_*ihO 17
如果你试图找到uchar(如果你使用的是Visual Studio,则按F12),那么你最终会进入OpenCV的核心/ types_c.h:
#ifndef HAVE_IPL
typedef unsigned char uchar;
typedef unsigned short ushort;
#endif
Run Code Online (Sandbox Code Playgroud)
定义无符号整数8位类型(即"8位无符号整数")的标准和合理方法,因为标准确保char总是需要1字节的内存.这意味着:
cout << " " << image.at<uchar>(i,j);
Run Code Online (Sandbox Code Playgroud)
使用重载的operator<<take unsigned char(char),它以字符的形式打印传递的值,而不是数字.
但是,显式强制转换会导致使用另一个版本<<:
cout << " " << (int) image.at<uchar>(i,j);
Run Code Online (Sandbox Code Playgroud)
因此它打印数字.此问题与您使用OpenCV的事实无关.
简单的例子:
char c = 56; // equivalent to c = '8'
unsigned char uc = 56;
int i = 56;
std::cout << c << " " << uc << " " << i;
Run Code Online (Sandbox Code Playgroud)
输出: 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);
}
Run Code Online (Sandbox Code Playgroud)