OpenCV Mat数据存储格式详解
来源:互联网 发布:2016淘宝排名规则 编辑:程序博客网 时间:2024/06/05 18:01
官方手册:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/mat%20-%20the%20basic%20image%20container/mat%20-%20the%20basic%20image%20container.html#id2
http://blog.csdn.net/u013488563/article/details/19981887
(一)
Mat_<uchar>对应的是CV_8U,Mat_<char>对应的是CV_8S,Mat_<int>对应的是CV_32S,Mat_<float>对应的是CV_32F,Mat_<double>对应的是CV_64F,对应的数据深度如下:
• CV_8U - 8-bit unsigned integers ( 0..255 )
• CV_8S - 8-bit signed integers ( -128..127 )
• CV_16U - 16-bit unsigned integers ( 0..65535 )
• CV_16S - 16-bit signed integers ( -32768..32767 )
• CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
• CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
• CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
这里还需要注意一个问题,很多OpenCV的函数支持的数据深度只有8位和32位的,所以要少使用CV_64F,但是vs的编译器又会把float数据自动变成double型,有些不太爽。
还有个需要注意的问题,就是流操作符<<对于Mat的操作,仅限于Mat是2维的情况。
还有必要说一下Mat的存储是逐行的存储的。
(二)
http://3y.uu456.com/bp-8d22071f2afq0242a8qsessa-1.html
OpenCV中CvMat结构详解及相关例子
一、CvMat结构详解
CvMat的定义在OpenCV244\opencv\build\include\opencv2\core\types_c.h 文件中
因为这里我装的OpenCV版本是2.4.4,不同的版本,相应的目录可能不同,由其是对于OpenCV早期版本
对CvMat结构做一些说明:
typedef struct CvMat{int type; //标示元素类型和标记int step; //以字节为单位的行数据长度/* for internal use only */int* refcount;int hdr_refcount;union{uchar* ptr;short* s;int* i;float* fl;double* db;} data; //数据指针#ifdef __cplusplusunion{int rows;int height;};union{int cols;int width;};#elseint rows; //行数(用于保存图像数据时可以理解为图像高度)int cols; //列数(用于保存图像数据时可以理解为图像宽度)#endif}
1.CvMat中type的取值
CvMat中的type成员用于标示元素类型和标记,OpenCV中用一系列的宏定义了可取的元素值
可取以下值:
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
以CV_8UC1为例:
CV_ :OpenCV数据结构前缀
8UC1 :表示8位无符号字符型单通道矩阵
tips:
(1)、关于CvMat的通道数的理解:
可以理解为CvMat的一个矩阵值中包含几个数据,单通道即表示矩阵中的一个值中只有一个数据;
当用CvMat保存彩色图像数据时,可以理解为3通道矩阵,即矩阵中一个值包含R、G、B三个数据
(2)、当CvMat的数据类型为CV_8UC1时,对于数据的访问,需选择CvMat.data.ptr指针
不同的数据类型,访问元素时指针的选择不同。
二、矩阵CvMat的两种声明和初始化方法
1、直接给CvMat赋值,逐点赋值
CvMat* mat = cvCreateMat( 2, 2, CV_64FC1 );
cvZero( mat );
cvmSet( mat, 0, 0, 1 );
cvmSet( mat, 0, 1, 2 );
cvmSet( mat, 1, 0, 3 );
cvmSet( mat, 2, 2, 4 );
cvReleaseMat( &mat );
2、利用现有数组,对CvMat赋值
double a[12] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
CvMat mat = cvMat( 3, 4, CV_64FC1, a );
- OpenCV Mat数据存储格式详解
- opencv的Mat格式数据操作
- opencv存储MAT矩阵中的数据
- Opencv中vector<Mat>数据存储问题
- OpenCV 将Mat数据转成Video格式视频
- opencv中Mat格式的数据点访问at
- MATLAB中将图片数据存储为.mat格式
- opencv Mat详解
- OpenCV Mat类详解
- OpenCV数据结构Mat详解
- OpenCV数据结构Mat详解
- openCV Mat类详解
- OpenCV-Mat结构详解
- opencv Mat详解
- OpenCV数据结构Mat详解
- Mat详解-OpenCV
- OpenCV Mat类详解
- OpenCV中Mat详解
- 使用System.Net.Mail发送邮件时,附件如果是中文名的处理办法
- 我使用过的Linux命令之sftp - 安全文件传输命令行
- 1-11-6 - (2)定义ispalindrome函数(判断输入数据是否回文)
- wget curl
- 第十一周项目6回文 素数(1)
- OpenCV Mat数据存储格式详解
- 第十一周项目一(2)——函数版星号图
- g_Templates表的作用
- Tripleo之nova-compute 和Ironic的代码深入分析(三)
- 第11周项目6(4)-10000以内的所有可逆素数
- Linux系统性能调优之性能分析
- cocos2d-x 3.2 移动游戏背景和精灵
- dijkstra+限制最短路
- 第十一周项目六:回文素数2