cv::Mat 对像素进行操作取地址

cv::Mat

depth/dims/channels/step/data/elemSize

The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. (Mat类的对象用于表示一个多维度的单通道或者多通道稠密数组)

  • 矩阵 (M) 中数据元素的地址计算公式:
    这里写图片描述

    • data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data)

    uchar *data = img.data;

    • dims:Mat所代表的矩阵的维度,如 3 4 的矩阵为 2 维, 3 4 * 5 的为3维
    • channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。
    • depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;
    • elemSize : 矩阵中每一个元素的数据大小,如果Mat中的数据的数据类型是 CV_8U 那么 elemSize = 1,CV_8UC3 那么 elemSize = 3,CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即 elemSize / channels 的大小
    • step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意 step1 (step / elemSize1),M.step[m-1] 总是等于 elemSize,M.step1(m-1)总是等于 channels;

    这里写图片描述

    上面是一个 3 X 4 的矩阵,假设其数据类型为 CV_8U,也就是单通道的 uchar 类型

    这是一个二维矩阵,那么维度为 2 (M.dims == 2);

    • M.rows == 3; M.cols == 4;

    • sizeof(uchar) = 1,那么每一个数据元素大小为 1 (M.elemSize() == 1, M.elemSize1() == 1);

    • CV_8U 得到 M.depth() == 0, M.channels() == 1;

    • 因为是二维矩阵,那么 step 数组只有两个值, step[0] 和 step[1] 分别代表一行的数据大小和一个元素的数据大小,则 M.step[0] == 4, M.step[1] == 1;

    • M.step1(0) == M.cols = 4; M.step1(1) == 1;

    假设上面的矩阵数据类型是 CV_8UC3,也就是三通道

    • M.dims == 2; M.channels() == 3;M.depth() == 0;

    • M.elemSize() == 3 (每一个元素包含3个uchar值) M.elemSize1() == 1 (elemSize / channels)

    • M.step[0] == M.cols M.elemSize() == 12, M.step[1] == M.channels() M.elemSize1() == M.elemSize() == 3;

    • M.step1(0) == M.step[0]/elemSize1 == 12 ; M.step1(1) == M.channels() == 3;

[1]: 本文参考自: http://blog.csdn.net/chenkent888/article/details/11859639


cv::Mat 类的属性和方法

  • at()

成员函数,at(int y, int x) 可以用来存取图像元素。 但是必须在编译期知道图像的数据类型,因为 cv::Mat 可以存放任意数据类型的元素。所以使用 at 方法要指定数据类型,而且 at 方法本身不会进行任何数据类型转换。

cv::Vec3b vec3b = img.at<cv::Vec3b>(0,0);
uchar vec3b0 = img.at<cv::Vec3b>(0,0)[0];
uchar vec3b1 = img.at<cv::Vec3b>(0,0)[1];
uchar vec3b2 = img.at<cv::Vec3b>(0,0)[2];

cv::Vec3b,即由三个 unsigned char 组成的向量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值