I have the following code:
cvtColor (image, image, CV_BGRA2RGB);
Vec3b bottomRGB;
bottomRGB=image.at<Vec3b>(821,1232);
When I display bottomRGB[0]
, it displays a value greater than 255. What is the reason for this?
As you have commented, the reason is that you use cout
to print its content directly. Here I will try to explain to you why this will not work.
cout << bottomRGB[0] << endl;
Why "cout"
works weird for "unsigned char"
?
It will not work because here bottomRGB[0]
is a unsigned char
(with value 218
), cout
actually will print some garbage value (or nothing) as it is just a non-printable ASCII character which is getting printed anyway. Note that ASCII character corresponding to 218
is non-printable. Check out here for the ASCII table.
P.S. You can check whether bottomRGB[0]
is printable or not using isprint()
as:
cout << isprint(bottomRGB[0]) << endl; // will print garbage value or nothing
It will print 0
(or false
) indicating the character is non-printable
For your example, to make it work, you need to type cast it first before cout
:
cout << (int) bottomRGB[0] << endl; // correctly printed (218 for your example)
来源:https://stackoverflow.com/questions/21374773/why-cout-works-weird-for-unsigned-char