
近日做的程式需要取得字符点阵数据的功能,研究了一下,费了点周折才成功,现将方法总结如下。
取得字符点阵主要用GetGlyphOutline函数:
DWORD
GetGlyphOutline(UINT
nChar,
UINT
nFormat,
LPGLYPHMETRICS
lpgm,
DWORD
cbBuffer,
LPVOID
lpBuffer,
const
MAT2
FAR
lpmat2)他需要类型为GLYPHMETRICS、MAT2的变量;MAT2
结构要手动填充,
GLYPHMETRICS结构则由GetGlyphOutline填充;GLYPHMETRICS包含了点阵数据的一些有用的信息:
typedef
struct
_GLYPHMETRICS
{
UINT
gmBlackBoxX;
//点阵数据轮廓矩形的宽
UINT
gmBlackBoxY;
//点阵数据轮廓矩形的高
POINT
gmptGlyphOrigin;
short
gmCellIncX;
short
gmCellIncY;
}
GLYPHMETRICS,
FAR
LPGLYPHMETRICS;
GetGlyphOutline函数要调用两次,第一次调用将LPVOID
lpBuffer指定为NULL,函数将返回点阵数据需要的缓冲区大小(以字节为单位),将他传给cbBuffer参数,并依此值申请内存,将内存指针传给lpBuffer,再次调用GetGlyphOutline函数,lpBuffer缓冲区将被填充。
CClientDCDC(this);
//获取本字符需要的缓冲区大小
cbBuffer=DCGetGlyphOutline(nChar,GGO_BITMAP,&lpgm,0,NULL,&mat2);
if(cbBuffer
<0
)
return
NULL;
//调用失败将返回负数
//开辟缓冲区
lpvBuffer=new
BYTE[cbBuffer];
//填充字符图像缓冲区lpvBuffer
cbBuffer=DCGetGlyphOutline(nChar,GGO_BITMAP,&lpgm,cbBuffer,lpvBuffer,&mat2);
lpBuffer缓冲区内的数据是DWORD对齐的,即假如取得点阵宽度是12位,只需要三个字节存放一行数据(一个位对应一个点),但实际要占用四个字节;再如,假如点阵宽度是17位,则一行数据占用8个字节。数据的提取方式因应用的不同而不同,再次不再赘述。
注:以上只针对点阵数据提取
搬运自本人 CSDN 博客: 《Opencv中数据结构Mat的相关属性》
以上摘自OpenCV 249的官方文档opencv2refmanpdf。
以前虽然能够比较熟练的使用OpenCV,但是最近感觉其实笔者自己对OpenCV的最底层数据结构Mat与IplImage都不怎么熟悉…… 由于笔者比较反感总是需要管理内存的IplImage,所以对Mat数据结构做一下学习工作还是有必要的。
官方说明文档opencv2refmanpdf中,写出了Mat的定义如下:
下面笔者将从几个方面总结Mat数据结构的主要组成。
参考网址:
《OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 》
《OpenCV Mat的常见属性》
《OpenCV学习笔记(四十)——再谈OpenCV数据结构Mat详解》
参考文档:
《opencv2refmanpdf》
如上面的Mat定义源码,Mat类中有很多重要的数据类型成员。
下面进行简单的列举。
把这四个数据成员放在一起,是因为这四个数据成员相互之间有关系。
数据的存储一直都是个值得关注的问题,所以数据元素存储的位数和范围就十分重要了。depth就体现了每一个像素的位数,即深度。
Mat中包含的图像深度如下所示:
另外还需要注意:大部分OpenCV的函数支持的数据深度只有8位和32位,所以尽量使用CV_64F。
channels表示了矩阵拥有的通道数量,这个比较容易理解:
type表示矩阵中元素的类型(depth)与矩阵的通道个数(channels),可以理解成上面的depth与channels的综合说明。type是一系列预定义的常量,命名规则如下:
<code>CV_+位数+数据类型+通道数</code>
具体有如下值:
表格中,行代表了通道数量channels,列代表了图像深度depth。
例如CV_8UC3,可以拆分为:
注:type一般是在创建Mat对象时设定,若要去的Mat的元素类型,可以不使用type,使用depth。
elemSize表示了矩阵中每一个元素的数据大小,单位是字节。公式如下:
<code>elemSize = channels depth / 8</code>
例如type == CV_16SC3,则elemSize = 3 16 / 8 = 6 Bytes。
elemSize1表示了矩阵元素的一个通道占用的数据大小,单位是字节。公式如下:
<code>elemSize = depth / 8</code>
例如type == CV_16SC3,则elemSize1 = 16 / 8 = 2 Bytes。
使用OpenCV处理图像时,最普遍的处理方式便是遍历图像,即访问所有的图像像素点。但有的算法还需要访问目标像素的邻域,所以这时候就需要了解访问Mat数据元素地址的方式。
假设有矩阵M,则数据元素的地址计算公式如下:
$$ addr(M_{i_{0}, i_{1}, i_{m-1}}) = Mdata + Mstep[0] i_{0} + Mstep[1] i_{1} + + Mstep[Mdims - 1] i_{M_{dims-1}} $$
如果是二维数组,则上述公式就简化成:
$$ addr(M_{i,j}) = Mdata + Mstep[0] i + Mstep[1] j $$
注:式中m = Mdims,即矩阵的维度。
假设存在一个二维矩阵如下图所示:
上面是一个3 × 4的矩阵。此时我们按照数据类型为CV_8U, CV_8UC3的情况,分别对其进行讨论。
首先假设其数据类型为CV_8U,也就是单通道的uchar类型,则可以得出上面的数据成员情况分别为:
若假设其数据类型为CV_8UC3,也就是三通道的uchar类型,则可以得出上面的数据成员情况分别为:
假设存在一个三维矩阵如下图所示:
上面是一个3 × 4 × 6的矩阵。假设其数据类型为CV_16SC4,此时对其进行讨论。
关于OpenCV地址访问方法及效率的部分,请见笔者的博文 《OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法 》 。
121 首先我们得将需要打开的mat文件发到一个文件夹目录中(假设文件夹目录名为‘data’),作为我们将要使用的工作目录,
122 然后打开matlab软件,如下 *** 作,点击这个按钮(“浏览文件夹”),添加存有mat文件的data文件夹,导入文件夹;
123 之后通过matlab左停靠的当前文件夹视图,就可以在预览界面查看mat文件的具体数据和内容;又或者是在命令行窗口编码load命令,直接导入数据集
有时候我们在使用matlab进行运算的时候,想保存和读取mat文件数据,怎么 *** 作呢,下面来分享一下方法
开启分步阅读模式
工具材料:
matlab
保存和读取mat文件数据方法
*** 作方法
01
第一步打开matlab,在命令行窗口中输入a=[1 2 3 4 5 6],按回车键之后,输入save a,将a变量保存在新生成的amat文件,如下图所示:
02
第二步按回车键之后,在当前文件夹中,可以看到新生成的amat文件,需要注意的是在保存数据到mat文件中的时候,可以设置mat文件名,保存的变量,保存的路径,如下图所示:
03
第三步使用“load a”,读取amat文件数据,读取之后,就可以直接使用mat文件里面的a变量,如下图所示:
04
第四步如果我们想保存多个变量到mat文件中,可以通过save('datamat','a','b')的方式,datamat是生成的mat文件名,a和b是存入的变量,
05
第五步使用load('datamat')读取mat文件,读取之后,可以直接使用a和b变量
以上就是关于如何取得字符点阵数据(GetGlyphOutline函数简单应用)麻烦告诉我全部的内容,包括:如何取得字符点阵数据(GetGlyphOutline函数简单应用)麻烦告诉我、Opencv中数据结构Mat的相关属性、.mat文件里的内容怎么查看等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)