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
阅读全文
0 0
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- 111
- sql日期
- JVM垃圾回收CMS
- android使用xml自定义button样式
- 经验总结-完整介绍Android Studio中Git的使用之.gitignore和README文件的说明(五)
- Presto学习-presto介绍
- 111
- HDU
- android添加后门的一种方法
- CharSequence接口在方法定义中的应用
- 算法:从键盘输入一定金额(以元为单位,如345.78),然后显示支付该金额的各人民币数量
- 工具类_js移动端时间戳转日期格式-将一个时间转换成x小时前、y天前
- A*(也叫A star, A星)寻路算法-Java版
- android中src和background区别
- 广度优先生成树