摘 要:首先介紹了OpenGL的功能以及利用OpenGL繪圖一般過程和方法,然后介紹了胎心率曲線常見的種類以及合成方法??梢哉鎸嵉啬M胎兒期的心率以及母親的宮縮曲線。不僅可以合成波形而且也可以實現圖形的翻頁、打印、保存等各種功能。分析了在繪圖時出現的圖形閃爍問題,提出利用雙緩存解決繪圖過程中的圖形閃爍問題。關鍵詞: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 引 言
醫(yī)學是一門實踐性極強的學科,一名年輕醫(yī)學生要扎實地把握臨床技能,必須實實在在地反復練習才能完成。如何使學生盡快投入到醫(yī)療活動中,這也是臨床課教師所面臨的嚴峻問題。而醫(yī)學模擬教學具有靈活性、直觀性、良好的可控性和仿真性等特點則可以在一定程度彌補醫(yī)療教學和培訓方面的不足,從而減少醫(yī)療事故和糾紛在臨床實踐中的發(fā)生。
急救教學系統(tǒng)采用目前國際醫(yī)學模擬教學中比較流行的觸覺感知技術,可以逼真地模擬胎兒出生過程,并在此過程中對胎兒的心率和宮縮進行實時監(jiān)控。而胎兒虛擬監(jiān)護儀作為其中很重要的一部分,其上所顯示胎兒心率曲線可以在最大程度上通過視覺直觀地反映出了胎兒在出生過程中的各種突發(fā)情況,起到了醫(yī)學教學和臨床教學的橋梁作用,使受訓者的理論和臨床實踐很好地結合起來,極大地提高受訓者的應變能力和現場處理能力。
1 OpenGL介紹
由于所繪的圖形數據量很大,而且所繪的圖形是動態(tài)的曲線圖,如果用GDI+繪圖工具需占用內存太大,如果機器配置不高的話,很可能造成死機。因此這里采用OpenGL繪圖工具來繪制波形曲線圖。
1.1 OpenGL的功能
OpenGL實際上是一個開放的三維圖形軟件包,它獨立于窗口系統(tǒng)和操作系統(tǒng),以它為基礎開發(fā)的應用程序可以十分方便地在各種平臺間移植;OpenGL可以與Visual C++緊密接口,便于實現機械手的有關計算和圖形算法,可保證算法的正確性和可靠性;OpenGL使用簡便,效率高。它具有七大功能:
(1) 建模: OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數外,還提供了復雜的三維物體(球、錐、多面體、茶壺等)以及復雜曲線和曲面(如Bezier、Nurbs等曲線或曲面)繪制函數。
(2) 變換:OpenGL圖形庫的變換包括基本變換和投影變換?;咀儞Q有平移、旋轉、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變換。其變換方法與機器人運動學中的坐標變換方法完全一致,有利于減少算法的運行時間,提高三維圖形的顯示速度。
(3) 顏色模式設置:OpenGL顏色模式有兩種,即RGBA模式和顏色索引(Color Index)。
(4) 光照和材質設置:OpenGL光有輻射光(Emitted Light)、環(huán)境光(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的反射率相乘后形成的顏色。
(5) 紋理映射(Texture Mapping):利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節(jié)。
(6) 位圖顯示和圖像增強:圖像功能除了基本的拷貝和像素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖像效果處理。以上三條可使被仿真物更具真實感,增強圖形顯示的效果。
(7) 雙緩存(Double Buffering)動畫:雙緩存即前臺緩存和后臺緩存,簡而言之,后臺緩存計算場景、生成畫面,前臺緩存顯示后臺緩存已畫好的畫面。此外,利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等特殊效果。從而實現了消隱算法。
1.2 OpenGL繪圖流程
由于OpenGL的繪圖方式與Windows的一般繪圖方式不同,其主要區(qū)別表現在以下幾個方面:
(1) Windows采用GDI繪圖。
(2) OpenGL采用的是渲染上下文RC(Render Context)繪圖。
(3) OpenGL使用的特殊的像素格式。
在Windows中使用GDI繪圖時必須指定在哪個設備上下文DC(Device Context)中繪制,同樣地,在使用OpenGL函數時也必須指定一個所謂的渲染上下文。正如設備上下文DC要存儲GDI的繪制環(huán)境信息如筆、刷和字體等,渲染上下文RC也必須存儲OpenGL所需的渲染信息如像素格式等。
像素格式決定了像素顏色的設置與DC和RC相關聯的輔助緩存區(qū)像素格式的設置,其內容是OpenGL調用與Windows繪制操作之間的中間轉換設置。因此要在Windows環(huán)境下實現OpenGL的函數功能,就必須設置像素格式。OpenGL for Windows提供了一系列處理像素格式的函數,這些函數為:
ChoosePixelFormat();
SetPixelFormat();
GetPixelFormat();
DescribePixelFormat();
設定像素格式后,下一步工作是產生繪制環(huán)境(RC)并使之成為當前繪制環(huán)境。一般在程序開頭產生一個RC,自始自終都使用它。這與大多數GDI程序不同。在GDI程序中,DC在需要時才產生,并且是畫完后立刻釋放。實際上,RC也可以這樣做,但是要產生一個RC需要很多處理器時間。
因此,要想獲得高性能流暢的圖像和圖形,最好只產生RC一次,并始終用它,直到程序結束。要在OnDestroy()中把繪制環(huán)境刪除。但在刪除RC之前,必須確定它不是當前句柄。通過wglGetCurrentContext()來了解是否存在一個當前繪制環(huán)境,假如存在,那么用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 心電圖紙的繪制
因心電圖是顯示在標準的心電圖紙上,所以首先需要繪制心電圖的格子,由于要在同一張紙上同時繪出胎兒各種心率曲線和宮縮壓力曲線,需用到兩個坐標,因此在繪制心電圖的格子時需要分別繪出。心電圖紙的坐標需要跟著曲線圖一起走,所以也是動態(tài)的。這里用重繪的辦法解決這個問題。由于波形是從右至左運行,所以這里最左面每畫一條線,右面擦掉一條線,然后重繪圖形。這樣繪出來的表格就是動態(tài)的了。
2.2 心電曲線的繪制
2.2.1 胎心率曲線的特點
胎心率曲線圖是一條波動起伏的帶狀曲線,它主要有兩種變化即基線變化和過性變化。
曲線中央是一條假想線,那就是胎心率基線。在無胎動、無宮縮影響時,10 min以上的胎心率的平均值,稱為胎心率基線?;€變化在胎兒心電監(jiān)護中占有最重要的位置,可以從每分鐘心搏次數(bpm)和胎心率變異兩方面對胎心率基線加以估計。這里設置六種類型的胎心率基線,包括無(即一條直線)、減弱、輕度、重度、顯著、呈正弦曲線?;€波動活躍則頻率增高,基線平直則頻率降低或消失,基線擺動表示胎兒有一定的儲備能力,是胎兒健康的表現。胎心率基線變平,提示胎兒的狀況不好。如果基線擺動幅度在25~30 bpm或以上,反應胎兒自主神經系統(tǒng)不平衡,如靜脈循環(huán)受阻,回心血流量減少,可使心率代償性增快,是胎兒窘迫的早期表現。
受宮縮、胎動、觸診及聲響等刺激,胎心率發(fā)生暫時性加快或減慢,持續(xù)十余秒或數十秒后又恢復到基線水平,稱為胎心率-過性變化,是判斷胎兒安危的重要指標。主要包括周期性變化:單向加速、早期減速和晚期加速;變化性變化:輕度、中度和重度;階段性變化:正常、無反應、有,早起加速和晚期減速。
加速:指子宮收縮后胎心率暫時增加15 bpm以上,持續(xù)時間超過15 s,是胎兒良好的表現。加速原因是胎兒軀干或臍靜脈暫時受壓。散發(fā)的、短暫的胎心率加速無害。
減速:指隨宮縮出現的短暫性胎心率減慢。分為3種類型:
早期減速 特點是子宮一收縮,胎心率就下降,子宮收縮停止后,胎心率即恢復正常。下降幅度小于50 bpm,時間短、恢復快。早期減速是宮縮時胎頭受壓,腦血流量一時性減少(無傷害性)的表現,一般在胎兒胎頭在媽媽產道中下降,尤其是子宮頸全開之后容易發(fā)生,對胎兒是不會有影響的。
變異減速 特點是胎心率減速與宮縮沒有固定的關系。一旦出現變異減速,下降迅速且下降幅度大(大于70 bpm),持續(xù)時間長短不一,恢復也迅速。變異減速一般認為是子宮收縮時臍帶受壓興奮迷走神經所致。
晚期減速 特點是胎心率下降的起點常落后于宮縮曲線上升的起點,多在宮縮波峰處開始,胎心率曲線減速的波谷落后于宮縮曲線的波峰,時間差不多在30~60 s,下降幅度小于50 bpm,胎心率回復所需時間較長。晚期減速一般認為是胎兒缺氧的表現,醫(yī)生會給予高度重視。
子宮收縮,臨產時,宮縮每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環(huán)境下構建CMyCreatWave類,用于產生胎心率曲線的波形數據。同時構建CMyWaveDisplay類,用于在屏幕上顯示波形,在CMyWaveDisplay創(chuàng)建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(1)的地方改成InvalidateRect(NULL,FALSE),這樣做是使GDI的重畫命令失效,由OpenGL的命令進行重畫;
(2) 將像素格式定義成支持雙緩存的(即設置時加PFDDOUBLEBUFFER);
(3) 告訴OpenGL在后臺緩存中畫圖,在視類的OnSize()的最后一行加入:glDrawBuffer (GLBACK);
(4) 最后把后臺緩存的內容換到前臺緩存中,在視類的OnPaint()的最后一行加入:CPaintDC dc(this); SwapBuffers(dc.m ps.hdc)。
4 結 語
主要討論了采用胎心率曲線以及宮縮曲線的特點以及采用OpenGL開發(fā)處理圖形軟件的一般過程。討論了采用OpenGL繪圖工具繪制和擬合人體特征曲線的過程,還有在此過程所遇到的屏幕閃爍問題,并提出了用雙緩存解決問的方案。
本文所繪制的出來的曲線能真實的模擬人體的胎心率曲線以及宮縮曲線的變化,而且容易操作,即使一個醫(yī)學初學者也能操作,很大程度上方便了醫(yī)學培訓機構的教學,具有很好的應用價值,市場前景廣闊。
參考文獻
[1]郭兆榮,李菁,王彥.Visual C++ OpenGL應用程序開發(fā)[M].北京:人民郵電出版社,2006.
[2]牛力,傅韻.Visual C++.NET 編程寶典[M].北京:電子工業(yè)出版社,2006.
[3]盧喜烈.現代心電圖大全[M].北京:科學技術文獻出版社,1996.
[4]魏太星.臨床心電圖學及圖譜[M].鄭州:河南科學技術出版社,1992.
[5]黃大顯.現代心電圖學[M].北京:人民軍醫(yī)出版社,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]鄭峰,劉曼芳,許明強.標準心電模擬波形發(fā)生器制作[J].醫(yī)療衛(wèi)生裝備,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]. 北京:北京大學醫(yī)學出版社,2003.