这篇文章记录一些关于matlab的MHI代码,实我同学发给我让我瞅瞅的
MHI是啥我就不说了,有兴趣可以参考下面的文章。
https://blog.youkuaiyun.com/m0_37692953/article/details/81585552
然后主要是要生成一个有灰度变化的动作图
看起来很酷炫的那种
下面的部分是我同学发给我的,估计也是从网上找的代码,但是也很好理解
我找不到这个代码源地址,如果作者看到了不愿意随时联系我删除
% 获取视频
video = VideoReader('PS7A2P1T1.avi');
% 得到视频帧数
numFrames = video.NumberOfFrames;
% 构建结构体,包括两个域cdata数据(返回一个视频高度X视频宽度的三维0矩阵, 类型为uint8)和colormap颜色(默认)
frames(1: numFrames) = struct('cdata', zeros(video.Height, video.Width, 3, 'uint8'), 'colormap', []);
binary = zeros(video.Height, video.Width, numFrames - 1); % 返回视频高度X宽度的numframes - 1
维0矩阵
mhi = zeros(video.Height, video.Width, numFrames - 1); % 同上
f = fspecial('gaussian', [4 4], 10); % 用
fspecial生成的一个标准差为10,大小为4 * 4
的高斯模板矩阵用于下面的imfilter滤波操作
for k = 1: numFrames
% 灰度化后的每帧图像作为输入,f作为滤波模板,边界选项为replicate
frames(k).cdata = imfilter(rgb2gray(read(video, k)), f, 'replicate');
end
t = 0.15; % 差异阈值,变大,背景噪声消失,但过大会导致运动区域中心出现空洞
for i = 2:numFrames
diff = frames(i).cdata - frames(i - 1).cdata;
binary(:,:, i - 1) = (im2bw(diff, t)); % im2bw将灰度图像diff转化为二进制图像,阈值等级为t = 0.15
mhi(:,:, i) = 60 * binary(:,:, i - 1);
for j = 1:video.height
for k = 1:video.width
if (mhi(j, k, i) == 0)
mhi(j, k, i) = max(0, mhi(j, k, i - 1) - 2); % δ = 2,δ变大,较早发生运动的部分消除得更多
end
end
end
end
implay(mhi)
没找到matlab代码咋插入。。就这样吧
它的显示结果不是很好,一个是不分明,另外是灰度没有变化。
其实改的很简单,加两个uint8就行了
imshow(uint8(mhi(:, :, numFrames)))
implay(uint8(mhi))
简单来说就是,原来是double类型的,imshow()只能显示两种格式,一种是uint8一种是double,如果显示出来是个二值图像,没有灰度变化,说明是按double来show的
所以加个imshow(unit8(balabal))
嗯,学到的就是这些