2016-04-26 431 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