光流法指的是一种简单实用的图像运动的表达方式,通常定义为一个图像序列中的图像亮度模式的表观运动,即空间物体表面上的点的运动。光流的研究是利用图像序列中的像素强度数据的时域变化和相关性来确定各自像素位置的"运动",即研究图像灰度在时间上的变化与景象中物体结构及其运动的关系。速度在视觉传感器的成像平面上的表达。

真正提出有效光流计算方法还归功于Horn和Schunck在1981年创造性地将二维速度场与灰度相联系,引入光流约束方程的算法,是光流算法发展的基石。

本文使用的就是这种算法。

原视频

识别结果

图中红色小箭头即是通过HS算法得出的像素点矢量。

附代码:

main.m

注:GPU在图像处理(单精度运算)的性能远超CPU,因此使用gpuarray()函数将矩阵置于GPU运算大幅提高程序运行速度,此功能仅N卡支持,若设备无N卡将该函数注释即可。


% 基于Horn-Schunck算法的计算在视频中显示光流
% alpha是权重因子
% N是迭代次数
close all;clc;%清除命令窗口videopath='C:\Users\Administrator\Desktop\work2\video\';%视频帧路径
alpha = 0.5;
N = 50;%值越大精度越高,计算速度越慢
% 将视频读取到对象
vidObj = VideoReader('sample.avi');% 获取第一帧
if hasFrame(vidObj) % matlab自带函数,确定是否有视频帧读取Fr1 = rgb2gray(readFrame(vidObj));%读取一个视频帧并转换为灰度图Fr1 = im2single(Fr1);%将图像转换为单精度值Fr1 = gpuArray(Fr1);%将矩阵数据置于显卡中运算
elsereturn
end
k=0;
while hasFrame(vidObj)%当有视频帧时Fr2 = rgb2gray(readFrame(vidObj)); % 读取下一帧并转换为灰度图Fr2 = im2single(Fr2);%将图像转换为单精度值Fr2 = gpuArray(Fr2);%将矩阵数据置于显卡中运算k=k+1;% 通过HS算法计算U、V[U, V] = HS(Fr1, Fr2, alpha, N);% 显示框架和光流figure(1);imshow(Fr1,[]); %显示一帧hold on;axis image; % 将子框架设置为相同大小showOF(U, V); %函数showOF显示流速矩阵U、V的光流k1=num2str(k);filename=[k1,'.jpg'];saveas(1,[videopath,filename]);hold off;Fr1 = Fr2; % Fr2成为下一序列的第一帧endcd(videopath); %读取所有的jpg图片
allnames = struct2cell(dir('*.jpg'));
[difgrayFrame,len]=size(allnames);
aviobj = VideoWriter('C:\Users\Administrator\Desktop\work2\save_video2.avi');%视频存储位置
aviobj.FrameRate = 25; %设置帧率open(aviobj) %制作视频
for i = 1:kname = [num2str(i),'.jpg'];frame = imread(name);writeVideo(aviobj,frame);
end
close(aviobj)

derivative.m

function [Ex, Ey, Et] = derivative(Im1, Im2)
% 函数DERIVATIVE计算偏导数Ex、Ey、Et
% 双类别的两幅图像Im1、Im2的序列。% 卷积核
Kx = 0.25 * [-1 1; -1 1];
Ky = 0.25 * [-1 -1; 1 1];
Kt = 0.25 * [-1 -1; -1 -1]; % kt1 = Kt, kt2 = -Kt% 计算偏导数
Ex = conv2(Im1, Kx, 'same') + conv2(Im2, Kx, 'same');
Ey = conv2(Im1, Ky, 'same') + conv2(Im2, Ky, 'same');
Et = conv2(Im1, Kt, 'same') + conv2(Im2, -Kt, 'same');

HS.m(算法核心)

function [U, V] = HS(Im1, Im2, alpha, N)%函数HS算法计算两幅图像序列的流速U、V
%基于Horn-Schunck算法的双类Im1、Im2。
%alpha是加权因子和N是迭代次数。% 计算偏导数
[Ex, Ey, Et] = derivative(Im1, Im2);% 初始 U, V
[l, c] = size(Im1);%获取数组大小l行c列
U = zeros(l, c);%零矩阵
V = zeros(l, c);K = [1/12 1/6 1/12; 1/6 -1 1/6; 1/12 1/6 1/12]; % 拉普拉斯卷积核
A = alpha^2 + Ex.^2 + Ey.^2;for i = 1:N% 计算U、V平均值U_avg = conv2(U, K, 'same');%返回U与K卷积中大小与U相同的中心部分V_avg = conv2(V, K, 'same');B = (Ex.*U_avg + Ey.*V_avg + Et);% 计算当前迭代的U、VU = U_avg - Ex.*B./A;V = V_avg - Ey.*B./A;
end

showOF.m

