MATLAB的KLT算法实现视频中人脸跟踪检测

2023-11-16

上次已经用卡尔曼滤波实现了人脸跟踪。也取得了一定的效果。。但仍存在一些问题,如人侧脸的时候跟踪效果并不理想。而KLT算法则能很好的解决这个问题。本文一共两部分。。理论部分借鉴博了客园上的博主(https://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html)

一、理论
 近来在研究跟踪,跟踪的方法其实有很多,如粒子滤波(pf)、meanshift跟踪,以及KLT跟踪或叫Lucas光流法,这些方法各自有各自的有点,对于粒子滤波而言,它能够比较好的在全局搜索到最优解,但其求解速度相对较慢,由于其是基于颜色直方图的计算,所以对相同颜色东西不太能够区别,meanshift方法很容易陷入局部最优,但速度还是挺快,所以现在很有一些人是将meanshift跟pf结合做跟踪,恰好在很多方面能够互补。

Kanade-Lucas-Tomasi方法,在跟踪方面表现的也不错,尤其在实时计算速度上,用它来得到的,是很多点的轨迹“trajectory”,并且还有一些发生了漂移的点,所以,得到跟踪点之后要进行一些后期的处理。这里讲的是一种图像点定位的方法,即图像的局部匹配,将图像匹配问题,从传统的滑动窗口搜索方法变为一个求解偏移量d的过程。在求解d的过程中,哪些情况下可以保证一定能够得到d的解,这些情况的点有什么特点(后来会发现,很多时候都是寻找的角点)。
  
  先说KLT算法的几个前提假设:
  1)亮度恒定
  2)时间连续或者是运动是“小运动”
3)空间一致,临近点有相似运动,保持相邻

这几个为什么要这么假设,很直观的讲,如果判断一个视频的相邻两帧I、J在某局部窗口w上是一样的,则在窗口w内有:I(x, y, t) = J(x’, y’, t+τ),亮度恒定的假设(假设1)即为了保证其等号成立不受亮度的影响,假设2是为了保证KLT能够找到点,假设3则为以下原因假设(即对于同一个窗口中,所有点的偏移量都相等):
在窗口w上,所有(x, y)都往一个方向移动了(dx, dy),从而得到(x’, y’),即t时刻的(x, y)点在t+τ时刻为(x+dx, y+dy),所以寻求匹配的问题可化为对以下的式子寻求最小值,或叫做最小化以下式子:
在这里插入图片描述

用积分来表示上述式子,以上式子可等效为:
在这里插入图片描述

这个式子的含义,即找到两副图像中,在W窗口中,I、J的差异,其中I以x-d/2为中心,J以x+d/2为中心,w/2为半径的一个矩形窗口间的差异,好吧,结合我们微积分的知识,函数ε(d)要取得最小值,这个极值点的导数一定为0,即
  在这里插入图片描述

的值为0,由泰勒展开的性质:
在这里插入图片描述

可以得到:
在这里插入图片描述
在这里插入图片描述

于是,问题转化为:
在这里插入图片描述

其中:
在这里插入图片描述
从而,问题即为:
在这里插入图片描述
在这里插入图片描述
即其等式可看作为:
在这里插入图片描述
其中,Z为一个22的矩阵,e为一个21的向量,
在这里插入图片描述
在这里插入图片描述
为了要使d能够得到解,则Z需要满足条件,即Z*Z’矩阵可逆,其中Z’为Z矩阵的转置(ZT),在一般情况下,角点具有这样的特点。

二、代码
程序部分是根据做了两个视频的案例来做的。话不多说,直接上代码

function [faceDet,faceTracks] = trackFaces( videoFilename,fittingModel,outFilename,visualise )
%TRACKFACES tracks all faces in a video
%   INPUT
%       videofilename - path to input video
%       fittingModel - model options for face detection
%       outfilename - path where we want to store our face detections
%       visualise - boolean to turn on visualisation
%   OUTPUT
%       faceDet - bounding box detections indexed by frame id
%       faceTracks - bounding box detections indexed by track id

%  define track structure (track id based)
%     faceTracks(trackID).bbox;
%     faceTracks(trackID).frameid;
    
