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

    classdef cascadeClassifierBuildable < coder.ExternalDependency %#codegen
    %CASCADECLASSIFIERBUILDABLE - encapsulate cascadeClassifier implementation library
    
    % Copyright 2013 The MathWorks, Inc.    
    
    methods (Static)
        
        function name = getDescriptiveName(~)
            name = 'vision.CascadeObjectDetector';
        end
        
        function b = isSupportedContext(~)
            b = true; % supports non-host target
        end
        
        function updateBuildInfo(buildInfo, context)
            buildInfo.addIncludePaths({fullfile(matlabroot,'toolbox', ...
                'vision','builtins','src','ocv','include'), ...
                fullfile(matlabroot,'toolbox', ...
                'vision','builtins','src','ocvcg', 'opencv', 'include')} );

            buildInfo.addSourcePaths({fullfile(matlabroot,'toolbox', ...
                'vision','builtins','src','ocv')});
            buildInfo.addSourceFiles({'CascadeClassifierCore.cpp', ...
                'mwcascadedetect.cpp', ...  
                'mwhaar.cpp', ...
                'cgCommon.cpp'});

            buildInfo.addIncludeFiles({'vision_defines.h', ...
                                       'CascadeClassifierCore_api.hpp', ...
                                       'cgCommon.hpp', ...                                       
                                       'mwobjdetect.hpp', ...
                                       'mwcascadedetect.hpp', ...
                                       'precomp_objdetect.hpp'}); % no need 'rtwtypes.h'           
                                 
            vision.internal.buildable.portableOpenCVBuildInfo(buildInfo, context, ...
                'cascadeClassifier');            
        end

        %------------------------------------------------------------------
        % write all supported data-type specific function calls       
        function ptrObj = cascadeClassifier_construct()
            
            coder.inline('always');
            coder.cinclude('CascadeClassifierCore_api.hpp');
            
            vision.internal.buildable.errorIfInSimulink('vision.CascadeObjectDetector');

            ptrObj = coder.opaque('void *', 'NULL');
    
            % call function from shared library
            coder.ceval('cascadeClassifier_construct', coder.ref(ptrObj));
        end    
        
        %------------------------------------------------------------------
        % write all supported data-type specific function calls       
        function cascadeClassifier_load(ptrObj, ClassificationModel)
            coder.inline('always');
            coder.cinclude('CascadeClassifierCore_api.hpp'); 
            
            % call function from shared library
            coder.ceval('cascadeClassifier_load', ptrObj, coder.ref(ClassificationModel));
        end 
        
        %------------------------------------------------------------------
        % write all supported data-type specific function calls       
        function [originalWindowSize, featureTypeID] = cascadeClassifier_getClassifierInfo(ptrObj)
            coder.inline('always');
            coder.cinclude('CascadeClassifierCore_api.hpp'); 
            
            originalWindowSize = zeros(1,2,'uint32');
            featureTypeID = uint32(0);
            
            % call function from shared library
            coder.ceval('cascadeClassifier_getClassifierInfo', ptrObj, ...
                coder.ref(originalWindowSize), coder.ref(featureTypeID));
        end 
        
        %------------------------------------------------------------------
        % write all supported data-type specific function calls       
        function bboxes = cascadeClassifier_detectMultiScale(ptrObj, I, ScaleFactor, ...
                MergeThreshold, MinSize, MaxSize)
            
            coder.inline('always');
            coder.cinclude('CascadeClassifierCore_api.hpp'); 
            
            coder.varsize('bboxes_', [inf, 4]);
            if isempty(I)
                % no-op
                bboxes = zeros(0,4);
            else
                % call function
                nRows = int32(size(I, 2));
                nCols = int32(size(I, 1));
                ScaleFactor_ = double(ScaleFactor);
                MergeThreshold_ = uint32(MergeThreshold);
                MinSize_ = int32(MinSize);
                MaxSize_ = int32(MaxSize);
                
                ptrDetectedObj = coder.opaque('void *', 'NULL');
                
                num_bboxes = int32(0);
                num_bboxes(:) = coder.ceval('cascadeClassifier_detectMultiScale', ...
                    ptrObj, coder.ref(ptrDetectedObj), ...
                    I, nRows, nCols, ScaleFactor_, ...
                    MergeThreshold_, coder.ref(MinSize_), coder.ref(MaxSize_));
                
                vision.internal.buildable.errorIfInSimulink('vision.CascadeObjectDetector');
                
                coder.varsize('bboxes_', [inf, 4]);
                bboxes_ = coder.nullcopy(zeros(double(num_bboxes),4,'int32'));
                
                % call function from shared library
                coder.ceval('cascadeClassifier_assignOutputDeleteBbox', ...
                    ptrDetectedObj, coder.ref(bboxes_));   
                
                bboxes = double(bboxes_);            
            end
            
        end 

        %------------------------------------------------------------------
        % write all supported data-type specific function calls       
        function cascadeClassifier_deleteObj(ptrObj)
            
            coder.inline('always');
            coder.cinclude('CascadeClassifierCore_api.hpp'); 
    
            % call function from shared library
            coder.ceval('cascadeClassifier_deleteObj', ptrObj);
        end         
        
    end   
end