学习资料参考:
张平.《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类中某一区域值
- 使用成员函数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); - 使用成员函数 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;} - 若要避免修改原矩阵,那么可使用成员函数 clone Mat r_range = matrix.rowRange(2,4).clone();
或者
Mat r_range; matrix.rowRange(2,4).copyTo(r_range);
文章出处登录后可见!
已经登录?立即刷新