OpenCV中的Mat类(二)

OpenCV中的Mat类(二),第1张

学习资料参考:

张平.《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. 使用成员函数rowRangecolRange得到矩阵的连续行或者连续列。


    (注意若使用这两个函数进行修改元素值,那么也会导致原矩阵的相应位置元素值进行改变)

    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;
    }
    
  3. 若要避免修改原矩阵,那么可使用成员函数 clone

    Mat r_range = matrix.rowRange(2,4).clone();
    或者
    Mat r_range; matrix.rowRange(2,4).copyTo(r_range);


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/567509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存