注意opencv数据类型
关于uchar,首先了解unsigned和signed区别(这里暂时没有太搞明白,存疑。本质在于二进制的存储方式)
https://blog.csdn.net/gukesdo/article/details/6909766
http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html
vec3b
官网给出了一些数据类型说明
template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
S.O上有大牛做出如下解释:
Vec3b is the abbreviation for “vector with 3 byte entries”
Here those byte entries are unsigned char values to represent values between 0 .. 255.
很助于理解了~
参看https://blog.csdn.net/qq_29540745/article/details/52517269
对文章的小例子进行修改,使赋值过程更明确
并结合http://www.cnblogs.com/newneul/p/8407369.html 文章对彩色图、深度图的理解,进行特别的输出(事实证明,结果也很特别
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat m(3, 3, CV_8UC3);//建立一个三行三列3通道像素
Vec3b p;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
p[0] = i;
p[1] = j;
p[2] = i+j;
m.at<Vec3b>(i,j) = p;
cout<<"p= "<<p<<endl<<"m= "<<m<<endl;
}
}
cout <<"数组:"<<endl<<"M= " << m << endl;
int a = m.at<Vec3b>(2, 2)[2];
Vec3b b = m.at<Vec3b>(2, 2)[2];
cout << "访问一个数:" << a <<endl<<"访问三通道:"<<b<<endl;
cout <<"m.at<Vec3b>(2, 2)[2]= "<<m.at<Vec3b>(2, 2)[2]<<endl;//输出很奇怪
cout <<"(char) m.at<Vec3b>(2, 2)[2]= "<<(char)m.at<Vec3b>(2, 2)[2]<<endl;//输出很奇怪+1
cout <<"m.ptr<Vec3b>(2, 2)[2]= " << m.ptr<Vec3b>(2, 2)[2]<<endl;//输出很奇怪+2
return 0;
}
关于最后三项奇怪的输出,原文这样解释:
测试像素的输出效果,这里无法通过cout<<color.at<cv::Vec3b>(471,537)[0]
这种方式来输出第一个通道的值,因为每个通道的像素占了8位而unsigned char表示ascii码 所以输出的时候不是正确的数字,可以通过下面的方式强制转化为int类型(或者用自带的类型转换方式进行显示转换),就可以看到内部的值了。需要注意的一点是 cout页无法输出char类型的变量的地址,也是需要强制转换成void *类型的指针才能正常输出char类型变量的地址信息。
(笔者暂时没明白- -!)
深度图像的像素占16位,普通图片每个通道的像素为8位(但是有什么影响吗?