用MATLAB实现对运动物体识别与跟踪
来源:互联网 发布:如何提高淘宝试用 编辑:程序博客网 时间:2024/06/05 10:56
不得不说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; endend
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 endendu=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;endrgb = [255 0 0]; % 边框颜色lineSize = 3; % 边框大小,取1,2,3windowSize(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;endresult = 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 endendstate = 1;if showOrNot == 1 figure; hold on; imshow(result);end
追踪效果:
时间:
注(画框函数引用网上现有的)
可能是matlab问题,这段视频为4K,无法直接读取,所以只能将其转化为图片逐帧读取。
结果是还是太慢,而且不能预读取,好像用这个无法实时,可能与图片为4k也有点关系有点伤
- 用MATLAB实现对运动物体识别与跟踪
- 运动物体跟踪与计数
- 基于opencv3实现运动物体识别
- 视频中对多目标运动物体跟踪的算法解析
- OpenGL视点跟踪物体运动
- Matlab图像序列中的运动目标检测与跟踪
- opencv--颜色物体识别跟踪
- 对视频序列的 运动检测 目标跟踪(运动目标的检测与跟踪)
- 转:运动物体跟踪的camshift算法
- 运动物体跟踪的camshift算法
- 基于camshift的运动物体跟踪分析
- 运动物体跟踪的camshift算法
- OpenCV 运动物体跟踪的camshift算法
- 运动物体跟踪的camshift算法
- OpenCV:运动物体跟踪处理流程
- 视频跟踪分割运动中的物体
- 运动分析和物体跟踪Video
- 视频监控中运动物体检测与跟踪----相邻帧差法和三帧差法
- TabLayout与ViewPager组合
- 在使用vue-router遇到的问题以及解决办法
- 初始Windows程序 示例二
- Sublime JSHint安装
- 商品销售政策
- 用MATLAB实现对运动物体识别与跟踪
- .NET中的单元测试
- LR之识别图片验证码
- 替换空格
- 电影,趁心情不美丽
- MNIST数据集转为.jpg图片格式
- python学习链接(定期添加)
- JavaScript高级程序设计笔记-函数表达式
- linux 默认的include