opencv多通道数据和多维数据的区别

本文详细对比了OpenCV中多通道矩阵与多维矩阵的区别。介绍了它们的创建方式、数据存储方式及访问方法,包括使用指针、Mat_模板类及split函数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opencv中经常要用到多通道矩阵来处理彩色图像,同时多维度的矩阵在opencv中也会经常遇到,这里对这两种数据结构做一个对比。总体来说,对这两种数据结构opencv在处理上是不同的,主要是数据的存储安排上不同。多通道数据仍然是按照二维数据的方式来存放数据,不过于正常的二维矩阵相比较,单个元素包含了多个数据值如B、G、R。而多维矩阵是多个层级的二维矩阵组合而成。下面是一些细节对比,和该结论的依据。

opencv中多维数据的申请:

int sz[]={3,2,2};

Mat dm(3,sz,CV_8U,Scalar(0));

这样申请得到3*2*2的矩阵,并初始化为0。这里3是第0维,是层的概念,2*2是二维空间中的平面概念。

这一点可以由dm.step[0]=4, dm.step[1]=2,dm.step[0]=1得到验证。这里的保存数据是按照行存储,然后按列,最后按层。

dm(k,i,j)=pdm=dm.data+dm.step[0]*k+dm.step[1]*i+dm.step[2]*j;其中k是层数,i是行数,j是列数

opencv中多通道数据的申请:

Mat d(2,2,CV_8UC3,Scalar(0));

这里得到的仍然是一个二维矩阵,每个元素由3个值构成如BGR。这里保存数据先保存每个元素的3个子值,然后按行排列元素,再按照行保存。这点和多维矩阵不同。

这一点可以由d.step[0]=6,d.step[1]=3,,d.step[2]没有意义,得到验证。

这里可以按照指针方式对矩阵元素进行访问,也可以以模板类Mat_进行访问或者利用split函数分离出BGR三个分量矩阵按照二维方式进行处理。

指针方式:

B=dm.data+dm.step[0]*i+dm.step[1]*j+0;

B=dm.data+dm.step[0]*i+dm.step[1]*j+1;

B=dm.data+dm.step[0]*i+dm.step[1]*j+2;

模板类Mat_方式:

Mat_<Vec3b>d_=d;

d_(0,0)便表示多通道矩阵中第一个元素的3BGR分量值,它是Vec3b类型的数据,d_(0,0)[0]d_(0,0)[1]d_(0,0)[2]、分别访问BGR的值。

split函数转化为BGR3个二维矩阵:

vector<Mat>m_ch;

split(d,m_ch);

这样m_ch[0]m_ch[1]m_ch[2]、分别表示BGR的分量矩阵。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值