opencv Mat 理解(1)
来源:互联网 发布:linux gpt分区格式化 编辑:程序博客网 时间:2024/05/16 08:48
对Mat和.bmp文件在内存中的存在状态弄不清楚。
Mat A = imread("a.bmp");Mat B = A;以上代码执行的结构是不是这样的:?
图1
先看 BMP图像文件。
BMP位图文件格式是Windows系统交换图像数据的一种标准图像文件存储格式。BMP位图文件由4个部分组成:位图头文件(Bitmap-file Header)、位图信息头(Bitmap-information Header)、调色板(Palette)和像素数据(Image Data),如图2所示。
图2
用a.bmp测试一下。
#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#pragma pack(2) /*定义WORD为两个字节的类型*/typedef unsigned short WORD;/*定义DWORD为e四个字节的类型*/typedef unsigned long DWORD; /*位图文件头*/typedef struct BMP_FILE_HEADER{ WORD bType; /* 文件的类型 */ DWORD bSize; /* 文件的大小,以字节为单位 */ WORD bReserved1; /* 保留值,设置为0 */ WORD bReserved2; /* 保留值,设置为0 */ DWORD bOffset; /* 文件头的begin到实际图像数据位开始的偏移量 */} BMPFILEHEADER; /* 固定大小14个字节 */ /*位图信息头*/typedef struct BMP_INFO{ DWORD bInfoSize; /* 信息头的大小 */ DWORD bWidth; /* 图像的宽度(以像素为单位)*/ DWORD bHeight; /* 图像的高度(以像素为单位)*/ WORD bPlanes; /* 目标设备位平面数 */ WORD bBitCount; /* 每个像素的位数 */ DWORD bCompression; /* 压缩类型 */ DWORD bmpImageSize; /* 压缩图像的大小,以字节为单位,非压缩图像为0 */ DWORD bXPelsPerMeter; /* 水平分辨率 */ DWORD bYPelsPerMeter; /* 垂直分辨率 */ DWORD bClrUsed; /* 使用的色彩数 */ DWORD bClrImportant; /* 重要的颜色数,0表示都重要 */} BMPINF; /* a.bmp:这部分有40个字节 */ /*彩色表*/typedef struct RGB_QUAD { WORD rgbBlue; /* 蓝色强度 */ WORD rgbGreen; /* 绿色强度 */ WORD rgbRed; /* 红色强度 */ WORD rgbReversed; /* 保留值 */} RGBQUAD; /* bmp图没有这部分 */ int main(){ FILE *fp; BMPFILEHEADER fileHeader; BMPINF infoHeader; long offset, bmpImageSize, width, height, bytesPerPixel, size, bitCount; WORD c; if((fp = fopen("a.bmp", "rb")) == NULL) { printf("Cann't open the file!\n"); exit(0); } fseek(fp, 0, 0); fread(&fileHeader, sizeof(fileHeader), 1, fp); fread(&infoHeader, sizeof(infoHeader), 1, fp); //printf("%d %d %d %d %d %d %d\n", size, offset, bmpImageSize, width, height, bitCount, bytesPerPixel); printf("%d\n", fileHeader.bSize); printf("%d\n", fileHeader.bOffset); printf("%d\n", infoHeader.bInfoSize); printf("%d\n", infoHeader.bCompression); printf("%d\n", infoHeader.bWidth); printf("%d\n", infoHeader.bHeight); printf("%d\n", infoHeader.bBitCount);}a.bmp是一个真彩色图,输出信息:
fileHeader.bSize = 3932214
fileHeader.bOffset = 54
infoHeader.bInfoSize = 40
infoHeader.bCompression = 0
infoHeader.bWidth = 1280
infoHeader.bHeight = 1024
infoHeader.bBitCount = 24
这些数据的关系是:3932214 = 1280*1024*3+54;
文件头的大小是固定的:14个字节;a.bmp的信息头大小是40个字节,加起来正好是54,即文件头到实际数据的偏移量;实际像素数据的大小是1280*1024*3(rows*cols*channel)。a.bmp是真彩色图,所以没有调色板。
再看Mat。
基本上讲Mat 是一个类,由两部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指针,指向存储所有像素值的矩阵。(这里有困惑,指向BMP文件头还是指向实际像素数据部分第一个数据的地址?C语言基础不好啊)。
关于Mat属性,我参考了这篇博客,非常好的图。点击打开链接 http://ggicci.blog.163.com/blog/static/210364096201261052543349/
下面两张图是该博客中的内容:
图3 二维Mat
图4 三维Mat
现在的问题是,a.bmp被入读到Mat A 中以后是要按照Mat的格式重新分配空间了吗?如何分配?带着矩阵头一起吗?
- opencv Mat 理解(1)
- Opencv Mat理解
- openCV(1)-Mat初始化
- Opencv学习笔记-----理解Mat
- opencv学习笔记(1)Mat
- opencv 学习记录(1)Mat IpImage
- opencv入门(Mat)
- opencv(C++) Mat
- opencv之Mat 类赋值的理解
- (转)OpenCV中的Mat
- opencv学习笔记(1)--深度解析Mat
- openCV学习笔记(6):Mat类/数据结构详解(1)
- OpenCV与Pylon相机(1):简单Mat
- 重新学习2.0以上OPENCV(基于MAT类型)1
- OpenCV Mat
- opencv-Mat
- Mat--opencv
- opencv---mat
- Android工作杂项总结(APN,3G,i2c,SystemUI等)
- Opengl编程指南第二章:状态管理、几何绘图
- AngularJS指令开发(1)——参数详解
- 2016/5/12
- lightoj1224 DNA Prefix
- opencv Mat 理解(1)
- MySQL中的if和case语句使用总结
- 原生的SlidingMeum侧滑
- 第十二周上机实践项目-阅读程序-4
- 代码阅读工具:Source Navigator和Source Insight
- FZU2232(二分图)
- 数字货币到底解决了哪些问题?
- E - Super Jumping! Jumping! Jumping!——HOJ
- Android 多线程的基本使用