111

来源:互联网 发布:剑灵角色数据图 编辑:程序博客网 时间:2024/06/14 03:53
function sudokuvideo_fn()%%%%%%%%%% Parameters you need to set: %%%%%%%%%%%%% The initial threshold. Threshold at "bwthresh" times darker than the% median in each block. Use the slider bar to adjust this in real time.blksize = 92;  %blocksize for block processing /% Specify whether to overlay the solution not. 1 or 0. /tracking = 1;% You may need to adjust your video settings here:% Also, if you use RGB instead of YUY2, you *may* need to adjust% lines 14-16 of sudokuvideo_fn_trace.m. I'm not sure, my camera doesn't output RGB.imaqresetobj = videoinput('winvideo',1,'YUY2_640x480');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%try        %Initialize various parameters, and load in the template data    load TEMPLATEDATA    set(obj,'framesperTrigger',10,'TriggerRepeat',Inf);    start(obj);        A_tmin = 30; % Bounds for the digit pixel area    A_tmax = 1000;    digitbox_minarea = 20; % Bounds for the digit bounding box area    digitbox_maxarea = 25^2;        found = 0; % If a solution is FOUND, then start tracking.        % h = The B/W image. h_g = Green box. h_pts = magenta box    h = imshow(zeros(480,640));    hold on;    h_g = plot(90+[0 460 460 0 0],10+[0 0 460 460 0],'g');    h_pts  = [];        Plocal_old = []; % Variable to check the positions and values        same = 0;    samemax = 3; %Consecutive Matches        figure(1);    hslider = uicontrol('style','slider','units','n','pos',[0 0 1 0.05],'min',1.1,'max',1.4,'val',1.3);    uicontrol('style','text','units','n','pos',[0 0.05 0.2 0.03],'String','Threshold adjustment:');        while islogging(obj);                bwthresh = get(hslider,'value');                Icam = getdata(obj,1);        %Icam = imread('sample.bmp'); %<--- For debugging                Icam = Icam(:,:,1);                % I0 represents only the inner green square        I0 = Icam(10+(1:460),90+(1:460));        flushdata(obj);                %Block processed threshhold        makebw2 = @(I) im2bw(I.data,median(double(I.data(:)))/bwthresh/255);        IBW = ~blockproc(I0,[blksize blksize],makebw2);                % Noise reduction and border elimination        IBW = imclose(IBW,[1 1; 1 1]);        I = IBW;        I = bwareaopen(I,A_tmin);        I = imclearborder(I);                % Iout is an augmented 640x480 version of I, for display.        Iout = zeros(480,640);        Iout(10+(1:460),90+(1:460)) = I;                % Show Iout        if ~tracking || ~found            set(h,'Cdata',Iout);        end                R = regionprops(I,'Area','BoundingBox','PixelList');        NR = numel(R);                % Find the largest object -> assume it to be the puzzle outline        maxArea = 0;        for k = 1:NR            A(k) = prod(R(k).BoundingBox(3:4));            if R(k).Area > maxArea                maxArea = R(k).Area;                kmax = k;            end        end        figure(1);        itsok = 0;        if maxArea > 1000 && A(kmax) > 150^2 % Here we find the corners of the box            itsok = 1;            set(h_g,'color','g');            BBmax = R(kmax).BoundingBox;            DIAG1 = sum(R(kmax).PixelList,2);            DIAG2 = diff(R(kmax).PixelList,[],2);                        [m,dUL] = min(DIAG1);            [m,dDR] = max(DIAG1);            [m,dDL] = min(DIAG2);            [m,dUR] = max(DIAG2);            pts = R(kmax).PixelList([dUL dDL dDR dUR dUL],:);            h_pts = plot(90+pts(:,1),10+pts(:,2),'m');                        XYLIMS = [BBmax(1) + [0 BBmax(3)] BBmax(2) + [0 BBmax(4)]];        end                % If we are in tracking mode, have found a solution, and still have a        % bounding quadrilateral to work with, then call the overlay function        if tracking && found && numel(pts) == 10 && polyarea(pts(1:4,1),pts(1:4,2)) > 150^2            sudokuvideo_fn_trace(h,Icam,Iover,pts);            try, delete(h_y); end; h_y = [];            try, delete(h_pts); end; h_pts = [];            continue        end        set(h,'Cdata',Iout);        drawnow;                % If a decent puzzle outline could not be found, then continue        if ~itsok            set(h_g,'color','r');            continue        end                        try, delete(h_y); end; h_y = [];        try, delete(h_pts); end; h_pts = [];        if found, continue; end                h_digitcircles = [];        kgood = zeros(1,NR);        Pnew = zeros(NR,2);        % Now we need to identify those blobs which are nearly digit sized,        % and are inside our puzzle quadrilateral.        for k = 1:NR            if R(k).Area < A_tmax && A(k) > digitbox_minarea && A(k) < digitbox_maxarea ...                    && R(k).BoundingBox(3) < 40 && R(k).BoundingBox(4) < 40 ...                    && R(k).BoundingBox(3) > 2 && R(k).BoundingBox(4) > 2                                Pnew(k,:) = [R(k).BoundingBox(1)+R(k).BoundingBox(3)/2 R(k).BoundingBox(2)+R(k).BoundingBox(4)/2];                                                if inpolygon(Pnew(k,1),Pnew(k,2),pts(:,1),pts(:,2))                    h_digitcircles(k) = plot(90+Pnew(k,1),10+Pnew(k,2),'ro','markersize',24);                    kgood(k) = 1;                else                    h_digitcircles(k) = plot(90+Pnew(k,1),10+Pnew(k,2),'bo','markersize',24);                end                            end        end        [kgoodvals,kgoodlocs] = find(kgood);        Pnew = Pnew(kgoodlocs,:);                % This is where we send the remaining candidate blobs for        % identification:        % Plocal represents the puzzle as an Nx3 matrix: [x, y, digit]        [Plocal,del] = identifynumbers_fun(pts,Pnew,NT,IBW);                % Remove circles from non-digit locations        try            delete(h_digitcircles(kgoodlocs(del)));            h_digitcircles(kgoodlocs(del)) = 0;        catch            keyboard        end        drawnow;        try, delete(nonzeros(h_digitcircles)); end;                % If good numbers were not identified, continue        if isnan(Plocal)            continue        end                % We need to wait until the identified digits are the same for a        % specified number of times consecutively. If so, then call the        % solver        if isequal(Plocal_old, Plocal) && ~isempty(Plocal)            same = same+1;            if same == samemax-1                title([num2str(same+1) ' / ' num2str(samemax)],'FontSize',12);                M = zeros(9);                for k = 1:size(Plocal,1)                    M(Plocal(k,1),Plocal(k,2)) = Plocal(k,3);                end                M = M'                M_sol = drawgraph(M);                figure;                imshow(I0);                % If a solution was found, M_sol is non-empty.                if ~isempty(M_sol)                    if ~tracking, return; end                    found = 1;                    Iover = ~solution2image(M,M_sol); %Make the solution overlay                    figure(1);                else                    same = 0;                end            end        else            same = 0;        end                title([num2str(same+1) ' / ' num2str(samemax)],'FontSize',12);        Plocal_old = Plocal;            endcatch    % This attempts to take care of things when the figure is closed    stop(obj);    imaqreset    %keyboard    figure(1);    imshow(get(h,'cdata'));    drawnow;endfunction Msol = drawsudoku(M)% Basically, show the input M, and solution Msol, in a tableD1 = cell(9);for m = 1:9    for n = 1:9        if M(m,n)            D1{m,n} = M(m,n);        end    endend%Call the sudoku solver, return if it failsMsol = sudoku_solver(M);if isempty(Msol)    returnelse    D2 = num2cell(Msol);endfigure;set(gcf,'units','pixels','Position',[200 200 800 400]);h1 = uitable('Data',D1,'FontSize',16,'ColumnWidth',...    num2cell(repmat(30,1,9)),'columne',false(1,9));set(h1,'units','norm','position',[.05 .05 .4 .9]);h2 = uitable('Data',D2,'FontSize',16,'ColumnWidth',num2cell(repmat(30,1,9)));set(h2,'units','norm','position',[.55 .05 .4 .9]);function [Plocal,del] = identifynumbers_fun(pts,Pnew,NT,IBW)% This function uses the vertices of the puzzle quadrilateral "pts"% to identify which blobs are in digit locations, and then compares those% blobs to template digits for identification% No blobs, quick returnif isempty(Pnew)    Plocal = nan;    del = [];    returnend% Use the vertices to transform the blob coordinatestry    T = cp2tform(pts(1:4,:),[0.5 0.5; 9.5 0.5; 9.5 9.5; 0.5 9.5],'projective');catch    Plocal = nan;    del = [];    returnendPlocal = (tformfwd(T,Pnew));Plocal = round(2*Plocal)/2;% "del" represents those blobs which are not in digit-like locationsdel = find(sum(Plocal - floor(Plocal) > 0 |  Plocal < 1 | Plocal > 9,2)) ;Plocal(del,:) = [];Pnew(del,:) = [];if any(isnan(Plocal(:))) || isempty(Plocal)    Plocal = nan;    del = [];    returnend% The actual identification algorithmtry    Plocal(end,3) = 0;        for k = 1:size(Pnew,1)        for s = [0 -1 1 -2 2 -3 3 -4 4 -5 5]            N = bwselect(IBW,Pnew(k,1) + s ,Pnew(k,2));            if any(N(:))                break            end        end        if s == 5            Plocal = nan;            return            %continue        end                [i,j] = find(N);        N = N(min(i):max(i),min(j):max(j));        N0 = N;                % Resize to be 20x20        N = imresize(N,[20 20]);                %for each digit, S(v) represents the degree of matching        for v = 1:9            S(v) = sum(sum(N.*NT{v}));        end                Plocal(k,3) = find(S == max(S),1);                if (Plocal(k,3) == 5 || Plocal(k,3) == 6) && abs(S(5) - S(6)) < 0.1 %If it's a 5 or 6, use the Euler number            E = regionprops(N,'EulerNumber');            if ~E(1).EulerNumber                Plocal(k,3) = 6;            end        end            endcatch    %keyboardendPlocal = sortrows(Plocal);function mysudokusolver(filename)%% Read in a fileM = dlmread(filename);  %% Show the initial statefigure;set(gcf,'units','pixels','Position',[200 200 800 400]);D1 = cell(9);for m = 1:9    for n = 1:9        if M(m,n)            D1{m,n} = M(m,n);        end    endend%% Call the solver    Msol = sudoku_solver(M);%% Show the solutionif isempty(Msol)    D2 = cell(9);else    D2 = num2cell(Msol);endh1 = uitable('Data',D1,'FontSize',16,'ColumnWidth',...    num2cell(repmat(30,1,9)),'columne',false(1,9));set(h1,'units','norm','position',[.05 .05 .4 .9]);h2 = uitable('Data',D2,'FontSize',16,'ColumnWidth',num2cell(repmat(30,1,9)));set(h2,'units','norm','position',[.55 .05 .4 .9]);%% Read In a File / I_cam = imread('sample.bmp');%赋值imshow(I_cam);%显示sanpleload TEMPLATEDATA%% Crop the Image (1) / hold onh_g = plot(90+[0 460 460 0 0],10+[0 0 460 460 0],'g');%画绿格子hold off%% Crop the Image (2) / 夋憸僼傽僀儖撉傒崬傒I = I_cam(10+(1:460),90+(1:460));imshow(I);%覆盖%% Convert to Black and White / 黑白makebw = @(I) im2bw(I.data,median(double(I.data(:)))/1.2/255);I = ~blockproc(I,[92 92],makebw);imshow(I);%% Remove Noise / 除燥I = bwareaopen(I,30);imshow(I);%% Clear the border / 去边I = imclearborder(I);imshow(I);%% Find the largest box / 堦斣戝偒偄榞傪扵偡hold on;R = regionprops(I,'Area','BoundingBox','PixelList');NR = numel(R);maxArea = 0;for k = 1:NR    A(k) = prod(R(k).BoundingBox(3:4));    if R(k).Area > maxArea        maxArea = R(k).Area;        kmax = k;    endendBBmax = R(kmax).BoundingBox;DIAG1 = sum(R(kmax).PixelList,2);DIAG2 = diff(R(kmax).PixelList,[],2);[m,dUL] = min(DIAG1);    [m,dDR] = max(DIAG1);[m,dDL] = min(DIAG2);    [m,dUR] = max(DIAG2);pts = R(kmax).PixelList([dUL dDL dDR dUR dUL],:);h_pts = plot(pts(:,1),pts(:,2),'m','linewidth',3);XYLIMS = [BBmax(1) + [0 BBmax(3)] BBmax(2) + [0 BBmax(4)]];%% Identify objects inside the box /丂榞撪偺僆僽僕僃僋僩傪扵偡A_tmin = 30; % Bounds for the digit pixel areaA_tmax = 1000;digitbox_minarea = 20; % Bounds for the digit bounding box areadigitbox_maxarea = 25^2;kgood = zeros(1,NR);Pnew = zeros(NR,2);        for k = 1:NR            if R(k).Area < A_tmax && A(k) > digitbox_minarea && A(k) < digitbox_maxarea ...                    && R(k).BoundingBox(3) < 40 && R(k).BoundingBox(4) < 40 ...                    && R(k).BoundingBox(3) > 1 && R(k).BoundingBox(4) > 1                                Pnew(k,:) = [R(k).BoundingBox(1)+R(k).BoundingBox(3)/2 R(k).BoundingBox(2)+R(k).BoundingBox(4)/2];                                                if inpolygon(Pnew(k,1),Pnew(k,2),pts(:,1),pts(:,2))                    h_digitcircles(k) = plot(Pnew(k,1),Pnew(k,2),'ro','markersize',24);                end                            end        end%% Draw the grid based on the corners / 妏偐傜僌儕僢僪傪嶌惉T = cp2tform(pts(1:4,:),0.5 + [0 0; 9 0; 9 9; 0 9],'projective');for n = 0.5 + 0:9, [x,y] = tforminv(T,[n n],[0.5 9.5]); plot(x,y,'g'); endfor n = 0.5 + 0:9, [x,y] = tforminv(T,[0.5 9.5],[n n]); plot(x,y,'g'); end%% Only keep elements in the boxes / 傑偡偵擖偭偰偄傞梫慺偺傒僉乕僾T = cp2tform(pts(1:4,:),[0.5 0.5; 9.5 0.5; 9.5 9.5; 0.5 9.5],'projective');Plocal = (tformfwd(T,Pnew));Plocal = round(2*Plocal)/2;del = find(sum(Plocal - floor(Plocal) > 0 |  Plocal < 1 | Plocal > 9,2)) ;Pnew(del,:) = [];delete(nonzeros(h_digitcircles(del)));%% Show the coordinate transforms / 嵗昗曄姺偺寢壥figure;T = cp2tform(pts(1:4,:),500*[0 0; 1 0; 1 1; 0 1],'projective');IT = imtransform(double(I),T);imshow(IT);%% Show the template data / 僥儞僾儗乕僩僨乕僞傪昞帵figure;for n = 1:9    subplot(3,3,n),imagesc(NT{n});endcolormap gray;%% Calculate the Solution / 僜儕儏乕僔儑儞傪寁嶼偡傞Plocal = identifynumbers_fun(pts,Pnew,NT,I);M = zeros(9);for k = 1:size(Plocal,1)    M(Plocal(k,2),Plocal(k,1)) = Plocal(k,3);endM_sol = drawgraph(M);%% Generate an image from the solution / 僜儕儏乕僔儑儞偐傜夋憸傪嶌惉I = solution2image(M,M_sol);figure; imshow(I);%% Overlay the solution on the original image / 夋憸傪僆乕僶儗僀figure(1); clf;T = cp2tform([1 1; 200 1; 200 200; 1 200],[pts(1:4,1),pts(1:4,2)],'projective');I = imtransform(~I,T,'XData',[1 460], 'YData',[1 460],'XYscale',1);Imask = zeros(480,640);Imask(10 + (1:460), 90+(1:460)) = I;Imask = I_cam .* uint8(~Imask);h = imshow(cat(3,I_cam,Imask,I_cam));set(h,'Cdatamapping','direct');hold on;plot(90 + pts(:,1), 10 + pts(:,2),'m')function D = sudoku_solver(D)onefound = 1;N = 0;poss = 1:9;while onefound    splits = {};    onefound = 0;    for m = 1:9        rowdata = nonzeros(D(m,:)');        for n = 1:9            E = D(m,n);            if E ~= 0, continue, end                        coldata = nonzeros(D(:,n));            blk = [ceil(m/3) ceil(n/3)]-1;            blkdata = nonzeros(D(blk(1)*3+[1:3],blk(2)*3+[1:3]));                        EE = zeros(1,9);            RCB = [rowdata; coldata; blkdata(:)];            EE(RCB) = 1;            Enew = find(~EE);                        if isempty(Enew)                D = []; return;            elseif length(Enew) == 1;                onefound = 1;                D(m,n) = Enew;                rowdata = nonzeros(D(m,:)');            else                splits{end+1} = [m n Enew];            end        end    endendif isempty(splits)    returnendsplitlength = cellfun(@length,splits);splits = splits{find(splitlength == min(splitlength),1)};m = splits(1); n = splits(2);for test = 3:length(splits)    D(m,n) = splits(test);    D0 = sudoku_solver(D);    if ~isempty(D0)        D = D0;        return    endendD = [];I_cam = imread('sample.bmp');imshow(I_cam);load TEMPLATEDATAhold onh_g = plot(90+[0 460 460 0 0],10+[0 0 460 460 0],'g');I = I_cam(10+(1:460),90+(1:460));imshow(I);makebw = @(I) im2bw(I.data,median(double(I.data(:)))/1.2/255);I = ~blockproc(I,[92 92],makebw);imshow(I);I = bwareaopen(I,30);imshow(I);I = imclearborder(I);imshow(I);hold on;R = regionprops(I,'Area','BoundingBox','PixelList');NR = numel(R);maxArea = 0;for k = 1:NR    A(k) = prod(R(k).BoundingBox(3:4));    if R(k).Area > maxArea        maxArea = R(k).Area;        kmax = k;    endendBBmax = R(kmax).BoundingBox;DIAG1 = sum(R(kmax).PixelList,2);DIAG2 = diff(R(kmax).PixelList,[],2);[m,dUL] = min(DIAG1);    [m,dDR] = max(DIAG1);[m,dDL] = min(DIAG2);    [m,dUR] = max(DIAG2);pts = R(kmax).PixelList([dUL dDL dDR dUR dUL],:);h_pts = plot(pts(:,1),pts(:,2),'m','linewidth',3);XYLIMS = [BBmax(1) + [0 BBmax(3)] BBmax(2) + [0 BBmax(4)]];%% Identify objects inside the box /丂榞撪偺僆僽僕僃僋僩傪扵偡A_tmin = 30; % Bounds for the digit pixel areaA_tmax = 1000;digitbox_minarea = 20; % Bounds for the digit bounding box areadigitbox_maxarea = 25^2;kgood = zeros(1,NR);Pnew = zeros(NR,2);        for k = 1:NR            if R(k).Area < A_tmax && A(k) > digitbox_minarea && A(k) < digitbox_maxarea ...                    && R(k).BoundingBox(3) < 40 && R(k).BoundingBox(4) < 40 ...                    && R(k).BoundingBox(3) > 1 && R(k).BoundingBox(4) > 1                                Pnew(k,:) = [R(k).BoundingBox(1)+R(k).BoundingBox(3)/2 R(k).BoundingBox(2)+R(k).BoundingBox(4)/2];                                                if inpolygon(Pnew(k,1),Pnew(k,2),pts(:,1),pts(:,2))                    h_digitcircles(k) = plot(Pnew(k,1),Pnew(k,2),'ro','markersize',24);                end                            end        end%% Draw the grid based on the corners / 妏偐傜僌儕僢僪傪嶌惉T = cp2tform(pts(1:4,:),0.5 + [0 0; 9 0; 9 9; 0 9],'projective');for n = 0.5 + 0:9, [x,y] = tforminv(T,[n n],[0.5 9.5]); plot(x,y,'g'); endfor n = 0.5 + 0:9, [x,y] = tforminv(T,[0.5 9.5],[n n]); plot(x,y,'g'); end%% Only keep elements in the boxes / 傑偡偵擖偭偰偄傞梫慺偺傒僉乕僾T = cp2tform(pts(1:4,:),[0.5 0.5; 9.5 0.5; 9.5 9.5; 0.5 9.5],'projective');Plocal = (tformfwd(T,Pnew));Plocal = round(2*Plocal)/2;del = find(sum(Plocal - floor(Plocal) > 0 |  Plocal < 1 | Plocal > 9,2)) ;Pnew(del,:) = [];I_cam = imread('sample.bmp');imshow(I_cam);load TEMPLATEDATAhold onh_g = plot(90+[0 460 460 0 0],10+[0 0 460 460 0],'g');I = I_cam(10+(1:460),90+(1:460));imshow(I);makebw = @(I) im2bw(I.data,median(double(I.data(:)))/1.2/255);I = ~blockproc(I,[92 92],makebw);imshow(I);I = bwareaopen(I,30);imshow(I);I = imclearborder(I);imshow(I);hold on;R = regionprops(I,'Area','BoundingBox','PixelList');NR = numel(R);maxArea = 0;for k = 1:NR    A(k) = prod(R(k).BoundingBox(3:4));    if R(k).Area > maxArea        maxArea = R(k).Area;        kmax = k;    endendBBmax = R(kmax).BoundingBox;DIAG1 = sum(R(kmax).PixelList,2);DIAG2 = diff(R(kmax).PixelList,[],2);[m,dUL] = min(DIAG1);    [m,dDR] = max(DIAG1);[m,dDL] = min(DIAG2);    [m,dUR] = max(DIAG2);pts = R(kmax).PixelList([dUL dDL dDR dUR dUL],:);h_pts = plot(pts(:,1),pts(:,2),'m','linewidth',3);XYLIMS = [BBmax(1) + [0 BBmax(3)] BBmax(2) + [0 BBmax(4)]];%% Identify objects inside the box /丂榞撪偺僆僽僕僃僋僩傪扵偡A_tmin = 30; % Bounds for the digit pixel areaA_tmax = 1000;digitbox_minarea = 20; % Bounds for the digit bounding box areadigitbox_maxarea = 25^2;kgood = zeros(1,NR);Pnew = zeros(NR,2);        for k = 1:NR            if R(k).Area < A_tmax && A(k) > digitbox_minarea && A(k) < digitbox_maxarea ...                    && R(k).BoundingBox(3) < 40 && R(k).BoundingBox(4) < 40 ...                    && R(k).BoundingBox(3) > 1 && R(k).BoundingBox(4) > 1                                Pnew(k,:) = [R(k).BoundingBox(1)+R(k).BoundingBox(3)/2 R(k).BoundingBox(2)+R(k).BoundingBox(4)/2];                                                if inpolygon(Pnew(k,1),Pnew(k,2),pts(:,1),pts(:,2))                    h_digitcircles(k) = plot(Pnew(k,1),Pnew(k,2),'ro','markersize',24);                end                            end        end%% Draw the grid based on the corners / 妏偐傜僌儕僢僪傪嶌惉T = cp2tform(pts(1:4,:),0.5 + [0 0; 9 0; 9 9; 0 9],'projective');for n = 0.5 + 0:9, [x,y] = tforminv(T,[n n],[0.5 9.5]); plot(x,y,'g'); endfor n = 0.5 + 0:9, [x,y] = tforminv(T,[0.5 9.5],[n n]); plot(x,y,'g'); end%% Only keep elements in the boxes / 傑偡偵擖偭偰偄傞梫慺偺傒僉乕僾T = cp2tform(pts(1:4,:),[0.5 0.5; 9.5 0.5; 9.5 9.5; 0.5 9.5],'projective');Plocal = (tformfwd(T,Pnew));Plocal = round(2*Plocal)/2;del = find(sum(Plocal - floor(Plocal) > 0 |  Plocal < 1 | Plocal > 9,2)) ;Pnew(del,:) = [];clc;clear all;close all;%% 读取图像root='./data';img=read_train(root);%% 提取特征img_feature=feature_lattice(img);%% 构造标签class=10;numberpclass=500;ann_label=zeros(class,numberpclass*class);ann_data=img_feature;for i=1:class for j=numberpclass*(i-1)+1:numberpclass*i     ann_label(i,j)=1; endend%% 选定训练集和测试集k=rand(1,numberpclass*class);  [m,n]=sort(k);  ntraindata=4500;ntestdata=500;train_data=ann_data(:,n(1:ntraindata));test_data=ann_data(:,n(ntraindata+1:numberpclass*class));train_label=ann_label(:,n(1:ntraindata));test_label=ann_label(:,n(ntraindata+1:numberpclass*class));%% BP神经网络创建,训练和测试net=network_train(train_data,train_label);predict_label=network_test(test_data,net);%% 正确率计算[u,v]=find(test_label==1);label=u';error=label-predict_label;accuracy=size(find(error==0),2)/size(label,2)function feature = feature_lattice(img)% 输入:黑底白字的二值图像。输出:35维的网格特征% ======提取特征,转成5*7的特征矢量,把图像中每10*10的点进行划分相加,进行相加成一个点=====%%======即统计每个小区域中图像象素所占百分比作为特征数据====%for i=1:length(img);bw2=im2bw(img{i},graythresh(img{i}));bw_7050=imresize(bw2,[70,50]);for cnt=1:7    for cnt2=1:5        Atemp=sum(bw_7050(((cnt*10-9):(cnt*10)),((cnt2*10-9):(cnt2*10))));%10*10box        lett((cnt-1)*5+cnt2)=sum(Atemp);    endendlett=((100-lett)/100);lett=lett';feature(:,i)=lett;endfunction out = network_test(test_data,net)% 输入:测试数据的特征和真值。输出:测试数据的label以及误差图% BP网络预测an=sim(net,test_data);for i=1:length(test_data)    out(i)=find(an(:,i)==max(an(:,i)));endendfunction net = network_train(train_data,train_label )% 输入:训练图像特征和label。输出:训练好的神经网络% BP网络训练% 初始化网络结构layer=25;net=newff(train_data,train_label,layer);net.trainParam.epochs=1;net.trainParam.lr=0.1;net.trainParam.goal=0.001;net.trainFcn='trainrp';% 网络训练net=train(net,train_data,train_label);endfunction [imglist] = read_train(root)% ni为读取图片张数,n为文件夹数目%========读取文件夹========%out_Files = dir(root);%展开tempind=0;imglist=cell(0);n=length(out_Files);%========读取文件========%for i = 1:n;    if strcmp(out_Files(i).name,'.')|| strcmp(out_Files(i).name,'..')    else        rootpath=strcat(root,'/',out_Files(i).name);        in_filelist=dir(rootpath);        ni=length(in_filelist);        for j=1:ni            if strcmp(in_filelist(j).name,'.')|| strcmp(in_filelist(j).name,'..')|| strcmp(in_filelist(j).name,'Desktop_1.ini')|| strcmp(in_filelist(j).name,'Desktop_2.ini')            else                tempind=tempind+1;                imglist{tempind}=imread(strcat(rootpath,'/',in_filelist(j).name));            end        end    endendend

原创粉丝点击