Source code for
vl_demo_frame.m
This file is located in the toolbox/demo folder in VLFeat package.
% VL_DEMO_FRAME Demonstrates vl_plotframe and vl_frame2oell %% A standard frame is a unit circle centered at the origin with a % radius pointing in the positive Y direction. Since images use a % left-handed coordinate system (X axis pointing right, Y axis % pointing downwards), the radius will point downwards. A = eye(2) ; T = [0;0] ; figure(1) ; clf ; vl_plotframe([T ; A(:)], 'b', 'linewidth', 5) ; hold on ; % The same frame can be specified as 4 numbers: translation, scale % (unit), and rotation (zero). vl_plotframe([T ; 1 ; 0]) ; axis equal ; set(gca,'ydir','reverse') ; grid on ; vl_figaspect(1) ; vl_demo_print(1, 'frame_standard') ; %% A positive rotation is appears clockwise in the standard image % reference frame. angle = pi/4 ; R = [cos(angle), -sin(angle) ; sin(angle) cos(angle)] ; A = R ; figure(2) ; clf ; vl_plotframe([T ; A(:)], 'b', 'linewidth', 5) ; hold on ; % The same frame can be specified as 4 numbers: translation, scale and % rotation. vl_plotframe([T ; 1 ; angle]) ; axis equal ; set(gca,'ydir','reverse') ; grid on ; vl_figaspect(1) ; vl_demo_print(2, 'frame_rotated') ; %% A more complex example, involving a generic affine % frame. The frame is the result of applying a given affine % transformation to the standard frame. angle = pi/4 ; R = [cos(angle), -sin(angle) ; sin(angle) cos(angle)] ; S = [1 0 ; 0 .5] ; A = R*S*R ; figure(3) ; clf ; vl_plotframe([T ; A(:)], 'b', 'linewidth', 3) ; hold on ; axis equal ; set(gca,'ydir','reverse') ; grid on ; vl_figaspect(1) ; vl_demo_print(3, 'frame_affine') ; %% An oriented ellipse can be easily transformed in an unoriented % one by removing the orientation. The opposite transformation is % possible as well, provided that a conventional orientation is % assigned to it. clear frames1 frames2 ; randn('state',0) ; rand('state',0) ; for i = 1 : 5 % sample a random ellipse angle1 = rand * 2*pi; angle2 = rand * 2*pi; R1 = [cos(angle1), -sin(angle1) ; sin(angle1) cos(angle1)] ; R2 = [cos(angle2), -sin(angle2) ; sin(angle2) cos(angle2)] ; A = 0.3*R1*diag(rand(2,1)+0.5)*R2 ; frames1(:,i) = [i ; 0 ; A(:)] ; % get the unoriented variant of the same ellipse S = A*A' ; frames2(:,i) = [i ; 0 ; S(1,1) ; S(1,2) ; S(2,2)] ; end % Recover oriented ellipses from the unoriented ones; note that % vl_frame2oell assigns all frames an upright orientation. frames3 = vl_frame2oell(frames2) ; frames1(2,:) = 0 ; frames2(2,:) = 1 ; frames3(2,:) = 2 ; figure(4) ; clf ; vl_plotframe(frames1,'r') ; vl_plotframe(frames2,'g') ; vl_plotframe(frames3,'b') ; axis equal tight ; set(gca,'ydir','reverse') ; grid on ; vl_figaspect(5/3) ; vl_demo_print(4, 'frame_frame2oell') ;