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

真正提出有效光流计算方法还归功于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. 【php】 PHP 支持 9 种原始数据类型
  2. Elasticsearch: Five Things I was Doing Wrong
  3. 今天来谈谈内容溢出和文字溢出的问题
  4. phpstudy for linux版环境安装
  5. Android软件开发之SharedPreferences
  6. OCRKit Pro for mac (OCR文字识别工具)
  7. 我对 SRE 的理解
  8. 车载系统不识别 U盘
  9. scrollTop如何实现click后页面过渡滚动到顶部
  10. matlab安装前有兼容性问题,matlab安装及问题解决
  11. win10系统中的截图,win+prtSc保存位置
  12. python吃显卡还是内存条_内存条与显卡金手指氧化了解决方法
  13. EMV规范(五)——脱机数据认证
  14. 微信小程序系列4——传值详解
  15. 深耕图形领域,华为HMS Core图形计算服务提升图形应用表现
  16. java洁癖_如何平衡代码洁癖和项目进度?
  17. 首页 干货教程 大数据动向 大数据应用 数据可视化 数据分析 投资并购 企业专区 注册 登录 随机森林入门攻略(内含R、Python代码)
  18. IOS学习之路二十四(custom 漂亮的UIColor)
  19. 麦克马斯特大学计算机系褚令洋招收硕士生、博士生啦!
  20. Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)

热门文章

  1. Linux操作系统-标准IO库(3)
  2. 为什么这个92年的小哥从实习生到P8级技术Leader只用了6年
  3. Flink KafkaSink
  4. [推荐] 最新手机号段归属地数据库(2015年11月) 根据手机号 查询所在地 省份 城市 县城
  5. Mac安装mysql没有提示初始密码解决办法,看完你会无地自容的一篇博客
  6. 赛马网基本算法之--上台阶
  7. Oracle多表联合查询
  8. 谈广告很难?友链交换不好找?有神器
  9. vmware虚拟机安装Linux Mint 20全过程
  10. 学生成绩查询系统需求规格说明书