本文主要是介绍Mat行复制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.Mat::row()函数
作用:截取特定行数矩阵,并创建矩阵头部信息(header)。
复杂度:O(1),原因是新的矩阵数据与源矩阵共享,并不会创建新的存储空间。所以导致的问题是下方代码并不会执行:
for (int i = A.rows; i > 100; i--) {
A.row(i) = A.row(i-100);//图像下移100个像素
}
这是因为A.rows(i)创建的是一个临时头部信息,O(1)复杂度意味着没有信息被复制,没有新的存储空间建立。所以=并不会有效。正确的方法是使用:
A.row(i).copyTo(b.row(i-100));
但是,矩阵之间=是没有问题的,测试代码如下:
Mat res_img;
res_img = bg2_img;
bg2_img.release();
pic_look(res_img);//自定义查看图片方法
这段代码可以正常查看res_img图像,也就是bg2_img的图像。
注意:
- 1,copyTo(outputarray m, inpuyarray mask)函数的mask参数是可有可无的,表示mask矩阵中非0的位置就copy,否则不copy。mask矩阵的类型一定是 CV_8UC1或者CV_8UC3。
- 2,第一个参数m可以仅仅创建了头部,并没有分配存储空间。因为copyTo()函数在调用之前,先调用m.create(this->size(), this->type())
这篇关于Mat行复制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!