学习资料参考:
张平.《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_<int>(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<int>(r,c) << " "; } cout << endl; }
-
若要避免修改原矩阵,那么可使用成员函数
clone
Mat r_range = matrix.rowRange(2,4).clone();
或者
Mat r_range; matrix.rowRange(2,4).copyTo(r_range);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)