2016-04-26 163 views
1

我需要在我的C++應用程序中使用OPENGL庫顯示3D圖像(它是一顆心)。我有一些2D切割的心臟圖像。首先,我將這些圖像導入到我的項目中。但我不知道下一步該怎麼做。C++將2D位圖轉換爲3D使用C++和OPENGL庫

這些都是我的圖片

enter image description here

enter image description here

+2

沒有任何深度信息,你就不能將2D圖像變成3D圖像,因爲你錯過了關鍵的第三維。你可以做的最多的是創建一個簡單的立方體與圖像作爲紋理。 –

+0

感謝您的評論。我在圖片中找到區域的邊界(邊緣檢測),將座標放入矢量(X和Y)中,然後爲不同Z軸上的每張圖片繪製GL_points。我創建了一個圖像的骨架,但它不是一個3d對象。 –

+0

接下來,我將它們堆疊....我不認爲我的算法是正確的 –

回答

0

首先要明白,這是其中對OpenGL的新手最重要的一條是:OpenGL剛纔只繪製點,線,三角形和而已。這不是一個神奇的圖形庫。這樣做的缺點是需要一些努力才能獲得結果。好處是,你只受到你的創造力的限制。

現在在你的情況下,你有什麼是斷層圖像(切片圖像)的外觀,它是超聲波圖像。這些圖像實質上是每個位置「密度」的表示並定義了體積數據。 OpenGL本身並不「知道」要做什麼。有一個3D圖像格式,但繪製三角形時,這些將通過這個「切片」。

但是(這是一個很重要的「但是」),你可以給OpenGL程序,稱爲「着色器」,告訴它在哪裏放置它繪製什麼和給它什麼顏色。而且在這個程序中,你可以實現一個音量raycaster,它可以把這種圖像堆棧變成一個很好的視圖。然而,描述如何從零開始實現這樣的射線使用者,將OpenGL的知識歸零到實際的圖片僅僅是在StackOverflow的範圍之外;它只是爲了廣泛。有幾個關於混合質量和結果的教程(一些開源代碼)

給你一個想法:我維護的volume raycaster庫包含大約2500行代碼,以涵蓋各種OpenGL版本配置文件和GPU功能(大多數着色器代碼生成與目標配置文件匹配)。如果將自己限制在一組特定的OpenGL上,它可能需要大約1000行代碼。

+0

非常感謝你的迴應darewolf。我仍然希望我可以使用OpenGl。我還發現了一個簡短的教程,使用該Lib http://www.icare3d.org/codes-and-projects/codes/opengl_geometry_shader_marching_cubes.html ...我會試着去理解它,但是肯定會有其他問題。 –

+0

@AnhNguyen:Marching Cube(或Marching Tetraedra)是一種從密度圖像中提取表面的方法。從經驗中我可以告訴你,對於像你在那裏的圖像來說,這是一種很少產生良好圖像的方法。相反,你應該實現一個直接的體積渲染器(卷光柵器);由此產生的圖像更加美觀,並且在面對類似於您的輸入數據時具有更高的逼真度。下面是一個很好的網頁,介紹如何使用GLSL(OpenGL着色器語言)來實現它:http://www.cabiatl.com/mricro/raycast/ – datenwolf