%  define detection structure (frame id based)
%     faceDet(frameID).trackIDs;
%     faceDet(frameID).bboxes;
%
%   Written by James Charles at University of Leeds 27/04/16
%
%   If you use it then please cite the paper (for which is was developed): 
%     @Article{Charles16b,
%       author       = "Charles, J. and Magee, D. and Hogg.",
%       title        = "Virtual Immortality: Reanimating characters from TV shows",
%       booktitle    = "ECCV Workshop on Virtual/Augmented Reality for Visual Artificial Intelligence (VARVAI)",	
%       year         = "2016",
%     }
%
%   This work is licensed under the Creative Commons Attribution 4.0 International License. 
%   To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ or 
%   send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

    faceTracks = [];
    faceDet = [];
    h_img = []; %for visualisation only (image handle)

    %load video object
    vidobj = VideoReader(videoFilename);
    
    %setup face detector
    faceDetector = vision.CascadeObjectDetector();
    faceDetector.MaxSize = round(fittingModel.maxsize*fittingModel.facedetect.imscale);
    faceDetector.MinSize = round(fittingModel.minsize*fittingModel.facedetect.imscale);
    faceDetector.MergeThreshold = fittingModel.facedetect.sensitivity;
    
    %setup trackers
    trackers(1).maxID = 0;
    trackers(1).numActive = 0;
    
    %get starting frame index based on current saved output and also
    %tracker info
    [startIndex,trackers] = getSavedIndex(outFilename);
    
    %load the saved tracks
    if exist(outFilename,'file');
        load(outFilename);
    end
    
    %loop over frames and track
    for i = startIndex:vidobj.NumberOfFrames
        if mod(i,1000)==0
            fprintf('frame %d of %d, number of active trackers: %d\n',i,vidobj.NumberOfFrames,trackers(1).numActive);
        end

        img = read(vidobj,i);
        
        %track all previous faces to this frame
        [faceDet,faceTracks,trackers] = track(faceDet,faceTracks,trackers,img,i);
        
        %detect all faces
        facebboxes = detectFaces(faceDetector,img);
        
        %start new tracks if we detect new faces
        [faceDet,faceTracks,trackers] = addNewFaces(faceDet, faceTracks,trackers,facebboxes,img,i);
        
        %save output every 1000 frames
        saveOutput(outFilename,faceDet,faceTracks,trackers,vidobj.NumberOfFrames,i,1000); 
        
        %visualise
        if visualise
            h_img = vis(img,faceDet,trackers,i,h_img);
        end
    end
    
    %produce tracking structure from faceDet
    if isempty(faceTracks)
        faceTracks = dets2tracks(faceDet);
        frameID = vidobj.NumberOfFrames;
        save(outFilename,'faceDet','frameID','faceTracks');
    end
end

%function to convert faceDet structure to a faceTracks structure
function faceTracks = dets2tracks(faceDet)
    faceTracks(1).bboxes = [];
    faceTracks(1).frameIDs = [];
    
    for frameID = 1:numel(faceDet)
        if ~isempty(faceDet(frameID).trackIDs)
            for t = 1:numel(faceDet(frameID).trackIDs)
                trackID = faceDet(frameID).trackIDs(t);
                if trackID > numel(faceTracks)
                    faceTracks(trackID).bboxes = faceDet(frameID).bboxes(t,:);
                    faceTracks(trackID).frameIDs = frameID;
                else
                    faceTracks(trackID).bboxes = cat(1,faceTracks(trackID).bboxes,faceDet(frameID).bboxes(t,:));
                    faceTracks(trackID).frameIDs = cat(2,faceTracks(trackID).frameIDs,frameID);
                end
            end
        end
    end
end

%function to return start index for tracking
function [index,trackers] = getSavedIndex(outFilename)
    if ~exist(outFilename,'file')
        index = 1;
        trackers(1).maxID = 0;
        trackers(1).numActive = 0;
    else
        data = load(outFilename);
        index = data.frameID + 1; 
        trackers = data.trackers;
    end
end

%function to save the tracks
function saveOutput(outFilename,faceDet,faceTracks,trackers,maxFrames,frameID,stepSize)
    if frameID == maxFrames || mod(frameID,stepSize)==0
        save(outFilename,'faceDet','faceTracks','frameID','trackers');
    end
end

