OpenCV创建图像之通道

Mat Type

形式:CV_(S|U|F)C
bit_depth:比特数—代表8bite,16bites,32bites,64bites…
举个例子吧–比如说:
如果你现在创建了一个存储–灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位–所以它对应的就是CV_8。
S|U|F:
S–代表—signed int—有符号整形
U–代表–unsigned int–无符号整形
F–代表–float---------单精度浮点型
C----代表—一张图片的通道数,比如:
channels = 1:灰度图片–grayImg—是–单通道图像
channels = 3:RGB彩色图像---------是–3通道图像
可以这么创建Mat类对象:
Mat(int rows, int cols, int _type);
或 Mat(Size size,int _type);
_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.

注意:我们偶尔会发现不带通道数的类型,如:CV_32S,CV_8U等等。其实,不带通道数的这些类型就是默认通道数为1。
例如,CV_8U就等同于CV_8UC1,CV_32S就等同于CV_32SC1。
参考链接:https://stackoverflow.com/questions/14543420/in-opencv-whats-the-difference-between-cv-8u-and-cv-8uc1

Mat Imshow

imshow函数在显示图像时,会将各种类型的数据都映射到[0, 255]。
如下:
· 如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。
· 如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer,有符号位,去掉符号位只有16位),便用像素值除以256。也就是说,值的范围是 [0,255 x 256]映射到[0,255]。
· 如果图像是32位或64位浮点型(32-bit floating-point or 64-bit floating-point),像素值便要乘以255。也就是说,该值的范围是 [0,1]映射到[0,255]。
如:CV_8U的灰度或BGR图像的颜色分量都在0~255之间。直接imshow可以显示图像。 CV_32F或者CV_64F取值范围为0~1.0,imshow的时候会把图像乘以255后再显示。

Mat at

OpenCV 中有模板类 Vec,可以表示一个向量。OpenCV 中使用 Vec 类预定义了一些小向量,可以将之用于矩阵元素的表达。
typedef Vec Vec3b;
typedef Vec Vec3f;

at()函数

uchar value = grayimg.at(i,j);//读出第i行第j列像素值
grayimg.at(i,j)=128; //将第i行第j列像素值设置为128

Mat colorim(600, 800, CV_8UC3);
//遍历所有像素,并设置像素值
for( int i = 0; i < colorim.rows; ++i) {
  for( int j = 0; j < colorim.cols; ++j ){
    Vec3b pixel;
    pixel[0] = i%255; //Blue
    pixel[1] = j%255; //Green
    pixel[2] = 0; //Red
    colorim.at(i,j) = pixel;
  }
}

Mat 也增加了迭代器的支持,以便于矩阵元素的遍历。

Mat grayim(600, 800, CV_8UC1);
Mat colorim(600, 800, CV_8UC3);
//遍历所有像素,并设置像素值
MatIterator_ grayit, grayend;
for( grayit = grayim.begin(), grayend = grayim.end(); grayit != grayend; ++grayit) {
   *grayit = rand()%255;
}
//遍历所有像素,并设置像素值
MatIterator_ colorit, colorend;
for( colorit = colorim.begin(), colorend = colorim.end(); colorit != colorend; ++colorit) {
  (*colorit)[0] = rand()%255; //Blue
  (*colorit)[1] = rand()%255; //Green
  (*colorit)[2] = rand()%255; //Red
}

如果你非常注重程序的运行速度,那么遍历像素时,建议使用指针。

Mat grayim(600, 800, CV_8UC1);
Mat colorim(600, 800, CV_8UC3);
//遍历所有像素,并设置像素值
for( int i = 0; i < grayim.rows; ++i) {
    //获取第 i 行首像素指针
    uchar * p = grayim.ptr(i);
    //对第 i 行的每个像素(byte)操作
    for( int j = 0; j < grayim.cols; ++j ) {
        p[j] = (i+j)%255;
    }
}
//遍历所有像素,并设置像素值
for( int i = 0; i < colorim.rows; ++i) {
    //获取第 i 行首像素指针
    Vec3b * p = colorim.ptr(i);
    for( int j = 0; j < colorim.cols; ++j ) {
        p[j][0] = i%255; //Blue
        p[j][1] = j%255; //Green
        p[j][2] = 0; //Red
    }
}

Mat type&depth

参考下文:
https://segmentfault.com/a/1190000015653101

你可能感兴趣的:(【无人机】)