Запуск моего старого проекта, но на более новой версии Matlab.Ошибки появляются с методом table ().Что-то изменилось? - PullRequest
0 голосов
/ 10 декабря 2018

Это функция lbp созданного мною проекта распознавания выражений лица.Версия Matlab, в которой она была создана в 2013 году. Сейчас я запускаю ее на 2017a.

Вот функция, которую я пытаюсь запустить:

% result = lbp(I) returns the LBP histogram of the image I

function result = lbp(image) 

d_image=double(image);
radius=1;
neighbours=8;
neighbour_points=zeros(neighbours,2);

% Angle step.
a = 2*pi/neighbours;

for i = 1:neighbours
    neighbour_points(i,1) = -radius*sin((i-1)*a);

    neighbour_points(i,2) = radius*cos((i-1)*a);

end

% Determine the dimensions of the input image.
[m1,n1]=size(image);



miny=min(neighbour_points(:,1));

maxy=max(neighbour_points(:,1));

minx=min(neighbour_points(:,2));

maxx=max(neighbour_points(:,2));


blocksizey=ceil(max(maxy,0))-floor(min(miny,0))+1;

blocksizex=ceil(max(maxx,0))-floor(min(minx,0))+1;



% Coordinates of origin (0,0) in the block
origy=1-floor(min(miny,0));

origx=1-floor(min(minx,0));

% Minimum allowed size for the input image depends
% on the radius of the used LBP operator.
if(n1 < blocksizex || m1 < blocksizey)
    error('Small input image. Must be at least (2*radius+1) x (2*radius+1)');
end

% Calculate dx and dy;
dx = n1 - blocksizex;
dy = m1 - blocksizey;

% Fill the center pixel matrix C.
C = image(origy:origy+dy,origx:origx+dx);
%disp(C);    
d_C = double(C);
% Initialize the result matrix with zeros.
result=zeros(dy+1,dx+1);

%Computing the LBP code image

for i = 1:neighbours
    y = neighbour_points(i,1)+origy;

    x = neighbour_points(i,2)+origx;

    % Calculate floors, ceils and rounds for the x and y.
    fy = floor(y); cy = ceil(y); ry = round(y);
    fx = floor(x); cx = ceil(x); rx = round(x);
    % Check if interpolation is needed.
    if (abs(x - rx) < 1e-6) && (abs(y - ry) < 1e-6)
        % Interpolation is not needed, use original datatypes
        N = image(ry:ry+dy,rx:rx+dx);
        D = N >= C;
    else
        % Interpolation needed, use double type images
        ty = y - fy;
        tx = x - fx;        
        % Calculate the interpolation weights.
        w1 = roundn((1 - tx) * (1 - ty),-6);
        w2 = roundn(tx * (1 - ty),-6);
        w3 = roundn((1 - tx) * ty,-6);
        % w4 = roundn(tx * ty,-6) ;
        w4 = roundn(1 - w1 - w2 - w3, -6);        
        % Compute interpolated pixel values
        N = w1*d_image(fy:fy+dy,fx:fx+dx) + w2*d_image(fy:fy+dy,cx:cx+dx) + w3*d_image(cy:cy+dy,fx:fx+dx) + w4*d_image(cy:cy+dy,cx:cx+dx);
        N = roundn(N,-4);
        D = N >= d_C;
    end
    % Update the result matrix.
    v = 2^(i-1);
    result = result + v*D;
    if i==neighbours    

    end
end

load('binvector.mat');
bins = 59;
for i = 1:size(result,1)
    for j = 1:size(result,2)
        result(i,j)=table(result(i,j)+1);
    end
end


% calculating histogram
result=hist(result(:),0:(bins-1));




end

function x = roundn(x, n)
if n<0
    p=10 ^ -n;
    x=round(p*x)/p;
elseif n>0
    p=10^n;
    x=p*round(x/p);
else
    x=round(x);
end
end

А вотошибка, которая выскочила:

Error using tabular/double (line 148)
Undefined function 'double' for input arguments of type 'table'. To convert to numeric, use the TABLE2ARRAY function, or
extract data using dot or brace subscripting.

Error in lbp (line 104)
        result(i,j)=table(result(i,j)+1);

Я давно не касался Matlab, и поэтому не уверен, как с этим справиться, или каким будет подходящий метод замены.Любой вклад будет оценен.

...