胎儿心率曲线的合成

时间:2022-10-29 03:04:23

摘 要:首先介绍了OpenGL的功能以及利用OpenGL绘图一般过程和方法,然后介绍了胎心率曲线常见的种类以及合成方法。可以真实地模拟胎儿期的心率以及母亲的宫缩曲线。不仅可以合成波形而且也可以实现图形的翻页、打印、保存等各种功能。分析了在绘图时出现的图形闪烁问题,提出利用双缓存解决绘图过程中的图形闪烁问题。关键词:OpenGL; 双缓存; VC; FHR; UA

中图分类号:TN919; TP274文献标识码:A

文章编号:1004-373X(2010)15-0153-04

Composition of Fetal ECG Waveform Curve

SU Wen-juan, ZHANG Zi-ming, SHI Yuan-zheng, TIAN Da-jun, WU Yan

(College of Electronic Information and Control Engineering, Beijing University of Technology, Beijing 100124, China)

Abstract: OpenGL function and the common drawing techniques & approaches of applying OpenGL are introduced. The common types of fetal heart rate (FHR) curves and the synthesis of the heart analog waveforms of the fetus are described. The fetal ECG waveform curve and the mother's UA curve can be simulated by OpenGL very well. Not only the waveforms can be synthesized, but also the functions such as page turning, printing and picture saving can be implemented with it. The problem of the pattern flicker appearing during drawing was solved with the double-buffering after analysis of the pattern flickering problem.Keywords: OpenGL; double-buffering; VC; FHR; UA

0 引 言

医学是一门实践性极强的学科,一名年轻医学生要扎实地把握临床技能,必须实实在在地反复练习才能完成。如何使学生尽快投入到医疗活动中,这也是临床课教师所面临的严峻问题。而医学模拟教学具有灵活性、直观性、良好的可控性和仿真性等特点则可以在一定程度弥补医疗教学和培训方面的不足,从而减少医疗事故和纠纷在临床实践中的发生。

急救教学系统采用目前国际医学模拟教学中比较流行的触觉感知技术,可以逼真地模拟胎儿出生过程,并在此过程中对胎儿的心率和宫缩进行实时监控。而胎儿虚拟监护仪作为其中很重要的一部分,其上所显示胎儿心率曲线可以在最大程度上通过视觉直观地反映出了胎儿在出生过程中的各种突况,起到了医学教学和临床教学的桥梁作用,使受训者的理论和临床实践很好地结合起来,极大地提高受训者的应变能力和现场处理能力。

1 OpenGL介绍

由于所绘的图形数据量很大,而且所绘的图形是动态的曲线图,如果用GDI+绘图工具需占用内存太大,如果机器配置不高的话,很可能造成死机。因此这里采用OpenGL绘图工具来绘制波形曲线图。

1.1 OpenGL的功能

OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:

(1) 建模: OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面(如Bezier、Nurbs等曲线或曲面)绘制函数。

(2) 变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。其变换方法与机器人运动学中的坐标变换方法完全一致,有利于减少算法的运行时间,提高三维图形的显示速度。

(3) 颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。

(4) 光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。

(5) 纹理映射(Texture Mapping):利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。

(6) 位图显示和图像增强:图像功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图像效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。

(7) 双缓存(Double Buffering)动画:双缓存即前台缓存和后台缓存,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。从而实现了消隐算法。

1.2 OpenGL绘图流程

由于OpenGL的绘图方式与Windows的一般绘图方式不同,其主要区别表现在以下几个方面:

(1) Windows采用GDI绘图。

(2) OpenGL采用的是渲染上下文RC(Render Context)绘图。

(3) OpenGL使用的特殊的像素格式。

在Windows中使用GDI绘图时必须指定在哪个设备上下文DC(Device Context)中绘制,同样地,在使用OpenGL函数时也必须指定一个所谓的渲染上下文。正如设备上下文DC要存储GDI的绘制环境信息如笔、刷和字体等,渲染上下文RC也必须存储OpenGL所需的渲染信息如像素格式等。

像素格式决定了像素颜色的设置与DC和RC相关联的辅助缓存区像素格式的设置,其内容是OpenGL调用与Windows绘制操作之间的中间转换设置。因此要在Windows环境下实现OpenGL的函数功能,就必须设置像素格式。OpenGL for Windows提供了一系列处理像素格式的函数,这些函数为:

ChoosePixelFormat();

SetPixelFormat();

GetPixelFormat();

DescribePixelFormat();

设定像素格式后,下一步工作是产生绘制环境(RC)并使之成为当前绘制环境。一般在程序开头产生一个RC,自始自终都使用它。这与大多数GDI程序不同。在GDI程序中,DC在需要时才产生,并且是画完后立刻释放。实际上,RC也可以这样做,但是要产生一个RC需要很多处理器时间。

