Error using accumarraySecond input VAL must be a vector with one element for each row in SUBS, or a scalar.
Error in descriptFPoints (line 160) DescriptVector = accumarray( AngleBinsShifted, SubPatch_norm(IndexMaskOfBlocks), [ NOfBins*NOfWindows^2, 1 ] ); My code segment is given below:
for i = 1:N %---------------- Data of feature point ---------------%
Scale = HrLOrntPoints(i,3); MainOrient = deg2rad(HrLOrntPoints(i,6)); row0 = HrLOrntPoints(i,4); clmn0 = HrLOrntPoints(i,5); Step = StepSampleFunction( Scale ); %-------------- Neighborhood in new coord -------------%
% new coordinates received from old ones by rotation, and shift by [ row0, clmn0 ]
mx = max( ceil(2*NOfWindows*Step), round(3*Scale) + 1 ); ind = -mx:mx; % pay attention, that coordinates are taken in column-major order, so
% assignments below of Patch is consistent
[ Clmn, Row ] = meshgrid( ind, ind ); % tmp2 need to be >= 4*NOfWindows, in order to descript point after
% mx, that was choosen before, provide this
tmp2 = 2*mx + 1; tmp = tmp2^2; Coord_new = zeros( tmp, 2 ); Coord_new( :, 2 ) = Row(:); Coord_new( :, 1 ) = Clmn(:); Coord_new = Coord_new'; %------ Converting coordinates to original form -------%
Rotation = [ cos(MainOrient) -sin(MainOrient); sin(MainOrient) cos(MainOrient) ]; % Coord_orig(1,:) - column coord, that correspond to Coord_new( 1, : ).
% Coord_orig(2,:) - rows ...
Coord_orig = round( (Rotation)*Coord_new + repmat( [ clmn0 row0 ]', 1, tmp ) ); %---------- Converting to linear indexes -------------%
IndOfRotatedPatch = sub2ind( [ Nrow, Nclmn ], Coord_orig( 2,: )', Coord_orig( 1,: )' ); %---------- Assigning values to the patch -------------%
Patch = zeros( tmp2 ); Patch(:) = img( IndOfRotatedPatch ); %------------------ Derivative mask -------------------%
ind = -round(3*Scale):round(3*Scale); [ X, Y ] = meshgrid( ind, ind ); dGdx = -X .* exp(-( X.*X + Y.*Y )/(2*Scale*Scale)) ./ ((Scale^4)*(2*pi)); dGdy = -Y .* exp(-( X.*X + Y.*Y )/(2*Scale*Scale)) ./ ((Scale^4)*(2*pi)); %----------------- Window derivatives -----------------%
% also possible to do convolution, cause gaussian symmetric
Patchx = imfilter(Patch, dGdx, 'same'); Patchy = imfilter(Patch, dGdy, 'same'); %----------------- Norm of gradients ------------------%
gradient_norm = sqrt(Patchx.^2 + Patchy.^2); %------------- Avaraging norm gradients --------------%
g = fspecial('gaussian',max(1,fix( 6*Scale*Factor )), Scale*Factor); gradient_norm = imfilter(gradient_norm, g, 'same'); %----------------- Angles of gradients ----------------%
gradient_angles = rad2deg( atan2( Patchy, Patchx ) + pi ); %--------- Taking sub-window for description ----------%
% I'm taking 'center pixel'( Feature point, with coordinates [ row0, clmn0 ] in image ) to be in
% new/sub-patch coordinates at [ p, p ]
% p = round(tmp2/2)
p = mx + 1; % so I'll have patches of size 4*NOfWindows x 4*NOfWindows
SubPatch_norm = gradient_norm( max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step) ), 1), max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step)), 1) ); SubPatch_angles = gradient_angles( max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step) ), 1), max(round( (p - ( 2*NOfWindows )*Step):Step:(p + ( 2*NOfWindows -1 )*Step)), 1) ); %-------------- Assigning angles 2 bins ---------------%
[tmp, AngleBins] = histc( SubPatch_angles(IndexMaskOfBlocks), Edges4Hist ); %---------------- Shifting angle bins -----------------%
AngleBinsShifted = AngleBins + IndexShiftBins4Accum; %-------- Accumulating norms 2 according bins ---------%
DescriptVector = accumarray(AngleBinsShifted, SubPatch_norm(IndexMaskOfBlocks), [ NOfBins*NOfWindows^2, 1 ] ); DescriptVector = min( DescriptVector/norm(DescriptVector), Thresh ); DescriptVector = DescriptVector/norm(DescriptVector); %---------------- Assign values 2 matrix --------------%
DescriptFPVector( i, : ) = (DescriptVector)'; % if strcmp( SwitchWaitbars, 'on' )
% waitbar(i/N)
% end
end
Best Answer