%track all faces to the next frame (destroys trackers when neccessary)
function [faceDet,faceTracks,trackers] = track(faceDet,faceTracks,trackers,img,frameID)
    if trackers(1).maxID == 0 || trackers(1).numActive == 0 
        return
    else
        %for each tracker track bbox to new image
        for i = 1:numel(faceDet(frameID-1).trackIDs)
            trackerID = find(faceDet(frameID-1).trackIDs(i)==cat(1,trackers(:).trackID));  %find tracker associated with this face
            if isempty(trackerID); continue; end %if tracker destroyed then skip
            [isGood,facebbox,tracker] = trackBBox(trackers(trackerID),img,faceDet(frameID-1).bboxes(i,:)); %track the face forward in time
            
            %update faceDet and faceTracks with new data
            if isGood
                [faceDet,faceTracks] = updateFace(faceDet,faceTracks,facebbox,trackers(trackerID).trackID,frameID);
                %update the tracker
                trackers(trackerID).points = tracker.oldPoints;
                trackers(trackerID).tracker = tracker.tracker;
            else
                if numel(faceDet)<frameID
                    faceDet(frameID).bboxes = [];
                end
                %we need to remove this tracker and let the system
                %initialise a new one when it gets a good face detection
                trackers(1).numActive = max(0,trackers(1).numActive - 1);
                release(trackers(trackerID).tracker);
                
                if trackerID == 1
                    if numel(trackers)==1
                        trackers(trackerID).points = [];
                        trackers(trackerID).tracker = [];
                    else
                        maxID = trackers(1).maxID;
                        numActive = trackers(1).numActive;
                        trackers(trackerID) = [];
                        trackers(trackerID).maxID = maxID;
                        trackers(trackerID).numActive = numActive;
                    end
                else
                    trackers(trackerID) = [];
                end
            end
        end
    end
end

function [isGood, facebbox, tracker] = trackBBox(tracker,img,facebbox)
    isGood = false;
    tracker.oldpoints = tracker.points;
    [points, isFound] = step(tracker.tracker, img);
    tracker.points = points(isFound, :);
    oldInliers = tracker.oldpoints(isFound, :);
            
    if size(tracker.points, 1) >= 3 % need at least 4 points
        % Estimate the geometric transformation between the old points
        % and the new points and eliminate outliers
        [xform, oldInliers, visiblePoints] = estimateGeometricTransform(...
            oldInliers, tracker.points, 'similarity', 'MaxDistance', 5);

        % Position bounding box at centre of points
        centre = mean(tracker.points);
        tempFacebbox = [centre(1)-facebbox(3)/2,centre(2)-facebbox(4)/2,facebbox(3),facebbox(4)];
        tempFacebbox = round(tempFacebbox);

        %check if tempFacebbox very different, if so track is not good
        A1 = prod(facebbox(3:4)); %area of new bounding box
        A2 = prod(tempFacebbox(3:4)); %area of old bounding box
        %compute intersection area
        U = rectint(facebbox,tempFacebbox);
            
        %calculate a similarity score and threshold at 0.7
        similarity = (U/A1 + U/A2)/2;
        if similarity > 0.7
            isGood = true;
        else
            isGood = false;
        end
            
        facebbox = tempFacebbox;
        tracker.oldPoints = visiblePoints;
        setPoints(tracker.tracker, tracker.oldPoints);
    end
end

function [faceDet,faceTracks,trackers] = addNewFaces(faceDet, faceTracks,trackers,facebboxes,img,frameID)
    %for each box see if it is a new face
    if ~isempty(facebboxes)
        numDets = size(facebboxes,1);
        for i = 1:numDets
            if ~isempty(faceDet)
                [isNew,matchingFaceID] = isNewFace(faceDet,facebboxes(i,:),frameID);
                if isNew
                    [faceDet,faceTracks,trackers] = addFace(faceDet,faceTracks,trackers,facebboxes(i,:),img,frameID);
                else
                    %update tracker with points in detected face
                    if ~isempty(matchingFaceID)
                        trackerID = find(cat(1,trackers(:).trackID)==faceDet(frameID).trackIDs(matchingFaceID));
                        if ~isempty(trackerID)
                            %re-initialise the tracker
                            trackers(trackerID).points = cat(1,trackers(trackerID).points,getFeaturePoints(img,facebboxes(i,:)));

                            %randomly sample at most 30 points
                            Ridx = randperm(size(trackers(trackerID).points,1));
                            trackers(trackerID).points = trackers(trackerID).points(Ridx(1:min(numel(Ridx),30)),:);
                            setPoints(trackers(trackerID).tracker, trackers(trackerID).points);
                        end
                    end
                end
            else
                [faceDet,faceTracks,trackers] = addFace(faceDet,faceTracks,trackers,facebboxes(i,:),img,frameID);
            end
        end
    end
end

