用MATLAB实现对运动物体识别与跟踪

用MATLAB实现对运动物体识别与跟踪

大家好,又见面了,我是全栈君。

不得不说MATLAB的图像处理函数有点多,但速度有时也是出奇的慢。还是想c的指针,虽然有点危险,但速度那是杠杠的。
第二个MATLAB程序,对运动物体的识别与追踪。
这里我们主要运用帧差法实现运动物体与背景图像的分离,由于视频中的物体较为简单,我们只对两帧图像取帧差(也是为了提高速度)
对于运动物体的提取我们运用了MATLAB里自带的函数bwareaopen
bwareaopen(src,int),src为二值图像,int为设置的联通域的大小,是对帧差法,在转化为二值的图像进行操作,结果是将大小小于设定的int的连通域置为0;
对于第一帧与第二帧图像运动物体的坐标的提取我们用了自带的regionprops函数
regionprops(src,’‘)其中src为传入的二值图像,’‘内的为你所需要的属性
具体属性可以查看MATLAB的help
这里写图片描述
这里我们选用了其中的Centroid属性,返回的时连通域的质心坐标,注返回的第一个值为横坐标,第二个值为纵坐标~
对于运动物体的追踪我们用了质心追踪,
在第一二三两帧的帧间差的运动物体的质心求出来后,将质心做差得到的向量预测下一帧间差运动物体可能到达的位置,接下来在对这个位置进行局部的找质心,再做差如此循环。
追踪大致如图(画的不好):
这里写图片描述
这个相对与全局再次进行bwareaopen,regionprops,速度应该会快一下,而且这是进行局部地搜索所以可以减小背景,或其他噪声的影响。
这里写图片描述
如图为直接进行帧间差分后的转化的二值图像,即使噪声很大用局部追踪也能跟上。
具体代码:

yuandian=zeros(2,2); i=1293; filename1 = strcat('I:\2d3d\2\dxshiyan2\C',num2str(i),'.jpg'); src1=imread('C1291.jpg'); src2=imread('C1292.jpg'); %src1=rgb2gray(src1); %src2=rgb2gray(src2); zhic1=src2-src1; zhic1=im2bw(zhic1,0.2); imshow(zhic1); zhic2= bwareaopen(zhic1,3000); imshow(zhic2); quyu=regionprops(zhic2,'Centroid'); [u,v]=zhixin(zhic2,int16(quyu.Centroid(2)),int16(quyu.Centroid(1))); yuandian(1,1)=u; yuandian(1,2)=v; %去一个模板为400*400src1=src2; src2=imread('C1293.jpg'); %src2=rgb2gray(src2); zhic2=src2-src1; zhic1=im2bw(zhic2,0.2); zhic2= bwareaopen(zhic1,3000); imshow(zhic2); quyu=regionprops(zhic2,'Centroid'); [u,v]=zhixin(zhic2,int16(quyu.Centroid(2)),int16(quyu.Centroid(1))); yuandian(2,1)=u; yuandian(2,2)=v; for i=1294:1386 filename1 = strcat('I:\2d3d\2\dxshiyan2\C',num2str(i),'.jpg'); src1=src2; src2=imread(filename1); src3=src2; zhic2=src2-src1; zhic2=im2bw(zhic2,0.2); imshow(zhic2); houx=2*yuandian(2,2)-yuandian(1,2); houy=2*yuandian(2,1)-yuandian(1,1); [u,v]=zhixin(zhic2,houy,houx); [state,result]=draw_rect(src3,[v-250,u-250],[500,500],0); %imshow(result); pause(0.01); yuandian(1,1)=yuandian(2,1); yuandian(1,2)=yuandian(2,2); if(abs(yuandian(1,1)-u<400)&&abs(yuandian(1,2)-v<400)) yuandian(2,1)=u; yuandian(2,2)=v; end end

fanction:

%找质心
function [u,v]=zhixin(erzhi,y,x)
u=0;
v=0;
zuobiaox=0;
zuobiaoy=0;
number=0;
jilux=0;
jiluy=0;
for i=y-200:y+200
    for j=x-200:x+200
        if(j<3839)
        if(erzhi(i,j)==1)
            number=number+1;
            u=(int64(i)+int64(u));
            v=(int64(j)+int64(v));
            zuobiaox=zuobiaox+double(erzhi(i,j));
            zuobiaoy=double(erzhi(i,j))+zuobiaoy;
            jilux=int64(jilux)+int64(j);
            jiluy=int64(jiluy)+int64(i);
        end
        end
    end
end
u=int64(u/zuobiaoy);
%p=jilux/int64(number)-u;
v=int64(v/zuobiaox);
%q=jiluy/int64(number)-v;
%k=0;

draw-rect

