我正在尝试拍摄3D模型的“图像”。我可以通过this代码加载STL文件。我需要做的是能够旋转对象,并在旋转时拍摄它的“图像”。
stlread输出与patch()兼容的face和vertex结构,因此我可以显示该对象,但我不确定如何将该图像实际存储到矩阵中。
答案 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在打开时看起来像这样:
然后旋转物体/股骨后:
最后按下按钮后,拍摄快照(即执行getframe
)并将结果图像矩阵显示在新图中:
请注意,我使用imshow
来实际显示图像,但也可以操作数据。
此外,如果您想要检索与您的数据相关联的色彩映射表,您还可以使用getframe
的以下调用语法:
F = getframe;
[X,map] = frame2im(F);
在这种情况下,X
在使用此代码时将等同于G:
G = F.cdata;
最后,您可以设置一个循环,在该循环中,实际的补丁对象会自动旋转,并自动获取帧。这不应该太难实现:)
希望有所帮助!