【MATLAB源码】机器视觉与图像识别技术(6)---帧差法和videoinput视频读取

§ꦿCFོ༉ 2024-08-19 14:31:02 阅读 55

系列文章目录

第一篇文章:【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载)

第二篇文章:【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础

第三篇文章:【MATLAB源码】机器视觉与图像识别技术(2)续—图像分割算法

第四篇文章:【MATLAB源码】机器视觉与图像识别技术(3)—数字形态学处理以及图像特征点提取

第五篇文章:【MATLAB源码】机器视觉与图像识别技术(4)—模式识别与视觉计数

第六篇文章: 【MATLAB源码】机器视觉与图像识别技术(5)—BP神经网络和视觉标定

第七篇文章:【MATLAB源码】机器视觉与图像识别技术实战示例文档—鱼苗面积预测计数


二帧差法

一、含义二、帧差法基本原理思想:三、帧差法基本操作步骤:

1.图像获取:2.图像预处理:3.二帧间差计算:4.确定阈值5.应用形态学操作(如膨胀、腐蚀)来去除噪声。四、示例讲解和代码开源

示例一示例二总结


一、含义

图像处理中的帧差法是一种用于视频分析的基本技术,主要用于检测和提取视频序列中两帧之间的变化,从而实现运动检测、目标跟踪等目的。帧差法的基本思想是通过计算相邻帧之间的像素差异来判断图像中是否存在运动物体或变化区域。当两帧之间的像素差异超过预设阈值时,认为该像素点发生了变化,这种变化通常表示图像中的某个区域有物体移动或者场景发生了变化。


二、帧差法基本原理思想:

对于连续的图像帧 [t-1, t],通过计算相邻两帧之间的像素差值来检测运动区域。具体来说,在一段视频中,背景通常保持稳定,而移动的物体会导致其所占区域的像素值发生显著变化。帧差法利用这一特点,通过对比两帧图像中对应像素的灰度值或颜色值,找到变化超过预设阈值的像素点,从而识别出运动区域。如下图所示,简单的理解完帧差法,这种方法简单高效,适用于各种实时运动检测应用。

在这里插入图片描述

其中F(x,y)表示某一运动物体,在(x,y)坐标位置上的一帧图片。

三、帧差法基本操作步骤:

1.图像获取:

(1)第一种图片获取就是通过外部视觉传感器读取视频的连续两帧图像[t-1,t],根据帧率连读读取外部视频。

示例代码如下:

<code>vidObj = VideoReader('D:\z\机器视觉课程\动车.mp4'); % 创建一个视频读取对象,用于读取视频文件

(2)第二种已有传感器连续拍到的大量连续帧数的数据图片,并非视频格式存在,需要我们根据路径进行读取。

示例代码如下:

a = 'D:\8\7 (4) 001.jpg'; % 定义第一个输入图像的路径

for z = 1001:1470 % 循环处理从1001到1470的图像

zz = num2str(z); % 将当前数字转换为字符串

a(12:14) = zz(2:4); % 更新输入图像路径中的编号部分

a0(12:14) = zz(2:4); % 更新输出图像路径中的编号部分

b = imread(a); % 读取当前图像

2.图像预处理:

首先将两帧图像转换为灰度图像,目的主要是为了(1)简化计算。因为彩色图像有红、绿、蓝(RGB)三个颜色通道,每个像素有三个值。如果处理彩色图像,计算量会增加三倍。灰度图只有一个通道,每个像素只有一个值,所以计算更快。其次还有其他原因:(2)更容易比较:因为帧差法只关心亮度的变化,而不是颜色。灰度图只表示亮度,计算帧之间的差异更简单。(3)减少噪声干扰:彩色图像的噪声会出现在各个颜色通道中,灰度图将这些信息统一处理,减少噪声干扰。(4)更稳定:灰度图只关心亮度变化,使得检测结果更一致,不容易被颜色变化影响。

处理操作代码如下:灵活运行,通过截取目标区域进行灰度化,真正看清固定区域运动目标的变化。

c = b(200:900, 450:800, :); % 裁剪图像的一个子区域

d = rgb2gray(c); % 将裁剪后的子区域转换为灰度图像

3.二帧间差计算:

计算两帧之间的差异,用后一帧的像素值减去前一帧的像素值。进行帧差计算,首先先进行数据转换,因为读取的图片基本为Uint8类型,计算前需要转化为double类型,之后再取绝对值。

diff = abs(double(gray1) - double(gray2));

4.确定阈值

通过阈值操作将差异图像二值化,获得运动区域。那么如何确定帧差阈值?确定帧差阈值没有一个固定的方法,它需要根据具体的应用场景和视频内容来调整。一般来说,需要考虑以下因素:

(1)视频噪声: 如果视频中存在较多的噪声,那么帧差阈值需要设置得高一些,以避免噪声被误判为运动。

(2)运动速度: 如果视频中物体的运动速度很快,那么帧差阈值需要设置得低一些,确保能够检测到快速的运动。

(3)目标大小: 如果视频中的目标物体比较小,那么帧差阈值需要设置得低一些,以避免目标被忽略。

