1.算法模拟效果 matlab2022a仿真结果如下:
2.算法涉及理论知识概述 1950年,Gibson首先提出了光流的概念。所谓光流是指图像表达运动的速度。人眼之所以能在运动时察觉到物体,是因为当物体运动时,会在人的视网膜上形成一系列连续变化的图像。好像有一种光流过,所以叫光流。光流法检测运动物体的原理:首先,为图像中的每个像素分配一个速度矢量(光流),从而形成光流场。如果图像中没有运动物体,则光流场是连续且均匀的。如果存在运动物体,则运动物体的光流与图像的光流不同,光流场不再连续均匀。因此,可以检测移动物体及其位置。 应用背景: 根据图像前景和背景的运动,检测视频的变化,利用视频中像素的变化来确定观察成像平面上空间运动物体的像素运动的瞬时速度。时域图像序列和相邻帧之间的相关性。它是一种寻找前一帧和当前帧之间的对应关系,从而计算相邻帧之间物体运动信息的方法。可用于检测移动和晃动的物体 关键技术: 当人眼观察运动的物体时,物体的景物在人眼的视网膜上形成一系列连续变化的图像。这一系列不断变化的信息不断“流”过视网膜(即像平面),就像光线“流”一样,所以称为光流。 光流(Optical flow或光流)是关于视场内物体运动检测的概念。用于描述由相对于观察者的运动引起的被观察物体、表面或边缘的运动。光流在模式识别、计算机视觉和其他图像处理领域非常有用。它可用于运动检测、物体切割、计算碰撞时间和物体膨胀、运动补偿编码、或通过物体表面和边缘进行三维测量等。 光流场是指由图像中所有像素组成的二维(2D)瞬时速度场,其中二维速度矢量是场景中可见点的三维速度矢量在图像上的投影。成像表面。 因此,光流不仅包含了被观察物体的运动信息,还包含了丰富的场景三维结构信息。 光流的概念:(光流或光流) 它是一种运动模式,是指观察者(例如眼睛、相机等)与背景在某一视角下的物体、表面或边缘之间的明显运动。光流技术,例如运动检测和图像分割、时间碰撞、运动补偿编码和3D 立体视差,都是利用这种边缘或表面运动的技术。 2D 图像的运动是3D 物体相对于观察者的运动在图像平面上的投影。 有序图像允许估计2D 图像的瞬时图像速率或离散图像传输。 光流算法: 它评估两幅图像之间的变形,其基本假设是体素和图像像素是守恒的。它假设对象的颜色在两帧之间不会发生显着且明显的变化。基于这个思想,我们可以得到图像约束方程。不同的光流算法在假设不同附加条件的情况下解决光流问题。 卢卡斯-卡纳德算法: 该算法是最常见和流行的。它计算时间t 到t + t 时两帧之间每个像素位置的移动。由于它基于图像信号的泰勒级数,因此这种方法称为差分,即对空间和时间坐标使用偏导数。 图像约束方程可写为I (x ,y ,z ,t )=I (x + x ,y + y ,z + z ,t + t ) I(x, y, z, t) 是(x, y, z) 位置处的体素。 我们假设运动足够小,那么利用泰勒公式对图像约束方程,我们可以得到:
3.MATLAB核心程序 im1=rgb2gray(im1); 结尾 如果大小(大小(im2),2)==3 im2=rgb2gray(im2); 结尾
im1=双精度(im1); im2=双精度(im2); im1=imgaussfilt(im1,2); im2=imgaussfilt(im2,2);
u=零(大小(im1)); % 创建u 和v 矩阵 v=零(大小(im2));
IxMask=[-1 1; -1 1]; % 创建X 导数过滤器 Iy掩码=[-1 -1; 1 1]; % 创建Y导数过滤器
ItMask_1=[-1 -1; -1 -1]; %创建时间导数的两个过滤器 ItMask_2=[1 1; 1 1];
im1x=conv2(im1, IxMask,'相同'); im2x=conv2(im2, IxMask,'相同'); im1y=conv2(im1, IyMask,'相同'); im2y=conv2(im2, IyMask,'相同');
im1t=conv2(im1, ItMask_1,'相同'); im2t=conv2(im2, ItMask_2,'相同');
Ix=(im1x + im2x) https://www.qjson.cn/article/2; Iy=(im1y + im2y) https://www.qjson.cn/article/2; 它=(im1t + im2t) https://www.qjson.cn/article/2;
newnumb1=大小(im1,1) - mod(大小(im1,1),windowSize); newnumb2=大小(im1,2) - mod(大小(im1,2),windowSize);
对于i=1 : newnumb1 - 窗口大小 对于j=1 : newnumb2 - 窗口大小
Ixwindow=Ix(i : i + 窗口大小, j : j + 窗口大小); Iywindow=Iy(i : i + 窗口大小, j : j + 窗口大小); Itwindow=It(i : i + 窗口大小, j : j + 窗口大小);
Ixwindow=重塑(Ixwindow , [1 , 大小(Ixwindow,1)^2 ])'; Iywindow=重塑(Iywindow , [1 , 大小(Iywindow,1)^2 ])'; Itwindow=reshape(Itwindow , [1 , size(Itwindow,1)^2 ])';
A=[Ixwindow Iywindow]; B=It窗口; [输出]=inv(A'*A)*A'*B;
u(i, j)=输出(1); v(i, j)=输出(2);
结尾 结尾 u(isnan(u))=0; v(isnan(v))=0; (责任编辑:蚂蚁团队) |