%this function adds a new face and initialises a new tracker
function [faceDet,faceTracks,trackers] = addFace(faceDet,faceTracks,trackers,facebbox,img,frameID)
    numActiveTrackers = trackers(1).numActive;
    
    %get features
    points = getFeaturePoints(img,facebbox);
    
    if ~isempty(points)
        %setup new tracker
        trackerID = numActiveTrackers+1;
        trackers(1).maxID = trackers(1).maxID + 1; %maxID stores the total number of trackers so far
        trackers(1).numActive = trackers(1).numActive + 1;
        trackers(trackerID).trackID = trackers(1).maxID;
        trackers(trackerID).tracker = vision.PointTracker('MaxBidirectionalError', 2);

        %get features to track
        trackers(trackerID).points = points;

        %initialise the tracker
        initialize(trackers(trackerID).tracker,trackers(trackerID).points,img);

        %update the faceDet and faceTracks structure
        [faceDet,faceTracks] = updateFace(faceDet,faceTracks,facebbox,trackers(trackerID).trackID,frameID);
    end
end

%this function updates the faceDet and faceTracks structure with a new
%bounding box
function [faceDet,faceTracks] = updateFace(faceDet,faceTracks,facebbox,trackID,frameID)

    if ~isempty(faceDet)
        if numel(faceDet)<frameID % add new face and frame
            faceDet(frameID).trackIDs = trackID;
            faceDet(frameID).bboxes = facebbox;
            faceDet(frameID).landmarks = [];
        else %append face to current frame
            faceDet(frameID).trackIDs = cat(2,faceDet(end).trackIDs,trackID);
            faceDet(frameID).bboxes = cat(1,faceDet(end).bboxes,facebbox);
            faceDet(frameID).landmarks = [];
        end
    else
        faceDet(frameID).trackIDs = trackID;
        faceDet(frameID).bboxes = facebbox;
        faceDet(frameID).landmarks = [];
    end

end

function bboxes = detectFaces(faceDetector,img)
    bboxes = step(faceDetector, img);   
end

%check if the current bounding box is a new detection
function [newface,matchingFaceID] = isNewFace(faceDet,facebbox,frameID)
    newface = false;
    matchingFaceID = [];
    if isempty(faceDet)
        newface = true;
    elseif numel(faceDet)<frameID
        newface = true;
    else
        %check overlap of facebbox with bounding boxes present in faceDet
        numBBoxes = size(faceDet(frameID).bboxes,1);
        A1 = prod(facebbox(3:4)); %area of new bounding box
        for i = 1:numBBoxes
            A2 = prod(faceDet(frameID).bboxes(i,3:4)); %area of old bounding box
            %compute intersection area
            U = rectint(facebbox,faceDet(frameID).bboxes(i,:));
            
            %calculate a similarity score and threshold at 0.9
            similarity = (U/A1 + U/A2)/2;
            if similarity > 0.6
                newface = false;
                matchingFaceID = i;
                break;
            else
                newface = true;
            end
        end
    end
end

%function to convert a bounding box to points (unused)
function points = bbox2point(bbox)
    points = zeros(4,2);
    points(1,:) = bbox(1:2);
    points(2,:) = points(1,:) + [0 bbox(3)];
    points(3,:) = points(2,:) + [bbox(4) 0];
    points(4,:) = points(1,:) + [bbox(4) 0];
end

%function to convert points to a bounding box (unused)
function bbox = point2bbox(points)
    bbox = zeros(1,4);
    bbox(1) = min(points(:,1));
    bbox(2) = min(points(:,2));
    bbox(3) = max(points(:,1))-bbox(1);
    bbox(4) = max(points(:,2))-bbox(2);
end

%function to return feature points given bounding box and image
function locations = getFeaturePoints(img,bbox)
%     points = detectMinEigenFeatures(rgb2gray(img), 'ROI', bbox);
    points = detectBRISKFeatures(rgb2gray(img), 'ROI', bbox,'MinContrast',0.001);%ROI感兴趣的部分
    locations = points.Location;
    if ~isempty(locations)

        %get cluster close to centre of points
        centre = mean(locations);
        dist = sqrt(sum(bsxfun(@minus,locations,centre).^2,2));
        i = 1;
        idrem = ones(1,size(locations,1));
        while sum(idrem)>=size(locations,1)
            idrem = dist>15*i;
            i = i + 0.5;
        end
        locations(idrem,:) = [];
    end
end