(4)光照变化: 如果视频中光照变化较大,那么帧差阈值需要设置得高一些,以避免光照变化被误判为运动。

大多时候,我们都是根据下列方法确定帧差阈值的:

(1)经验值: 根据经验设置一个合适的阈值,并根据实际情况进行调整,就是查看图片效果,手动修改阈值。

(2)自适应阈值: 根据视频内容的自适应性地调整阈值,例如使用 Otsu 算法或自适应阈值方法。

level = graythresh(diff); % 使用 Otsu 算法计算最佳阈值

(3)统计分析: 对视频数据进行统计分析,确定一个合适的阈值,例如计算图像的方差或标准差。

5.应用形态学操作(如膨胀、腐蚀)来去除噪声。

根据实际情况的需要,如果图像效果欠佳,则需要运用相应的形态学操作来优化图像质量。这些操作能够有效提升图像的清晰度和对比度,使后续的处理过程更加准确和可靠。


四、示例讲解和代码开源

示例一

示例将以火车正面行驶的视频进行目标监测。视频已上传资源里面的,欢迎各位大佬下载指正。

在这里插入图片描述

接下来就是根据我上面的步骤一一进行,读取图片进行处理,作为背景分析方法的帧差法,就是观测运动目标像素和亮度变化。根据我所给出的图片读取方式进行:接下来我将以第一种进行示例,读取视频进行读帧运算。

示例代码如下:

<code>clc

close all

clear all

% 初始化视频捕获对象

vidObj = VideoReader('D:\z\机器视觉课程\动车.mp4'); % 创建一个视频读取对象,用于读取视频文件

z=0;

frame1 = readFrame(vidObj); % 读取视频的第一帧

gray1 = rgb2gray(frame1); % 将第一帧转换为灰度图像

while hasFrame(vidObj) % 当视频中还有帧时,循环执行

z=z+1;%作为计数标志

frame2 = readFrame(vidObj); % 读取下一帧

gray2 = rgb2gray(frame2); % 将该帧转换为灰度图像

diff = abs(double(gray1) - double(gray2)); % 计算两帧之间的绝对差异

level = graythresh(diff); % 使用 Otsu 算法计算最佳阈值

thresh = diff > 20; % 对差异图像进行阈值二值化,差异大于设定的阈值的像素设为1,其余设为0

imwrite(thresh, sprintf('D:\\z\\机器视觉课程\\7 (4)\\z%d.jpg', z));% 将二值化图像保存到指定路径

% 将二值化差异图像保存到输出文件

gray1 = gray2; % % 将当前帧设置为上一帧,以便进行下一帧的比较

end

release(vidObj); % %关闭视频文件,释放视频读取对象

结果显示:

在这里插入图片描述

根据上面结果显示运动的目标,有所变化,为了更方便观测运动目标,可以做一个裁剪运算,并记录下运动目标白色像素的数量变化,代码修改如下图所示,帧差变化

在这里插入图片描述

代码里面,我并没有做形态学的操作,原理的一样,根据已有的形态学基础,可自行根据需求添加,过多的就不赘述了(哈哈哈哈哈哈)。

示例二

第二就是根据已有的大量数据图片,进行读取解决。本次图片数据是摇摆的小球

在这里插入图片描述

示例代码如下:

<code>a = 'D:\8\7 (4) 001.jpg'; % 定义第一个输入图像的路径

a0 = 'D:\8\7 (4) 001bw.jpg'; % 定义第一个输出图像的路径

for z = 1001:1750 % 循环处理从1001到1750的图像

zz = num2str(z); % 将当前数字转换为字符串

a(12:14) = zz(2:4); % 更新输入图像路径中的编号部分

a0(12:14) = zz(2:4); % 更新输出图像路径中的编号部分

b = imread(a); % 读取当前图像

c = rgb2gray(b); % 将图像转换为灰度图像

if z == 1001

c0 = c; % 如果是第一个图像,存储为参考图像c0

else

d = double(c) - double(c0); % 计算当前图像与参考图像之间的差异

d0 = abs(d) > 10; % 将差异图像二值化,根据阈值10判断像素是否显著变化

imwrite(d0, a0); % 将二值化差异图像保存到输出文件

c0 = c; % 更新参考图像为当前图像,以便下一次计算使用

end

end

结果如下所示:

在这里插入图片描述

接下来就可以根据图的效果,计算白色像素的变化,确定坐标移动变化,在标定纸上,就可以确定小球的摆动幅度,就可以获取大量数据坐标,进行最小二乘法拟合,得到了小球的运动轨迹了。

总结

通过上面大介绍,大概二帧差法的原理和步骤就是这样,我也是从基础跟大家讲起,算法比较简单易懂,如果有什么讲的不好的希望大佬们指正,谢谢!最后哈哈哈哈哈,还是希望,能给我点赞收藏关注一下,真的非常谢谢咯,最后后续看看还有什么可以讲解的,后续进行分享。别忘了点赞!!!!!!哈哈哈哈哈哈,下期见



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。