因此,要想获得高性能流畅的图像和图形,最好只产生RC一次,并始终用它,直到程序结束。要在OnDestroy()中把绘制环境删除。但在删除RC之前,必须确定它不是当前句柄。通过wglGetCurrentContext()来了解是否存在一个当前绘制环境,假如存在,那么用wglMakeCurrent(NULL,NULL)来把它除去,然后就可以通过wglDelete-Context删除RC。这时允许删除DC才是安全的(注:一般来说,使用的都是单线程的程序,产生的RC就是线程当前的RC,不需要关注上述这一点。但如果使用的是多线程的程序,就特别需要注意这一点,否则会出现意想不到的后果)。设置好即可直接绘制想要的图形。在OpenGL中,所有被定义的点必须放在glBegain() 和glEnd() 两个函数之间才能正确表达一个几何图元或物体。例如,画一条连接(0,0)和(100,100)直线,就可以用:

glBegin(GLLINES);

glVertex2f(0,0);

glVertex2f(100,100);

glEnd();

实现[1]

2 波形曲线的绘制

2.1 心电图纸的绘制

因心电图是显示在标准的心电图纸上,所以首先需要绘制心电图的格子,由于要在同一张纸上同时绘出胎儿各种心率曲线和宫缩压力曲线,需用到两个坐标,因此在绘制心电图的格子时需要分别绘出。心电图纸的坐标需要跟着曲线图一起走,所以也是动态的。这里用重绘的办法解决这个问题。由于波形是从右至左运行,所以这里最左面每画一条线,右面擦掉一条线,然后重绘图形。这样绘出来的表格就是动态的了。

2.2 心电曲线的绘制

2.2.1 胎心率曲线的特点

胎心率曲线图是一条波动起伏的带状曲线,它主要有两种变化即基线变化和过性变化。

曲线中央是一条假想线,那就是胎心率基线。在无胎动、无宫缩影响时,10 min以上的胎心率的平均值,称为胎心率基线。基线变化在胎儿心电监护中占有最重要的位置,可以从每分钟心搏次数(bpm)和胎心率变异两方面对胎心率基线加以估计。这里设置六种类型的胎心率基线,包括无(即一条直线)、减弱、轻度、重度、显著、呈正弦曲线。基线波动活跃则频率增高,基线平直则频率降低或消失,基线摆动表示胎儿有一定的储备能力,是胎儿健康的表现。胎心率基线变平,提示胎儿的状况不好。如果基线摆动幅度在25~30 bpm或以上,反应胎儿自主神经系统不平衡,如静脉循环受阻,回心血流量减少,可使心率代偿性增快,是胎儿窘迫的早期表现。

受宫缩、胎动、触诊及声响等刺激,胎心率发生暂时性加快或减慢,持续十余秒或数十秒后又恢复到基线水平,称为胎心率-过性变化,是判断胎儿安危的重要指标。主要包括周期性变化:单向加速、早期减速和晚期加速;变化性变化:轻度、中度和重度;阶段性变化:正常、无反应、有,早起加速和晚期减速。

加速:指子宫收缩后胎心率暂时增加15 bpm以上,持续时间超过15 s,是胎儿良好的表现。加速原因是胎儿躯干或脐静脉暂时受压。散发的、短暂的胎心率加速无害。

减速:指随宫缩出现的短暂性胎心率减慢。分为3种类型:

早期减速 特点是子宫一收缩,胎心率就下降,子宫收缩停止后,胎心率即恢复正常。下降幅度小于50 bpm,时间短、恢复快。早期减速是宫缩时胎头受压,脑血流量一时性减少(无伤害性)的表现,一般在胎儿胎头在妈妈产道中下降,尤其是子宫颈全开之后容易发生,对胎儿是不会有影响的。

变异减速 特点是胎心率减速与宫缩没有固定的关系。一旦出现变异减速,下降迅速且下降幅度大(大于70 bpm),持续时间长短不一,恢复也迅速。变异减速┮话悛认为是子宫收缩时脐带受压兴奋迷走神经所致。

晚期减速 特点是胎心率下降的起点常落后于宫缩曲线上升的起点,多在宫缩波峰处开始,胎心率曲线减速的波谷落后于宫缩曲线的波峰,时间差不多在30~60 s,下降幅度小于50 bpm,胎心率回复所需时间较长。晚期减速一般认为是胎儿缺氧的表现,医生会给予高度重视。

子宫收缩,临产时,宫缩每10 min少于2次,则代表“宫缩不够”;每10 min多于5次以上,一般是认为宫缩频率太高,有子宫过度刺激的现象;待产妇每10 min有3次的宫缩,是正常的[4]。

2.2.2 曲线的绘制

由于胎心率基线是导入数据库的数据,因为有这些数据,就可以很容易地绘制这些曲线。由于胎儿的心率曲线并不是由单一频率曲线组成,而是由不同频率不同类型的波形拟合而成。这些波形可以分解成简单的正弦波、三角波、锯齿波、方波等。由于胎心率基波的数据是读入数据库的数据,所以再合成胎心率曲线的时候只要把已经合成的波形叠加到基波上即可。而三角波、正弦波等用数学公式就可以算出,例如正弦波公式是y=sin(x);三角波公式是:

