从视频删除地标(非移动对象)

8视图(30天)
阮阮
阮阮 2023年2月28日
回答: Rishav 2023年3月7日
你好,
我有这段代码将一个绿色的盒子在一个视频对象检测。最重要的是认识到白色车在我的视频。下面的代码是:
清晰的所有
关闭所有
clc
% %访问视频
trafficVid = VideoReader (“交通- 27262. - gif”);
gs =阅读(trafficVid 15);
implay (“交通- 27261. mov”);%探索视频
% %开发算法
darkCarValue = 70;
darkCar = rgb2gray(读(trafficVid, 15));
noDarkCar = imextendedmax (darkCar darkCarValue);
imshow (darkCar)
图中,imshow (noDarkCar)
% %
sedisk = strel (“行”20 25);
% sesquare = strel(“广场”,2);
noiseFreeObject = imopen (noDarkCar sedisk);
imshow (noiseFreeObject)
标题(去除噪声后的对象的);
% %应用算法
nframes = trafficVid.NumberOfFrames;
我=读(trafficVid, 1);
taggedCars = 0(((我,1)大小(我,2)3 nframes],类(I));
k = 1: nframes
singleFrame =阅读(trafficVid k);
%转换为灰度形态学处理。
I = rgb2gray (singleFrame);
noDarkCars = imextendedmax(我darkCarValue);
%去除车道标记和其他non-disk形结构。
noiseFreeObject = imopen (noDarkCars sedisk);
%去除小结构通过删除所有像素小于150 px。
noiseFreeObject = bwareaopen (noiseFreeObject, 150);
bw = bwlabel (noiseFreeObject);
统计= regionprops (noiseFreeObject,的边界框(“大小),“重心”);
对象= 1:长度(统计)
bb =数据(对象).BoundingBox;
公元前=数据(对象).Centroid;
矩形(“位置”bb,“EdgeColor”,‘g’,“线宽”2);
结束
图(1)中,imshow (noiseFreeObject [])
结束
我不能上传视频,因为我的视频是在mp4所以我将它转换为gif但我不知道它的工作原理。不管怎样,我的问题是我的代码不仅检测汽车还有其他东西。我试图摆脱它通过使用strel但有些背景对象一样的车所以我只能去掉这部分。
我的问题是是否有更好的方法来摆脱其他对象的视频没有车吗?我想删除不移动的物体,但我不知道怎么做。
提前谢谢你!

答案(1)

Rishav
Rishav 2023年3月7日
删除不移动的视频中的对象的一个方法是使用背景减法。这种方法假设的背景视频移动对象可以被探测到的是静态的,通过比较每一帧与背景。
这是一个修改版本的代码只使用背景减法来检测运动对象:
清晰的所有
关闭所有
clc
% %访问视频
trafficVid = VideoReader (“交通- 27262. - gif”);
% %背景减法
背景=阅读(trafficVid, 1);
k = 2%使用前30帧的背景
背景= imadd(背景、读取(trafficVid k));
结束
背景=背景/ 30;
图,imshow(背景)
% %开发算法
darkCarValue = 70;
sedisk = strel (“行”20 25);
nframes = trafficVid.NumberOfFrames;
我=读(trafficVid, 1);
taggedCars = 0(((我,1)大小(我,2)3 nframes],类(I));
k = 1: nframes
singleFrame =阅读(trafficVid k);
%转换为灰度形态学处理。
I = rgb2gray (singleFrame);
%减去背景来检测运动目标
前景= imabsdiff(我、背景);
阈值= graythresh(前景);
movingObjects = imbinarize(前台、阈值);
noDarkCars = imextendedmax(我darkCarValue);
%去除车道标记和其他non-disk形结构。
noiseFreeObject = imopen (noDarkCars sedisk);
%去除小结构通过删除所有像素小于150 px。
noiseFreeObject = bwareaopen (noiseFreeObject, 150);
%只保留移动的物体
noiseFreeObject = noiseFreeObject & movingObjects;
bw = bwlabel (noiseFreeObject);
统计= regionprops (noiseFreeObject,的边界框(“大小),“重心”);
对象= 1:长度(统计)
bb =数据(对象).BoundingBox;
公元前=数据(对象).Centroid;
矩形(“位置”bb,“EdgeColor”,‘g’,“线宽”2);
结束
图(1)中,imshow (noiseFreeObject [])
结束
现在的代码包含一个背景减法的步骤,计算的第一个30帧视频的平均获得的背景。此背景下然后减去每一帧的视频获得前景面具,突出了移动对象。
movingObjects的面具然后结合noiseFreeObject的面具只保持移动的对象。这应该有助于消除虚假检测从静止的场景中的对象。
您可能需要调整阈值等参数得到最好的结果为您的特定的视频。
更多参考,您可以参考:
  1. 背景减法算法实时视频?-帮助中心- MATLAB和Simulink (m金宝appathworks.com)
  2. 废弃的目标检测

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!