%function to visualise the output
function h_img = vis(img,faceDet,trackers,frameID,h_img)
    if isempty(h_img) %create figure and image pane
        figure
        h_img = imagesc(img); axis image;
    end
    
    if numel(faceDet)>=frameID
        for b = 1:size(faceDet(frameID).bboxes,1)
            img = insertObjectAnnotation(img,'rectangle',faceDet(frameID).bboxes(b,:),sprintf('track: %d',faceDet(frameID).trackIDs(b)));
        end
        for b = 1:size(faceDet(frameID).bboxes,1)
            trackerID = find(cat(1,trackers(:).trackID)==faceDet(frameID).trackIDs(b));
            if ~isempty(trackerID)
                plotPoints = cat(2,trackers(trackerID).points(:,1:2),2*ones(size(trackers(trackerID).points,1),1));
                img = insertObjectAnnotation(img,'circle',plotPoints,' ','TextBoxOpacity',0,'Color','white');
            end
        end

    end
    set(h_img,'cdata',img);
    drawnow  
end






主函数部分就不在此展示了,可以根据自己的需要来写。。对于这部分的代码是需要花点时间去理解和消化的。。跟踪视频没法放两张截图吧在这里插入图片描述
在这里插入图片描述

值得注意的是,KLT算法已经得到了更好的优化,在跟踪检测方面进一步完善。另外KLT在DSP板C6000中也有很广泛的应用,在军事领域,安防监控等方面也具有重要意义。DSP的处理器能很好地运行KLT。对以后的硬件学习中也很有帮助。

PS:谈一点新人对matlab机器学习或者是深度学习的感受吧。。现在明显感觉到matlab在深度学习的劣势了。。运行程序很费力,一两分钟的视频就可能把电脑跑卡。这个方向也确实很吃硬件。另一方面,matlab工程领域上很难在硬件开发板上运行。在转成C语言上也存在很多问题。。Opencv在这方面上稍微有优势,毕竟还有树莓派,openmv等硬件可以跑代码。。兼学python吧。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB的KLT算法实现视频中人脸跟踪检测 的相关文章

  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 如何正确从表中删除 NaN 值

    在 Matlab 中阅读 Excel 电子表格后 不幸的是 我的结果表中包含了 NaN 例如这个 Excel 表格 将产生此表 其中出现额外的 NaN 列 我尝试使用以下代码片段删除 NaN measurementCells readtab
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • 禁止 MATLAB 自动获取焦点[重复]

    这个问题在这里已经有答案了 我有以下问题 在我的 MATLAB 代码中 我使用如下语句 figure 1 更改某些数据的目标数字 问题是 在此 MATLAB 之后 系统将焦点集中在具有该图形的窗口上 当我在后台运行一个大脚本并尝试在计算机上
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t

