gusucode.com > vision工具箱matlab源码程序 > vision/+vision/+internal/+pc/validateAndParseInputsXYZC.m

    function [X, Y, Z, C] = validateAndParseInputsXYZC(filename, varargin)
% Validate and parse points and colors

if isa(varargin{1}, 'pointCloud')
    % Retrieve the regular parameters
    ptCloud = varargin{1};
    xyzPoints = ptCloud.Location;
    C = ptCloud.Color;
else
    if ismatrix(varargin{1})
        xyzPoints = varargin{1};
        validateattributes(xyzPoints,{'numeric'}, {'real','ncols',3},filename,'xyzPoints');
    else
        xyzPoints = varargin{1};
        validateattributes(xyzPoints,{'numeric'}, {'real','size',[NaN,NaN,3]},filename,'xyzPoints');    
    end
    
    if nargin - 1 > 1
        C = varargin{2};
        validateattributes(C,{'numeric', 'char'}, {'nonempty','nonsparse','real'});
    else
        C = [];
    end
    
    % Check the color input
    if ~isempty(C)
        if ischar(C)
            validateattributes(C,{'char'}, {'nonempty'}, filename, 'C', 2);
        elseif numel(C) == 3
            validateattributes(C,{'numeric'}, {'real','ncols',3}, filename, 'C', 2);
        else
            if ismatrix(xyzPoints)
                if isvector(C)
                    validateattributes(C,{'numeric'}, {'real'}, filename, 'C', 2);
                    if numel(C) ~= size(xyzPoints,1)
                        error(message('vision:pointcloud:unmatchedXYZC'));
                    end
                else
                    validateattributes(C,{'numeric'}, {'real','size',[NaN,3]}, filename, 'C', 2);
                    if size(C, 1) ~= size(xyzPoints, 1)
                        error(message('vision:pointcloud:unmatchedXYZC'));
                    end
                end
            else
                if ismatrix(C)
                    validateattributes(C,{'numeric'}, {'real'}, filename, 'C', 2);
                else
                    validateattributes(C,{'numeric'}, {'real','size',[NaN,NaN,3]}, filename, 'C', 2);
                end
                if (size(C, 1) ~= size(xyzPoints, 1) || size(C, 2) ~= size(xyzPoints, 2))
                    error(message('vision:pointcloud:unmatchedXYZC'));
                end
            end
        end
    end
    
end

if ismatrix(xyzPoints)
    X = xyzPoints(:, 1);
    Y = xyzPoints(:, 2);
    Z = xyzPoints(:, 3);
else
    X = reshape(xyzPoints(:,:,1), [], 1);
    Y = reshape(xyzPoints(:,:,2), [], 1);
    Z = reshape(xyzPoints(:,:,3), [], 1);
    if ndims(C) == 3
        C = reshape(C, [], 3);
    elseif ~isvector(C)
        C = C(:);
    end
end

% Convert to double precision, rescaling the data if necessary
if (size(C, 2) == 3 && isnumeric(C))
    C = im2double(C);
end

end