transform_to_motionpatch_together.m 6.15 KB

%missing file delete
%LOCATION : raw skeletone files
path_name = '/media/rfj/EEA4441FA443E923/nturgb_skeletones/';
file_list = dir(path_name);
L = length(file_list);

fileID = fopen('/home/rfj/MATLAB/bin/samples_with_missing_skeletons.txt','r');
formatSpec = '%s';
sizeA = [20 Inf];   
missing_file_list = fscanf(fileID,formatSpec,sizeA);
missing_file_list = missing_file_list.';
fclose(fileID);

perfect_list = [];

for K = 3:L
    file_name = char(file_list(K).name);
    missing_num = 0;

    for J = 1:length(missing_file_list);
        missing_name = missing_file_list(J,:);
        if file_name(1:20) == missing_name
            missing_num = 1;
        end
    end
    
    if missing_num == 0
        perfect_list = [perfect_list;file_name];
    end
    
end

% make motion patch

L = length(perfect_list);

for K = 1:L
    file_name = char(perfect_list(K,:));
    name = strcat(path_name,file_name(1:20),'.skeleton');
    num_body = file_name(22);
    BN = str2num(num_body);
    [token,remainder] = strtok(file_name,'A');
    class = str2num(remainder(2:4));
        
    if class == 20 
        bodyinfo = read_skeleton_file(name);
        frame_num = size(bodyinfo,2);
        
        %initialize
        cur_subject_x = zeros(frame_num, 25);
        cur_subject_y = zeros(frame_num, 25);
        cur_subject_z = zeros(frame_num, 25);
        
        tot_x = zeros(frame_num,25);
        tot_y = zeros(frame_num,25);
        tot_z = zeros(frame_num,25);
        
        joint_5 = zeros(1,3);
        joint_9 = zeros(1,3);
        joint_1 = zeros(1,3);
        joint_3 = zeros(1,3);
            
        try
            %get total joints information
            for FN = 1:frame_num
                cur_body = bodyinfo(FN).bodies(1);
                joints = cur_body.joints;
                
                for JN = 1:25
                    tot_x(FN,JN) = joints(JN).x;
                    tot_y(FN,JN) = joints(JN).y;
                    tot_z(FN,JN) = joints(JN).z;
                end
            end
            
            %get median values
            M_x = median(tot_x);
            M_y = median(tot_y);
            M_z = median(tot_z);
            
            
            %set 3 points for make plane
            joint_5 = [M_x(5) M_y(5) M_z(5)];
            joint_9 = [M_x(9) M_y(9) M_z(9)];
            joint_1 = [M_x(1) M_y(1) M_z(1)];
            joint_3 = [M_x(3) M_y(3) M_z(3)];
            
            %find RIGID TRNASFORMATION matrix
            d1 = joint_1 - joint_5;
            d2 = joint_1 - joint_9;
            n1 = cross(d1,d2); % because we will parallel transform, don't need to find belly
            u1 = n1/norm(n1);
            u2 = [0 0 1];
            cs1 = dot(u1,u2)/norm(u1)*norm(u2);
            ss1 = sqrt(1-cs1.^2);
            v1 = cross(u1,u2)/norm(cross(u1,u2));
            
            R1 = [v1(1)*v1(1)*(1-cs1)+cs1 v1(1)*v1(2)*(1-cs1)-v1(3)*ss1 v1(1)*v1(3)*(1-cs1)+v1(2)*ss1];
            R1(2,:) = [v1(1)*v1(2)*(1-cs1)+v1(3)*ss1 v1(2)*v1(2)*(1-cs1)+cs1 v1(2)*v1(3)*(1-cs1)-v1(1)*ss1];
            R1(3,:) = [v1(1)*v1(3)*(1-cs1)-v1(2)*ss1 v1(2)*v1(3)*(1-cs1)+v1(1)*ss1 v1(3)*v1(3)*(1-cs1)+cs1];
            
            %1-3 number tolls to parallel x axis. Rigid transformation on plane surface
            %Z axis coords oyler angle transform
            
            t = joint_3 - joint_1;
            d3 = R1(1,:) * t.';
            d3(1,2) = R1(2,:) * t.';
            d3(1,3) = R1(3,:) * t.';
            
            u3 = d3(1:2)/norm(d3(1:2));
            v3 = [u3(1) -u3(2)];
            v3(2,:) = [u3(2) u3(1)];
            u4 = [1 0].';
            
            csss = v3\u4;
            cs2 = csss(1);
            ss2 = csss(2);
            
            R2 = [cs2 -ss2 0];
            R2(2,:) = [ss2 cs2 0];
            R2(3,:) = [0 0 1];
            
            
            %apply rigid transformation
            for FN = 1:frame_num
                cur_body = bodyinfo(FN).bodies(1);
                joints = cur_body.joints;
                
                for JN = 1:25
                    a = R1(1,:) * [joints(JN).x joints(JN).y joints(JN).z].';
                    b = R1(2,:) * [joints(JN).x joints(JN).y joints(JN).z].';
                    c = R1(3,:) * [joints(JN).x joints(JN).y joints(JN).z].';
                    
                    cur_subject_x(FN,JN) = R2(1,:) * [a b c].';
                    cur_subject_y(FN,JN) = R2(2,:) * [a b c].';
                    cur_subject_z(FN,JN) = R2(3,:) * [a b c].';
                    
                end
            end
            
            %orientation normalize 2 (with plane surface)
            if cur_subject_x(1,4) < cur_subject_x(1,1)
                cur_subject_x = 0 - cur_subject_x;
            end
            
            if cur_subject_y(1,9) > cur_subject_y(1,5)
                cur_subject_y = 0 - cur_subject_y;
            end
            
            %get current median
            CM_x=median(cur_subject_x);
            CM_y=median(cur_subject_y);
            CM_z=median(cur_subject_z);
            
            %for transform bellybutton to 0.5,0.5 (Except X) but it doesn't work
            belly_button = 0.5 - CM_y(2);
            belly_button(2) = 0.5 - CM_z(2);
            
            % normalize with x... <- HERE! WANT TO PARALLEL TRANSFORM
            ... but if I plus belly_button for x and y axis , it dosn't work
                cur_subject_x = cur_subject_x - min(cur_subject_x(:));
            max_tall = max(cur_subject_x(:));
            cur_subject_x = cur_subject_x ./ max_tall;
            
            cur_subject_y = cur_subject_y - min(cur_subject_y(:));
            cur_subject_y = cur_subject_y ./ max_tall;
            
            cur_subject_z = cur_subject_z - min(cur_subject_z(:));
            cur_subject_z = cur_subject_z ./ max_tall;
            
            
            % 이미지 저장
            motionpatch = cur_subject_x;
            motionpatch(:,:,2) = cur_subject_y;
            motionpatch(:,:,3) = cur_subject_z;
            

            new_file_name = strcat('/home/rfj/바탕화면/motionpatch/',num2str(class),'/',file_name(1:20),'.png');
            imwrite(motionpatch,new_file_name);
            
        catch
            name
        end
        
    end


    
end