function [state,result]=draw_rect(img,startPosition,windowSize,showOrNot)
% 函数调用:[state,result]=draw_rect(img,startPosition,windowSize,showOrNot)
% 函数功能:在图像画个长方形框
% 函数输入:img为原始的大图,可为灰度图,可为彩色图
% startPosition 框的左上角在大图中的坐标(每行代表x,y坐标),startPosition=[10,30],分别表示x,y为10,30
% windowSize 框的大小 windowSize=[112,92] 分别表示宽、高
% showOrNot 是否要显示结果?默认为显示出来?
% 函数输出:state -- 表示程序结果状态?
% result - 结果图像数据 


if nargin < 4
    showOrNot = 1;
end

rgb = [255 0 0];                                 % 边框颜色
lineSize = 3;                                      % 边框大小,取1,2,3

windowSize(1,1)=windowSize(1,1);
windowSize(1,2) = windowSize(1,2);
if windowSize(1,2) > size(img,1) ||...
        windowSize(1,1) > size(img,2)
    state = -1;                                     % 说明窗口太大,图像太小,
    disp('the window size is larger then image...');
    return;
end

result = img;
if size(img,3) == 3
    for k=1:3
        for i=1:size(startPosition,1) %矩形框的总数
            if(startPosition(i,1)>=0 && startPosition(i,2)>=0)
                result(startPosition(i,2),startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k); %画上边框 
                result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);%画右边框
                result(startPosition(i,2)+windowSize(i,2),startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);  %画下边框 
                result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1),k) = rgb(1,k);   %画左边框 

                if lineSize == 2 || lineSize == 3
                    result(startPosition(i,2)+1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);  
                    result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+windowSize(i,1)-1,k) = rgb(1,k);
                    result(startPosition(i,2)+windowSize(i,2)-1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);
                    result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)-1,k) = rgb(1,k);

                    if lineSize == 3
                        result(startPosition(i,2)-1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);   
                        result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+windowSize(i,1)+1,k) = rgb(1,k);
                        result(startPosition(i,2)+windowSize(i,2)+1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);
                        result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+1,k) = rgb(1,k);
                    end
                end
            end
        end
    end
end

state = 1;

if showOrNot == 1
    figure;
    hold on;
    imshow(result);
end

追踪效果:
这里写图片描述
这里写图片描述
时间:
这里写图片描述

注(画框函数引用网上现有的)
可能是matlab问题,这段视频为4K,无法直接读取,所以只能将其转化为图片逐帧读取。
结果是还是太慢,而且不能预读取,好像用这个无法实时,可能与图片为4k也有点关系有点伤

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108746.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springboot使用拦截器_通用mapper源码

    springboot使用拦截器_通用mapper源码1.加载依赖<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.5</version></dependency>2.引入逆向工程的插件引入

    2022年10月6日
    3
  • php小程序接口开发_php的api调用方法

    php小程序接口开发_php的api调用方法微信小程序调用PHP后台接口,解析纯html文本,效果图片预览1、微信js动态传参:wx.request({url:’https://m.****.com/index.php/Home/Xiaoxxf/activity_detail?a_id=’+options.id,//含富文本htmldata:{is_detail:1},method:’GET’,//OPTIONS,GET,HE…

    2022年9月2日
    5
  • RestTemplate 用法详解「建议收藏」

    RestTemplate 用法详解「建议收藏」上篇文章带大家学习了一下基本的微服务环境搭建,由provider提供服务,consumer通过DiscoveryClient先去eureka上获取provider的服务的地址,获取到地址之后再去调用相关的服务。在服务的调用过程中,使用到了一个工具,叫做RestTemplate,RestTemplate是由Spring提供的一个HTTP请求工具。在上文的案例中,开发者…

    2025年8月20日
    2
  • JAVA面试中的SSM框架基础面试题[通俗易懂]

    JAVA面试中的SSM框架基础面试题[通俗易懂]javaSSM框架基础面试题SSM(Spring+Springmvc+Mybatis)框架面试题SpringSpringmvcMybaits一些基础面试题,对刚刚步入社会的2019届毕业生有帮助

    2022年6月29日
    22
  • mybatis if语句_java中的if else语句

    mybatis if语句_java中的if else语句https://www.cnblogs.com/buzheng/p/12485464.htmlMyBatis中if-elseif-else的使用有表user(id,name,state,sex,age)1、单个if-else使用。  根据状态不同进行查询  <selectid=”selectUserByState”resultType=”com.bz.model.entity.User”>SELECT…

    2022年9月26日
    2
  • BN 层原理解析_解析器

    BN 层原理解析_解析器1训练数据为什么要和测试数据同分布?看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗?2为什么白化训练数据能够加速训练进程如下图,训练数据如果分布在右上角,我们在初始化网络参数w和b的时候,可能得到的分界面是左下角那些线,需要经过训练不断调整才能得到穿过数据点的分界面,这个…

    2022年10月9日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号