OpenCV中的Mat类(二)

学习资料参考:

张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.

拆分通道

OpenCV提供的split()函数可分离多通道,如将多通道矩阵mm分离为多个单通道,这些单通道被存放在vector容器中。

Mat mm = (Mat_<Vec3i>(2,3) <<Vec3i(1,11,21),Vec3i(2,12,22),Vec3i(3,13,23),Vec3i(4,14,24)); 
vector<Mat> planes;
split(mm,planes);

分割后如下图
书籍上的摘图

合并频道

函数声明

void merge(const Mat*mv,size_t count,OutputArray dst)

例子
将三个2行2列的int类型的单通道矩阵合并为一个多通道矩阵,代码如下:

Mat plane0 = (Mat_<int>(2,3) << 1,2,3,4);
Mat plane1 = (Mat_<int>(2,3) << 5,6,7,8);
Mat plane2 = (Mat_<int>(2,3) << 9,10,11,12);

//合并方式一
//用3个单通道矩阵初始化一个数组
Mat plane[] = {plane0,plane1,plane2};
//合并
Mat mat;
merge(plane,3,mat);

//合并方式二
//或者存入vector容器中
vector<Mat> plane;
plane.push_back(plane0);
plane.push_back(plane1);
plane.push_back(plane2);
//合并
Mat mm;
merge(plane,mm);

获取Mat类中某一区域值

  1. 使用成员函数row(i)或者col(j)得到矩阵的第i行或者第j列(注意返回值是一个单通道的Mat类型)。
    在单通道矩阵中,如下实现:int r = 1;int c = 0;//矩阵的第r行Mat mr = m.row(r);//矩阵的第c列Mat mc = m.col(c);
  2. 使用成员函数 rowRange 或 colRange 得到矩阵的连续行或者连续列。(注意若使用这两个函数进行修改元素值,那么也会导致原矩阵的相应位置元素值进行改变)Range(int start,int end);//该函数是左闭右开取值
    示例Mat matrix = (Mat_(5,5) << 1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15, 16,17,18,19,20, 21,22,23,24,25);//若需要获取1到2行Mat r_range = matrix.rowRange(Range(1,3));//或者Mat r_range2 = matrix.rowRange(1,3);//若需获取1到2列Mat c_range = matrix.colRange(1,3);//或者Mat c_range2 = matrix.colRange(Range(1,3));//输出子矩阵for(int r = 0;r < r_range.rows;++r){ for(int c = 0;c < r_range.cols;++c){ cout << r_range.at(r,c) << ” “; } cout << endl;}
  3. 若要避免修改原矩阵,那么可使用成员函数 clone Mat r_range = matrix.rowRange(2,4).clone();
    或者
    Mat r_range; matrix.rowRange(2,4).copyTo(r_range);

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年4月9日 上午11:08
下一篇 2022年4月9日 上午11:17

相关推荐