用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*400;
src1=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也有点关系有点伤

时间: 2024-10-04 09:52:23

用MATLAB实现对运动物体识别与跟踪的相关文章

opencv-关于emgucv 3.0 运动物体识别的问题

问题描述 关于emgucv 3.0 运动物体识别的问题 用3.0中的示例MotionDetection做运动物体识别,结果可以识别运动物体,却无法识别这些运动物体的方向,调试时发现是MotionHistory中的梯度计算结果都为0,无解,求大神赐教呀 解决方案 http://www.zhihu.com/question/34291866 解决方案二: http://download.csdn.net/detail/conmajia/4282066

视频-matlab运动物体检测程序报错

问题描述 matlab运动物体检测程序报错 在做运动物体检测inputvideo 和outputvideo均正常 主程序如下 clear data disp('input video'); avi= VideoReader('samplevideo.avi'); numFrames = avi.NumberOfFrames;% 读取视频的帧数 vidHeight = avi.Height; vidWidth = avi.Width; for i = 1 : numFrames frame = r

李飞飞:物体识别之后,计算机视觉的进展、目标和前景何在?

9 月 26 日,机器人领域的顶级学术会议 IROS 2017 进入第二日.上午,著名华人计算机视觉专家.斯坦福副教授李飞飞,在温哥华会议中心面向全体与会专家学者作了长达一小时的专题报告. 在报告中李飞飞与大家讨论了计算机视觉的目标:丰富场景理解,以及计算机视觉与语言结合和任务驱动的计算机视觉的进展和前景.场景理解和与语言结合的计算机视觉进一步搭起了人类和计算机之间沟通的桥梁,任务驱动的计算机视觉也会在机器人领域大放异彩.李飞飞介绍的自己团队工作也丰富多样.令人振奋. 2015年,李飞飞也在同一

《中国人工智能学会通讯》——11.26 双目视频运动物体匹配及分割

11.26 双目视频运动物体匹配及分割 上一章研究了单目视频的运动物体分割问题,其假定匹配(特征点轨迹)已经给定,而研究重点在于如何利用该匹配关系来实现物体分割.在本章中,我们主要研究双目视频的匹配和运动分割问题[7] .在这一问题中,两个运动摄像头独立拍摄同一场景,且视频未经时域同步.相比于单目视频,双目视频能更全面地覆盖物体的表观,并有可能消除在单目视频分割中由于运动信息不充分导致的歧义性. 考虑最通用的逐点匹配关系.我们采用图 4 中所示的流程来实现空域匹配.时域匹配,以及运动物体分割.图

《中国人工智能学会通讯》——11.25 单目视频下运动物体建模及分析

11.25 单目视频下运动物体建模及分析 特征点轨迹是刻画视频中不同图像帧匹配关系的一种常用表示,其首先提取图像中的特征点,例如Harris 特征点,然后利用 Lucas-Kanade 方法[3]对这些特征点进行跟踪得到.由于特征点具有显著性和稳定性的特点,特征点轨迹往往较精确而且可以持续较长时间,从而能准确刻画物体的长时间运动.如图3所示,本章主要研究基于特征点轨迹的运动视频分割,其关键在于对同一个物体上轨迹进行运动建模. 已有研究表明,在仿射摄像机下,同一个运动物体上的轨迹在一个低维线性子空

《AR与VR开发实战》——2.7 3D物体识别

本节书摘来自华章出版社<AR与VR开发实战>一书中的第2章,第2.7节,作者 张克发 赵兴 谢有龙,更多章节内容可以访问"华章计算机"公众号查看. 2.7 3D物体识别 2.5节和2.6节讲解了柱体识别和立方体识别,这两节的内容都只是针对简单几何体进行识别,在本节中,我们将介绍不规则三维物体的识别步骤和方法.1.下载并导入插件登录官网,点击Downloads下的Tools,下载Vuforia Object Scanner (Vuforia物体扫描器).Vuforia Obj

关于PICTUREBOX里绘制运动物体的轨迹的问题

问题描述 刚开始的时候,是用数组存储运动物体的运动坐标,然后绘制到picturebox上,但是后来发现随着时间的延长,数组的大小越来越大,占用的内存太大了,于是就想用缓存的方法,比如picturebox的大小是300*300,那么用一个300*300的bitmap来绘制物体的运动轨迹,然后再到picturebox里显示这个bitmap.那么问题来了:1.如果运动的物体的轨迹范围超出了bitmap的范围怎么办?2.如果用一个更大的bitmap来绘制轨迹,问题就又回到了原点,我到底需要用大多的bit

巩固图像和物体识别领域领导地位:谷歌出新招

Google里有远见的领导者已经向其计算机里注入了他们的愿景. 为了支撑其已经引人瞩目的图像和物体识别领域的领导地位,搜索巨头并购了法国创业公司Moodstocks,该公司擅长于智能手机里的基于机器学习的图像识别技术. "我们的梦想是将摄像头调优成智能传感器来赋予机器眼睛,让它们能够感知周围的环境," Moodstocks在其声明中这么说. Google收购Moodstocks是其"人才并购"中的最新手笔,这样的并购涉及基于机器学习的图像识别,这是计算机视觉领域的核

美国将研究一新技术用来识别和跟踪全球的黑客

已经有无数的例子向我们证明,仅仅进行大规模的监视活动,而不使用有效的算法去分析数据,是无法跟踪并对抗恐怖分子和犯罪嫌疑人的. 去年,美国总统奥巴马签署了美国自由法案也正是因为这一原因,该法案结束了美国情报机构对国内电话数据进行的大规模监视活动. 毫无疑问,美国政府仍在持续不断地监控你的智能手机与互联网中其它任何一个设备之间的通讯信息,但是-- 他们有足够的能力去预测和识别恐怖分子,网络罪犯,国家型黑客的活动吗? 如果他们有这个能力的话,就不会有那么多的网络攻击,数据泄露和恐怖主义攻击的事件发生了