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

    function opencvBuildInfo(buildInfo, context, fcnName, needNonFreeLib)
% opencvBuildInfo: Lists all the libraries required for openCV library
% based code generation

% File extensions
[~, linkLibExt, execLibExt] = context.getStdLibInfo();
group = 'BlockModules';

% Header paths
buildInfo.addIncludePaths(fullfile(matlabroot,'extern','include'));

% Platform specific link and non-build files
arch            = computer('arch');
pathBinArch     = fullfile(matlabroot,'bin',arch,filesep);
libName         = ['libmw' fcnName];

%--------------------------------------------------------------------------
% Set OpenCV version
%--------------------------------------------------------------------------
ocv_version = '2.4.9';

switch arch
    case {'win32','win64'}        
        % associate bridge lib file: (matabroot)\extern\lib\win64\microsoft\libmwfcnName.lib        

        libDir = images.internal.getImportLibDirName(context); 
        
        linkLibPath     = fullfile(matlabroot,'extern','lib',arch,libDir);
        linkFilesNoExt  = {libName}; %#ok<*EMCA>
        linkFiles       = strcat(linkFilesNoExt, linkLibExt);
        
        ocv_ver_no_dots = strrep(ocv_version,'.','');
        ocv_libs        = strcat({'opencv_core','opencv_imgproc'}, ocv_ver_no_dots);
        
        % Non-build files
        % associate open cv 3p libraries L:\Adsp\matlab\bin\win64
        nonBuildFilesNoExt = [libName, ocv_libs, 'tbb'];
        nonBuildFilesNoExt = AddHighGuiLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddObjDetectLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddFeaturesLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddFlannLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddCalib3DLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddNonFreeLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddVideoLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        nonBuildFilesNoExt = AddGPULibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots);
        
        nonBuildFiles = strcat(pathBinArch,nonBuildFilesNoExt, execLibExt);                
    case {'glnxa64','maci64'}
        linkLibPath     = pathBinArch;
        linkFilesNoExt  = {libName}; %#ok<*EMCA>
        linkFiles       = strcat(linkFilesNoExt, linkLibExt);
        
        ocv_major_ver = ocv_version(1:end-2);
        %
        nonBuildFilesNoExt = {'libopencv_core', ...
            'libopencv_features2d', ...
            'libopencv_imgproc', ...
            'libopencv_legacy', ...
            'libopencv_ml', ...
            'libopencv_nonfree', ... % always needed
            'libopencv_objdetect', ...
            'libopencv_photo', ...
            'libopencv_calib3d', ...
            'libopencv_video', ...
            'libopencv_flann', ...
            'libopencv_contrib', ...
            'libopencv_highgui', ...
            'libopencv_stitching', ...            
            'libopencv_videostab', ...
            'libopencv_gpu'};
        
        if strcmpi(arch,'glnxa64')
            nonBuildFiles = strcat(pathBinArch,nonBuildFilesNoExt, strcat('.so.',ocv_major_ver));
            % cvst function specific library
            nonBuildFiles{end+1} = strcat(pathBinArch,[libName '.so']);
            % boost [only used by pointTracker]
            nonBuildFiles = AddBoostLibsIfNeeded(nonBuildFiles, pathBinArch, fcnName);
            % tbb [used by all]
            nonBuildFiles = AddTbbLibs(nonBuildFiles, pathBinArch);
            % glnxa64 specific runtime libs
            nonBuildFiles = AddGLNXRTlibs(nonBuildFiles);
        else % maci64                                  
            
            nonBuildFiles = strcat(pathBinArch,nonBuildFilesNoExt, strcat('.',ocv_major_ver,'.dylib'));
            % cvst function specific library
            nonBuildFiles{end+1} = strcat(pathBinArch,[libName '.dylib']);
            % boost [only used by pointTracker]
            nonBuildFiles = AddBoostLibsIfNeeded(nonBuildFiles, pathBinArch, fcnName);
            % tbb (implicitly used by libopencv_core.2.4.dylib)
            nonBuildFiles{end+1} = strcat(pathBinArch,'libtbb.dylib');
        end
        
    otherwise
        % unsupported
        assert(false,[ arch ' operating system not supported']);
end

nonBuildFiles = AddCUDALibs(nonBuildFiles, pathBinArch);

linkPriority    = '';
linkPrecompiled = true;
linkLinkonly    = true;
buildInfo.addLinkObjects(linkFiles,linkLibPath,linkPriority,...
    linkPrecompiled,linkLinkonly,group);

buildInfo.addNonBuildFiles(nonBuildFiles,'',group);

%==========================================================================
function nonBuildFiles = AddBoostLibsIfNeeded(nonBuildFiles, pathBinArch, fcnName)
% boost: used by only pointTracker
if strcmp(fcnName, 'pointTracker')
    arch = computer('arch');
    if strcmpi(arch, 'glnxa64')
        boostFileSys = getBoostLibName(pathBinArch, 'libboost_filesystem.so.*');
        boostSys = getBoostLibName(pathBinArch, 'libboost_system.so.*');
        nonBuildFiles{end+1} = strcat(pathBinArch, boostFileSys);
        nonBuildFiles{end+1} = strcat(pathBinArch, boostSys);
    else % must be maci64
        nonBuildFiles{end+1} = strcat(pathBinArch,'libboost_filesystem.dylib');
        nonBuildFiles{end+1} = strcat(pathBinArch,'libboost_system.dylib');
    end
end

