【目标检测】基于YOLO神经网络实现人体举重时杠铃的路径和速度跟踪附matlab代码

该文提出一种结合YOLO算法和改进模板匹配的杠铃识别与跟踪方法,用于视频中的运动目标检测。通过对杠铃视频进行处理,提取出运动参数,如速度和位置,以分析运动员的技术表现。采用Matlab实现,提升了识别准确率和帧率。
摘要由CSDN通过智能技术生成

作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

基于计算机视觉的运动跟踪和检测是计算机视觉领域的重要课题。对视频序列中的运动目标进行检测、跟踪,获得目标的位置、速度等运动参数,是进行更高级的运动目标行为分析的基础。快速实时地检测出运动目标,对运动目标进行跟踪,并实现目标的运动数据分析,在体育领域可以得到广泛的应用。例如,对一个田径运动员的训练视频进行处理,提取出其瞬时运动速度、手臂摆动幅度、频率等信息,由于视频序列每秒钟有多幅图像,含有大量的人眼捕捉不到的有价值的信息,可用于分析运动员技术上的不足,提高运动技能。一种基于YOLO和改进模板匹配的杠铃识别与跟踪控制方法,具体包括以下步骤:S1,采集多种杠铃的侧视图作为训练数据,对训练数据制定标签,划分为训练集和测试集;S2,对训练集中的图片进行标准化处理,并使用YOLO算法通过调整超参数的方式训练杠铃识别模型;S3,获取原始杠铃视频,通过杠铃识别模型对杠铃视频的第一帧图像进行检测并定位杠铃的位置;S4,将从第一帧图像中得到的杠铃位置和原始杠铃视频输入到改进的模板匹配算法中,计算得到绘制有杠铃轨迹的杠铃追踪视频.与现有技术相比,本发明具有提升杠铃识别的准确率并能够识别出不同样式的杠铃,提高帧率和准确率等优点.

⛄ 部分代码

classdef liftVid < handle

    %liftVid Read and analyze a weightlifting video frame by frame.

    %   vid = liftVid("file.mp4"); 

    %

    % This is the main class definition for running BarTrace.

    

    properties

        vObj = 0;               % video object

        frameSize = [0 0]       % frame size

        numFrames = 0;          % number of frames

        radius = 0;             % avg radius of the plate in pixels    

        pos = zeros([],3);      % center of plate and radius in each frame

        model = load("TrainedNNB.mat"); % trained neural net

    end

    

    methods

        function obj = liftVid(fileName)

            %liftVid Construct an instance and open the video file.

            %   obj = liftVid(fileName) 

            if nargin == 0

                [fileName, path] = uigetfile("*.mp4","Select video file");

                fileName = string(path) + fileName;

            elseif nargin > 1

                error('Expected 0 or 1 inputs');

            end

            obj.vObj = VideoReader(fileName);

            obj.frameSize = [obj.vObj.Height obj.vObj.Width];

        end

        

        function frame = processNextFrame(obj)

            %processNextFrame

            if isa(obj.vObj,"VideoReader") && hasFrame(obj.vObj)

                

                % read frame

                obj.numFrames = obj.numFrames + 1;

                cdata = readFrame(obj.vObj);

                

                % find plate

                trainedSize = obj.model.detector.TrainingImageSize;

                imSmall = imresize(cdata,trainedSize);

                [bboxes,scores] = detect(obj.model.detector,imSmall);

                if ~isempty(bboxes)

                    [~,idx] = max(scores);

                    box = bboxes(idx,1:4);

                    x = box(1) * obj.frameSize(2)/trainedSize(2);

                    y = box(2) * obj.frameSize(1)/trainedSize(1);

                    w = box(3) * obj.frameSize(2)/trainedSize(2);

                    h = box(4) * obj.frameSize(1)/trainedSize(1);

                    position = [(x+w/2) (y+h/2) ((w+h)/4)]; %[x y r]

                    obj.pos(obj.numFrames,1:3) = position; % store position

                    obj.radius = median(obj.pos(1:obj.numFrames,3)); % median of all past radii

                else

                    % plate wasn't found

                    position = [1 1 10];

                    obj.pos(obj.numFrames,1:3) = position; % store position

                end

                

                % annotate

                frame = insertShape(cdata,'circle',position,'LineWidth',5,'Color',"red");

                trace = zeros(obj.numFrames,4); %add lines and dots to bar trace

                for k = 2:obj.numFrames % concatonate a list of all past centers

                    trace(k-1,1:4) = [obj.pos(k-1,1) obj.pos(k-1,2) obj.pos(k,1) obj.pos(k,2)];

                end

                if ~isempty(trace)

                    frame = insertShape(frame,'Line',trace,'LineWidth',2,'Color',"blue");

                    frame = insertShape(frame,"Circle",[trace(1:size(trace,1),[3 4]) 2*ones(size(trace,1),1)],"LineWidth",1,"Color",{"Yellow"});

                end

            else

                disp("no more frames")

            end

        end

        

        function tracePlate(obj,playit,saveit,saveName)

            % tracePlate Finds the plate in each frame

            %   tracePlate(obj,playit,saveit)

            %   playit = true will play the video

            %   saveit = true will save the video

            if isa(obj.vObj,"VideoReader") && hasFrame(obj.vObj)

                if playit

                    figure;

                    f = gca;

                end

                if saveit

                    v = VideoWriter(saveName);

                    open(v);

                end

            else

                disp("no more frames to process - try reloading")

                playit = false;

                saveit = false;

            end

            while hasFrame(obj.vObj)

                frame = obj.processNextFrame;

                if playit

                    imshow(frame, 'Parent', f);

                    drawnow;

                end

                if saveit

                    writeVideo(v,frame);

                end

            end

            if saveit

                close(v)

            end

        end

    end % end of methods

end % end of classdef

⛄ 运行结果

⛄ 参考文献

[1]李文举, 王子杰. 基于YOLO和改进模板匹配的杠铃识别与跟踪控制方法:, CN114743125A[P]. 2022.

[2]王群. 基于计算机视觉的人体跟踪与运动参数测量[D]. 大连海事大学.

⛄ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值