opencv-把多个单通道Mat合成一个多通道Mat

int main(){
    cv::Mat m1=(cv::Mat_<int>(3,2)<<1,2,3,4,5,6);
    cv::Mat m2=(cv::Mat_<int>(3,2)<<2,4,6,8,10,12);
    cv::Mat m3=(cv::Mat_<int>(3,2)<<3,6,9,12,15,18);
//方法1
    cv::Mat inm[]={m1,m2,m3};
    cv::Mat outm;
    cv::merge(inm,3,outm);  // 合并后行数和列数不变。each element of the output array will be a concatenation of the elements of
    // the input arrays, where elements of i-th input array are treated as mv[i].channels()-element vectors.
    std::cout<<outm<<std::endl;
//方法2(这个挺好的)
    std::vector<cv::Mat> inm1;
    inm1.push_back(m1);
    inm1.push_back(m2);
    inm1.push_back(m3);
    cv::Mat outm1;
    cv::merge(inm1,outm1);
    std::cout<<outm1<<std::endl;
    //
    std::cout<<"outm1.rows:"<<outm1.rows<<std::endl;
    std::cout<<outm1.rowRange(1,3)<<std::endl;
    std::cout<<"outm1.cols:"<<outm1.cols<<std::endl;
    std::cout<<outm1.colRange(0,1)<<std::endl;
    return 0;
}

opencv-把多个单通道Mat合成一个多通道Mat_第1张图片

但是这种会出现问题
for (int i = 0; i < 32; i++)
{
channels.push_back(var1); //添加32次Mat类var1, 在vector类中作用为在vector尾部加入一个数据
}
添加的都是最后一次来的那个,同一个mat值。

比如说我想的是PointCloud中存放的应该是两组坐标点:(0,0,0)和(10,10,10)

但结果却是:(10,10,10)和(10,10,10)

原因是:pushback会调用拷贝构造函数来拷贝数据,这就涉及到Mat的深拷贝和浅拷贝问题了

解决方案:

        channels.push_back(I1.clone()); //深拷贝
        //channels.push_back(I1);///这里pushback调用的是Mat的浅拷贝函数,数据共享,

http://www.mamicode.com/info-detail-2774438.html
http://blog.sina.com.cn/s/blog_65d2b0b20102y2wv.html

你可能感兴趣的:(opencv)