前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【opencv】cv::Mat 公有属性 (Public Attributes)

【opencv】cv::Mat 公有属性 (Public Attributes)

作者头像
JNingWei
发布2020-03-12 19:14:40
发布2020-03-12 19:14:40
1.5K00
代码可运行
举报
文章被收录于专栏:JNing的专栏JNing的专栏
运行总次数:0
代码可运行

作用

图像在OpenCV中都是通过Mat类来存储的,Mat可以用来表示N维矩阵。

Public Attributes

主要包含两部分:

  • 用来描述矩阵的头信息;
  • data指针,指向Mat中存储的数据。

type

attr

备注

MatAllocator *

allocator

const uchar *

dataend

const uchar *

datalimit

const uchar *

datastart

int

flags

int

dims

维数

int

rows

行数

int

cols

列数

MatSize

size

结构体,表示每一行占据的字节数目(包括padding数);image.size().width = image.cols;image.size().height = image.rows

MatStep

step

UMatData *

u

uchar *

data

uchar类型的指针,指向Mat数据矩阵的首地址

Note:

  • 如果data中没有padding,我们可以把矩阵的data当一维数据处理,数据长度就是rowscolselemSize()。

Code Example

新建Mat

创建一个5×5×3的3维矩阵,数据类型为8bit无符号数,初始值都为(0,0,255)

代码语言:javascript
代码运行次数:0
复制
cv::Mat M(5,5, CV_8UC3, cv::Scalar(0,0,255));

其对应的可视化矩阵如下:

拷贝Mat

这里以 “从M拷贝出N” 为例。

1. 浅拷贝

只是新生成一个矩阵头,它的data指针依然指向M.data。

代码语言:javascript
代码运行次数:0
复制
Mat N(M);

or

代码语言:javascript
代码运行次数:0
复制
Mat N = M;
2. 深拷贝

生成一个全新的矩阵:不但拷贝矩阵的头信息,而且会生成一个data的拷贝(即data指针指向不同的地址)。

代码语言:javascript
代码运行次数:0
复制
Mat N = M.clone();

or

代码语言:javascript
代码运行次数:0
复制
Mat N;
M.copyTo(N);

其中,copyTo函数还可以带有掩码矩阵copyTo(G, maskImage)。 maskImage是一个单通道的矩阵,值为0的位置,在拷贝时候并不会被拷贝到:

访问data中元素

这里以二维矩阵为例,若是多维矩阵,则相应增加for循环。

1. 直接访问
代码语言:javascript
代码运行次数:0
复制
for(i=0; i< M.rows; i++)
{
    for(j=0; j<M.cols*M.elemSize(); j++)
   {
       printf ("%d ", M.data[i*M.cols*M.elemSize() + j]);
   }
   printf("\n");
}
2. 指针访问
代码语言:javascript
代码运行次数:0
复制
uchar* p;
for( i = 0; i < M.rows; ++i)
{
    // 得到第i行的指针,等价于 p = M.data + i*M.step
    p = M.ptr<uchar>(i);
    for ( j = 0; j < M.cols; ++j)
    {
      printf (" %d %d %d",p[j*3], p[j*3+1],p[j*3+2]);
     }
    printf("\n");
}
3. at访问

也可以用at的方式得到数组元素。 M.atcv::Vec3b(i,j)[2]得到元素中的第2个分量; 如果M.at(i,j),则只能取到元素的第一个分量。

代码语言:javascript
代码运行次数:0
复制
for(i=0; i< M.rows; i++)
    {
    for(j=0; j<M.cols; j++)
        {
        printf ("%d %d %d ", M.at<cv::Vec3b>(i,j)[0],M.at<cv::Vec3b>(i,j)[1], M.at<cv::Vec3b>(i,j)[2]);
        }
    printf("\n");
    }
}
4. 迭代器访问
代码语言:javascript
代码运行次数:0
复制
cv::MatIterator_<cv::Vec3b> it, end;
for( it = M.begin<cv::Vec3b>(), end = M.end<cv::Vec3b>(); it != end; ++it)
{
    printf("%d %d %d\n",(*it)[0], (*it)[1], (*it)[2]);
}

取区域块

取出矩阵的某个ROI区域,以便进行处理。

代码语言:javascript
代码运行次数:0
复制
cv::Rect rect(50, 50, 100, 100);   // 要切取的区域(x1, y1, x2, y2)
srcImage(rect).copyTo(roiImage); 

线性变换

生成一个新矩阵,矩阵的中值为原矩阵中的值乘以alpha,然后再加上beta。

代码语言:javascript
代码运行次数:0
复制
convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 )

例如,实现 M(x,y) = N(x,y) × 10 + 255 :

代码语言:javascript
代码运行次数:0
复制
N.convertTo(M, CV_8U, 10, 255);

参考文献

[1] cv::Mat Class Reference [2] OpenCV学习(4) Mat的基本操作(1) [3] OpenCV学习(5) Mat的基本操作(2) [4] OpenCV—矩阵数据类型转换cv::convertTo [5] Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作用
  • Public Attributes
  • Code Example
    • 新建Mat
    • 拷贝Mat
    • 访问data中元素
    • 取区域块
    • 线性变换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档