随机推荐

  • 高版本CubeIDE下使用DAP-LINK教程

    高版本CubeIDE下使用DAP LINK教程 背景 笔者此前在CSDN上写了两篇文章详述了如何在STM32CubeIDE下使用DAPLINK 在Stm32CubeIDE环境下使用DAP Link仿真 通过External Tools在ST
  • CentOS 几种重启方式的区别

    CentOS 几种重启方式的区别 Linux centos重启命令 1 reboot 普通重启 2 shutdown r now 立刻重启 root用户使用 3 shutdown r 10 过10分钟自动重启 root用户使用 4 shut
  • XAML三个顶级元素以及窗体的外观和位置

    XAML三个顶级元素介绍 Window 窗口 UserControl 用户控件 Page 把窗体以网页形式展现 注意 在XAML页面中我们只能有一个顶级元素 而且顶级元素只能有一个子元素 所以我们要使用布局控件 窗体的外观和位置 窗口的外观
  • 怎么把MySQL的数据存到区块链_区块链存储数据的方式是什么

    区块链存储数据的方式 分布式数据存储 区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的新型应用模式 从本质上讲 它是一个共享数据库 存储于其中的数据或信息 具有不可伪造 全程留痕 可以追溯 公开透明 集体维护等特征 本教
  • springmvc进阶(3):mvc:annotation-driven和mvc:default-servlet-handler在springmvc中的作用

    在springmvc xml中 经常会配置
  • 2036: [蓝桥杯2022初赛] 统计子矩阵(二维前缀和,一维前缀和)

    2036 蓝桥杯2022初赛 统计子矩阵 内存限制 256 MB 时间限制 1 S 标准输入输出 题目类型 传统 评测方式 文本比较 上传者 外部导入 提交 310 通过 74 题目描述 给定一个 N M 的矩阵A 请你统计有多少个子矩阵
  • linux安装mysql

    安装环境 工具 1 Linux CentOS 7 4版 2 mysql 8 0 12 el7 x86 64 tar gz 安装步骤 参考 https dev mysql com doc refman 8 0 en installing ht
  • 【满分】【华为OD机试真题2023 JS】寻找相似单词

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找相似单词 知识点字符串排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个可存储若干单词的字典 找出指定单词的所有相似单词 并且按照单词名称从小到大
  • 人工智能-马尔可夫模型

    马尔可夫与马尔科夫都可以 所以也别纠结 马尔可夫模型 Markov Model 是一种统计模型 广泛应用在语音识别 词性自动标注 音字转换 概率文法等各个自然语言处理等应用领域 经过长期发展 尤其是在语音识别中的成功应用 使它成为一种通用的
  • java.util.LinkedHashMap cannot be cast to com.XXX.XXX

    ResquestBody的HashMap转List时错误java util LinkedHashMap cannot be cast to com XXX XXX RequsetBody Map
  • 五个温度带的分界线_亚热带,暖温带,到底是些什么带?

    在地理课上 讲到有关气候的内容时 经常会提到各种 带 例如暖温带 中温带 寒温带 你能清晰地分清谁是谁吗 首先 我们先来澄清一个概念 温度带和热量带 很多人分不清这两个词 但实际上 它们的内在含义是大致相同的 但是如果细究 两者的划分方式是
  • 服务器间数据传输的四种方式

    scp 优点 简单方便 安全可靠 支持限速参数 缺点 不支持排除目录 用法 scp就是secure copy 是用来进行远程文件拷贝的 数据传输使用 ssh 并且和ssh 使用相同的认证方式 提供相同的安全保证 scp 参数 lt 源地址
  • cmake tutorial

    Tutorial 1 最基本的项目是从源代码构建可执行文件 对于简单的项目 三行CMakeLists txt足够了 这就是本教程的起点 在Step1目录下创建一个CMakeLists txt 如下所示 cmake minimum requi
  • 运行报错:from .qhull import * ImportError: DLL load failed: 找不到指定的模块。

    记录一次报错 当出现这个问题时说明模块安装有误 但不知道原因 应该是在此之前需要先把安装的numpy scipy sklearn卸载掉 先看究竟是哪个模块出的错误 直接 pip uninstall numpy pip uninstall s
  • Chatgpt 未来可以应用的场景

    ChatGPT是一款基于GPT 3的聊天机器人 它具有自然语言处理和生成语言的强大能力 在很多场景下可以有很广泛的应用 以下是ChatGPT未来可以应用的一些场景 客服 ChatGPT可以被用作客服机器人 为用户提供帮助和解答问题 教育 C
  • 坐上支付宝微信支付巨头的刷脸顺风车

    人脸识别技术已经在互联网 政务领域得到了广泛应用 超过100个城市的用户通过支付宝刷脸完成身份验证中国财政科学研究院应用学博士后盘和林认为 刷脸支付比密码支付更安全更便捷 随着门槛的进一步降低 刷脸支付或将在未来3年内呈现爆发式的增长 20
  • Pytorch 计算一个矩阵行向量之间的相似度

    import torch def similarity input tensor step 1 计算行向量的长度 len a torch sqrt torch sum input tensor 2 dim 1 b len a unsquee
  • Enum枚举类型实战总结,保证有用!

    一般在我们开发时如果能使用枚举罗列的 一般都会定义一个枚举类型 将枚举类型作为方法的参数 可以方便的进行调用 给我们带来不少的便利 当然有时候它还不如直接用一个int类型带来 带来一定灵活性 但只要能满足业务咱们就怎么方便怎么来吧 基本使用
  • Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交

    在Java EE应用编程中Servlet是基础 JSP是建立在Servlet基础之上的 其他Web框架如Struts WebWork和Spring MVC都是基于Servlet的 本文主要讲述MyEclipse和Tomcat配置Servle
  • MATLAB的KLT算法实现视频中人脸跟踪检测

    上次已经用卡尔曼滤波实现了人脸跟踪 也取得了一定的效果 但仍存在一些问题 如人侧脸的时候跟踪效果并不理想 而KLT算法则能很好的解决这个问题 本文一共两部分 理论部分借鉴博了客园上的博主 https www cnblogs com moon