function showOF(U, V)
% 函数showOF显示流速矩阵U、V的光流[l,c] = size(U);
d = 5; % 步幅
IndX = 1:d:l;
IndY = 1:d:c;
[X,Y] = meshgrid(IndY, IndX);%二维网格
U1 = U(IndX, IndY);
V1 = V(IndX, IndY);
%在由 X 和 Y 指定的笛卡尔坐标上绘制具有定向分量 U 和 V 的箭头。
quiver(X, 720-Y, U1(end:-1:1,:), V1(end:-1:1,:), 3,Color='r');

识别结果:

matlab光流法实例

(原视频见上一篇博客)

matlab光流法图像识别实例相关推荐

  1. matlab 光流法工具箱,MatlabToolBox-PIV Special Effects 图形图像处理 267万源代码下载- www.pudn.com...

    文件名称: MatlabToolBox-PIV下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 4944 KB 上传时间: 2016-11-25 下载次数: ...

  2. matlab光流法前景分割,使用高斯模型去除背景

    使用高斯模型去除背景 收录时间:2014-07-24 资源分类:Matlab 工具:MATLAB 7.11 (R2010b) 单高斯分布背景模型适用于单模态背景情形,它为每个图像点的颜色分布建立了用单 ...

  3. 【车辆计数】基于matlab光流法行驶车辆检测计数【含Matlab源码 627期】

    ⛄一.光流场简介 1 案例背景 运动视觉研究的内容是如何从变化场景中的一系列不同时刻的图像中提取有关场景中物体的形状.位置和运动的信息.根据研究的方法,它可以分为两类:基于特征的方法和基于光流场的方法 ...

  4. matlab 光流法工具箱,光流法%matlab笔记

    已经跑通 但是subplot(223)里本来是处理后的前景图像掩膜,但是显示不太好,等过一阵儿改进一下. 这个可能会碰到那个computeColor的错误,找一下那个compute.m文件放到文件夹里 ...

  5. 光流金字塔 matlab,【matlab】光流法

    光流法 光流法是一种目标跟踪与检测中的一种经典的方法 由 灰度不变形 约束条件(一阶梯度.高斯梯度.区域匹配.频率域) 两部分组成 实现1:opticalFlow syntax&paramet ...

  6. 【老生谈算法】matlab实现金字塔LK光流法源码——金字塔LK光流法

    基于金字塔LK光流法的MATLAB代码 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于金字塔LK光流法的MATLAB代码.docx ...

  7. Python人工智能实例 │ 使用Haar级联进行人脸检测、使用CAMShift算法、光流法进行人脸追踪

    使用Haar级联进行人脸检测 使用CAMShift算法进行人脸追踪 使用光流法进行人脸追踪 01.背景知识 1.1●Haar级联简介 Haar级联是基于Haar特征的级联分类器.那么级联分类器是什么? ...

  8. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  9. 光流法 Optical Flow

    最近调研目标跟踪,看到一个光流法,测试了一下它的效果,挺好玩的,这里对找到的资料简单整理总结一下. 对于光流法的介绍,可以参看如下博客http://blog.csdn.net/zouxy09/arti ...

最新文章

  1. 相移波束形成算法的MATLAB仿真
  2. 二级路由dhcp关闭连不上wifi_酒店网络故障:原来还与DHCP服务器有关
  3. c语言程序输出时有没有分号,问什么C程序里总是提示缺少分号;,而明明有分号?...
  4. 学习Direct3D(五)应用程序入口
  5. oracle in like组合,IN操作符与LIKE子句-各种查询
  6. Java SE书籍推荐
  7. JZOJ7月18日提高组T1 Family
  8. vue中获取屏幕高度(封装使用)
  9. 富文本编辑器 可全屏可粘贴(只能单独粘贴图片或文字)
  10. 数据结构 严蔚敏 迷宫求解 代码
  11. here i am(歌手BryanAdams的歌曲)
  12. 人生需有三心境,你有吗?
  13. R语言--rep函数
  14. rabbitMQ的使用概述及使用rabbitMQ进行短信验证码发送案例
  15. iOS动态库实现插件化
  16. XML 架构示例(微软文档)
  17. uni-app 学习笔记 黑马优购商城
  18. 雨中竞速,本周F1DeltaTime大奖赛带你清凉一下
  19. tinker board 2s开发板 gt911 触摸屏调试记录
  20. 怎么样使用计算机新建文件,电脑初学者如何新建和使用文件夹

热门文章

  1. android手机助手拷贝文件至pc上失败的解决方式
  2. 斐波那契数列和的java编程
  3. 对常见的三个免费数据库软件的一些个人看法
  4. eclipse入门教程(下载安装,配置,项目 包 类的创建,运行方式,常见问题:删除工程 乱码问题 文档注释快捷生成等,常用快捷键)
  5. Linux下Desktop文件入门
  6. 创意盛宴——2011米兰国际家具展
  7. 怎样走向优秀设计师之路
  8. python爬虫百度图片_python3爬取百度图片(2018年11月3日有效)
  9. java封装264成flv,FLV视频封装格式详细解析
  10. heartbeat: ha.cf配置文件(转载,感谢原创)