如何取得字符点阵数据(GetGlyphOutline函数简单应用)麻烦告诉我

如何取得字符点阵数据(GetGlyphOutline函数简单应用)麻烦告诉我,第1张

近日做的程式需要取得字符点阵数据的功能,研究了一下,费了点周折才成功,现将方法总结如下。

取得字符点阵主要用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文件里的内容怎么查看等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9683567.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存