使用STLRead拍摄3D模型的图像

时间:2015-02-13 00:32:51

标签: matlab render

我正在尝试拍摄3D模型的“图像”。我可以通过this代码加载STL文件。我需要做的是能够旋转对象,并在旋转时拍摄它的“图像”。

stlread输出与patch()兼容的face和vertex结构,因此我可以显示该对象,但我不确定如何将该图像实际存储到矩阵中。

1 个答案:

答案 0 :(得分:0)

我认为你所追求的是函数getframe,它捕获轴的内容并将数据存储为常规的“图像”矩阵。

我制作了一个简单的GUI来说明这个概念。基本上,我从您提供的链接(stldemo.m)中获取了代码,并添加了一些功能来拍摄快照。在这种情况下,我添加了命令rotate3d on来旋转轴内的股骨和一个按钮,其回调调用getframe并捕获轴的内容。基本上你可以根据需要旋转股骨//补丁对象,然后按下按钮获取快照。在代码中我弹出一个新的图形来说服你它可以工作,但你当然可以用数据做任何你想做的事情。

请注意,使用getframe会输出一个名为cdata的字段的结构...这就是您所追求的内容,以便将轴的内容作为矩阵。

所以这里是代码和一些快照来说明:

function SnapShotSTL(~)
%// Taken from the stldemo.m file.
%% 3D Model Demo
% This is short demo that loads and renders a 3D model of a human femur. It
% showcases some of MATLAB's advanced graphics features, including lighting and
% specular reflectance.

% Copyright 2011 The MathWorks, Inc.


%% Load STL mesh
% Stereolithography (STL) files are a common format for storing mesh data. STL
% meshes are simply a collection of triangular faces. This type of model is very
% suitable for use with MATLAB's PATCH graphics object.

% Import an STL mesh, returning a PATCH-compatible face-vertex structure
handles.fv = stlread('femur.stl');


%% Render
% The model is rendered with a PATCH graphics object. We also add some dynamic
% lighting, and adjust the material properties to change the specular
% highlighting.


%// Create figure, axes and a pushbutton.
hFigure = figure('Units','Pixels','Position',[200 200 500 600]);
hAxes1 = axes('Units','pixels','Position',[50 50 450 400]);
hSnapShot = uicontrol('Style','push','Position',[50 500 60 30],'String','SnapShot','Callback',@(s,e) GetSnapshot);

patch(handles.fv,'FaceColor',       [0.8 0.8 1.0], ...
         'EdgeColor',       'none',        ...
         'FaceLighting',    'gouraud',     ...
         'AmbientStrength', 0.15);

% Add a camera light, and tone down the specular highlighting
camlight('headlight');
material('dull');

% Fix the axes scaling, and set a nice view angle
axis('image');
view([-135 35]);

rotate3d on %// Enable to rotate the object in the axes

guidata(hFigure,handles);

    function GetSnapshot

        CurrentImage = getframe(gca);

        ImageData = CurrentImage.cdata; %// Access the data. I create a variable but that's not strictly necessary.

%// Here a new figure is created and the image displayed in it... you can store it and do as you like with it.
        figure;

        imshow(ImageData);

        guidata(hFigure,handles);

    end

end

因此GUI在打开时看起来像这样:

enter image description here

然后旋转物体/股骨后:

enter image description here

最后按下按钮后,拍摄快照(即执行getframe)并将结果图像矩阵显示在新图中:

enter image description here

请注意,我使用imshow来实际显示图像,但也可以操作数据。

此外,如果您想要检索与您的数据相关联的色彩映射表,您还可以使用getframe的以下调用语法:

F = getframe;
[X,map] = frame2im(F);

在这种情况下,X在使用此代码时将等同于G:

G = F.cdata;

最后,您可以设置一个循环,在该循环中,实际的补丁对象会自动旋转,并自动获取帧。这不应该太难实现:)

希望有所帮助!