y=a*b*x + a,-1/b≤x≤0-a*b*x + a,0≤x≤1/b

在VC 2005环境下构建CMyCreatWave类,用于产生胎心率曲线的波形数据。同时构建CMyWaveDisplay类,用于在屏幕上显示波形,在CMyWaveDisplay创建ReadWaveSourceData(unsigned int nTypeSource) 函数用于读取基波的数据,则得到的波形如┩1,图2所示。

图1 屏幕上显示的胎心率基波曲线图

图2 叠加波形后的胎心率曲线图

对于宫缩压力曲线也采样同样的道理,即导入基波数据,然后在其上叠加其他波形,如图3,图4所示。

图3 宫缩压力曲线图

图4绘制的胎心率曲线和宫缩曲线

由于每页只能绘制6 000个数据,而这里绘制72 000个数据,所以设置了翻页功能,即向前翻页和向后翻页。还可以对正在播放的波形数据进行保存,设置了导入记录和保存记录这两个功能,还可以把正在播放的波形打印出来。

3 绘制波形中遇到的问题

用OpenGL可以很好地绘制出所需要波形,显示效果也比较满意,但也有一个比较严重的问题,就是在波形运行的过程中屏幕会闪烁。

由图4可见,心电模拟波形曲线是显示在心电图纸上,上面布满了密密麻麻的直线,而且这些直线和波形曲线是同步运行的,如果直接这样运行,会明显地感到屏幕的闪烁,。屏幕的闪烁问题,在GDI中解决较为复杂,通过在内存中生成一个内存DC,绘画时让画笔在内存DC中画,画完后一次用Bitblt将内存DC“贴”到显示器上,就可解决闪烁的问题。在OpenGL中是通过双缓存来解决这个问题的。一般来说,双缓存在图形工作软件中是很普遍的。双缓存是两个缓存,一个前台缓存、一个后台缓存。绘图先在后台缓存中画,画完后,交换到前台缓存,这样就不会有闪烁现象了。通过以下步骤可以很容易地解决这个问题:

(1) GDI命令是没有设计双缓存的,首先把使用InvalidateRect(null)的地方改成InvalidateRect(NULL,FALSE),这样做是使GDI的重画命令失效,由OpenGL的命令进行重画;

(2) 将像素格式定义成支持双缓存的(即设置时加PFDDOUBLEBUFFER);

(3) 告诉OpenGL在后台缓存中画图,在视类的OnSize()的最后一行加入:glDrawBuffer (GLBACK);

(4) 最后把后台缓存的内容换到前台缓存中,在视类的OnPaint()的最后一行加入:CPaintDC dc(this); SwapBuffers(dc.m ps.hdc)。

4 结 语

主要讨论了采用胎心率曲线以及宫缩曲线的特点以及采用OpenGL开发处理图形软件的一般过程。讨论了采用OpenGL绘图工具绘制和拟合人体特征曲线的过程,还有在此过程所遇到的屏幕闪烁问题,并提出了用双缓存解决问的方案。

本文所绘制的出来的曲线能真实的模拟人体的胎心率曲线以及宫缩曲线的变化,而且容易操作,即使┮桓霆医学初学者也能操作,很大程度上方便了医学培训机构的教学,具有很好的应用价值,市场前景广阔。

参考文献

[1]郭兆荣,李菁,王彦.Visual C++ OpenGL应用程序开发[M].北京:人民邮电出版社,2006.

[2]牛力,傅韵.Visual C++.NET 编程宝典[M].北京:电子工业出版社,2006.

[3]卢喜烈.现代心电图大全[M].北京:科学技术文献出版社,1996.

[4]魏太星.临床心电图学及图谱[M].郑州:河南科学技术出版社,1992.

[5]黄大显.现代心电图学[M].北京:人民军医出版社,1997.

[6]KALDJIAN L C, WU B J, JEKEL J F, et al. Insertion of femoral vein catheters for practice by medical house officers during cardiopulmonary resuscitation[J].N. Eng. J. Med., 1999, 341:2088-2091.

[7]ROWE R, COHEN R A. An evaluation of a virtual reality airway simulator[J]. Anesthanalg, 2002, 95(1): 62-66.

[8]郑峰,刘曼芳,许明强.标准心电模拟波形发生器制作[J].医疗卫生装备,2003,24(9):45-46.

[9]陆宗骐,金登男.Visual C++.NET图像处理编程[M].北京:清华大学出版社,2006.

[10]GUO Ji-hong, XU Yuan. Atlas and interpretation of new concept ECG[M]. 北京:北京大学医学出版社,2003.

上一篇:基于龙格-库塔算法对降落伞空投的研究 下一篇:智能自动灌溉系统的设计与实现