%==========================================================================
function nonBuildFiles = AddTbbLibs(nonBuildFiles, pathBinArch)
% tbb: used by all
nonBuildFiles{end+1} = strcat(pathBinArch,'libtbb.so.2');

%==========================================================================
function nonBuildFiles = AddCUDALibs(nonBuildFiles, pathBinArch)
% CUDA: required by all OpenCV libs when OpenCV is built WITH_CUDA=ON.
cudaLibs = {'cudart', 'nppc', 'nppi', 'npps','cufft'};

arch = computer('arch');
switch arch
    case 'win32'
        % CUDA not enabled on win32
        cudaLibs = [];
    case 'win64'
        cudaLibs = strcat(cudaLibs, '64_*.dll');
    case 'glnxa64'
        cudaLibs = strcat('lib', cudaLibs, '.so.*.*');
    case 'maci64'
        cudaLibs = strcat('lib', cudaLibs, '.*.*.dylib');   
        
    otherwise
        assert(false,[ arch ' operating system not supported']);
end

if ~strcmpi(arch,'win32')  
    cudaLibs = lookupInBinDir(pathBinArch, cudaLibs);
    cudaLibs = strcat(pathBinArch,cudaLibs);
    for i = 1:numel(cudaLibs)
        nonBuildFiles{end+1} = cudaLibs{i};
    end
end

%==========================================================================
function out = lookupInBinDir(pathBinArch, libs)

numLibs = numel(libs);

out = cell(1,numLibs);

for i = 1:numLibs
    info = dir(fullfile(pathBinArch, libs{i}));
    out{i} = info(1).name;
end

%==========================================================================
function nonBuildFiles = AddGLNXRTlibs(nonBuildFiles)
% glnxa64 specific runtime libs
arch = computer('arch');
sysosPath = fullfile(matlabroot,'sys','os',arch,filesep);
nonBuildFiles{end+1} = strcat(sysosPath,'libstdc++.so.6');
nonBuildFiles{end+1} = strcat(sysosPath,'libgcc_s.so.1');

%==========================================================================
function nonBuildFilesNoExt = AddHighGuiLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'cascadeClassifier') || ...
        strcmp(fcnName, 'HOGDescriptor') || ...
        strcmp(fcnName, 'extractSurf') || ...  % dependency via nonfree
        strcmp(fcnName, 'fastHessianDetector') % dependency via nonfree
    nonBuildFilesNoExt{end+1} = strcat('opencv_highgui', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddObjDetectLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'cascadeClassifier') || ...
        strcmp(fcnName, 'HOGDescriptor') || ...
        strcmp(fcnName, 'extractSurf') || ...  % dependency via nonfree
        strcmp(fcnName, 'fastHessianDetector') % dependency via nonfree
    nonBuildFilesNoExt{end+1} = strcat('opencv_objdetect', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddFeaturesLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'detectFAST') || ...
        strcmp(fcnName, 'detectMser') || ...
        strcmp(fcnName, 'extractFreak') || ...
        strcmp(fcnName, 'disparityBM') || ...
        strcmp(fcnName, 'disparitySGBM') || ...
        strcmp(fcnName, 'extractSurf') || ...
        strcmp(fcnName, 'fastHessianDetector') || ...
        strcmp(fcnName, 'detectBRISK') || ...
        strcmp(fcnName, 'extractBRISK')
    nonBuildFilesNoExt{end+1} = strcat('opencv_features2d', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddFlannLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'detectFAST') || ...
        strcmp(fcnName, 'detectMser') || ...
        strcmp(fcnName, 'extractFreak') || ...
        strcmp(fcnName, 'disparityBM') || ...
        strcmp(fcnName, 'disparitySGBM') || ...
        strcmp(fcnName, 'extractSurf') || ...
        strcmp(fcnName, 'fastHessianDetector') || ...
        strcmp(fcnName, 'detectBRISK') || ...
        strcmp(fcnName, 'extractBRISK') || ...
        strcmp(fcnName, 'matchFeatures')
    nonBuildFilesNoExt{end+1} = strcat('opencv_flann', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddCalib3DLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'disparityBM') || ...
        strcmp(fcnName, 'disparitySGBM') || ...
        strcmp(fcnName, 'extractSurf') || ...  % dependency via nonfree
        strcmp(fcnName, 'fastHessianDetector') % dependency via nonfree
    nonBuildFilesNoExt{end+1} = strcat('opencv_calib3d', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddNonFreeLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'extractSurf') || ...
        strcmp(fcnName, 'fastHessianDetector')
    nonBuildFilesNoExt{end+1} = strcat('opencv_nonfree', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddVideoLibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'pointTracker') || ...
        strcmp(fcnName, 'extractSurf') || ...  % dependency via nonfree
        strcmp(fcnName, 'fastHessianDetector') % dependency via nonfree
    nonBuildFilesNoExt{end+1} = strcat('opencv_video', ocv_ver_no_dots);
end

%==========================================================================
function nonBuildFilesNoExt = AddGPULibIfNeeded(nonBuildFilesNoExt, fcnName, ocv_ver_no_dots)

if strcmp(fcnName, 'extractSurf') || ...  % dependency via nonfree
        strcmp(fcnName, 'fastHessianDetector') % dependency via nonfree
    nonBuildFilesNoExt{end+1} = strcat('opencv_gpu', ocv_ver_no_dots);
end

%==========================================================================
function libName = getBoostLibName(pathBinArch, libName)
dirInfo = dir(fullfile(pathBinArch, libName));
libName = dirInfo(1).name;