opencv学习笔记(二)----数据类型

Mat的一些基本操作

创建指定大小的空Mat

Mat tempImg = Mat::zeros(img.rows,img.cols, img.type());
Mat grayImg(img.rows,img.cols,CV_8UC1,Scalar::all(0));

Mat的属性:

  • data uchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针。
  • dims 矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3.
  • rows 矩阵的行数
  • cols 矩阵的列数
  • size 矩阵的大小,size(cols,rows),如果矩阵的维数大于2,则是size(-1,-1)
  • channels 矩阵元素拥有的通道数,例如常见的彩色图像,每一个像素由RGB三部分组成,则channels = 3
  • type 表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)。
  • depth 矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV16SC2,一个2通道的16位的有符号整数。那么,depth则是CV16S。depth也是一系列的预定义值。
  • elemSize 矩阵一个元素占用的字节数,例如:type是CV_16SC3,那么elemSize = 3 * 16 / 8 = 6 bytes
  • elemSize1 矩阵元素一个通道占用的字节数,例如:type是CV_16CS3,那么elemSize1 = 16 / 8 = 2 bytes = elemSize / channels

遍历Mat中的数据:

for(int i=0;i<img.rows;i++){
    for(int j=0;j<img.cols;j++){
        img.at<uchar>(i,j) = i+j;
    }
}

或者利用指针:

for (int i = 0; i < input.rows; i++){
    //取出图像中第i行数据的指针:image.ptr<uchar>(i)
    uchar* p = input.ptr<uchar>(i);
    for (int j = 0; j < input.cols; j++){
        int vaule = p[j];
        gray[vaule]++;
    }
 }
 //多通道则用Vec3b vector是表示矢量,vec3b指三通道即<uchar,3>
 img.at<Vec3b>(i,j)[0]

Vector类详解

vector是一个向量类。动态分配内存,相当于一个size可变的数组。 

1、vector的声明

vector<int> a;    //声明一个int型向量a
vector<int> a(10);    //声明一个初始大小为10的向量
vector<int> a(10, 1);    //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a);    //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5);    //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]);    //将n[1] - n[4]范围内的元素作为向量a的初值
    
vector<Mat> channels  //声明一个Mat类型的向量channels

2.添加元素

vector<int> a;
a.push_back(1);    //在尾部加入一个数据
a.push_back(2);
a.pop_back();      //删除最后一个数据
a.insert(a.begin(), 0);    //在a.begin()之前加入0
a.erase(a.begin());    //将a.begin()的元素删除
a.erase(a.begin() + 1, a.end());    //将第二个元素以后的元素均删除

3.判断vector是否为空

vector<int> a;
if(a.empty()){
    a.push_back(1);
}

4.遍历访问vector

vector<int> a;
//像数组一样以下标访问 
for(int i = 0; i < a.size(); i++){
    cout << a[i];
}
 
//以迭代器访问
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++){
    cout<<*it<<" " ;
}

5.排序必须包含algorithm头文件

#include <algorithm>
 
vector<int> a;
sort(a.begin(), a.end());

6.以vector实现二维数组

vector<vector<int>> a(10, vector<int>(5));    //创建一个10行5列的int型二维数组 相当于a[10][5];

同理可以创建三维及以上数组,这些多维数组的操作同一维的vector类似。

猜你喜欢

转载自blog.csdn.net/zyhhhh233/article/details/80282150