我正在开展图像处理项目,该项目基于使用傅里叶变换获得的信号的仅相位重建的重要性。有关仅相位重建的更多信息,您可以在{{3中看到geometrikal给出的答案}}
现在,我已经检测到来自link的移动物体(请下载1.47 MB视频以测试MATLAB代码(步骤1)点击播放按钮然后(步骤2)右击在视频上然后(步骤3)点击另存为选项)
算法1 建议的方法
要求:从视频中提取的输入图像序列I(x,y,n)(其中x和y是图像尺寸,n表示视频中的帧编号)。
结果:每帧移动物体的分割蒙版
对于输入视频中的每个帧执行步骤2,将第2步结果附加到结果数组'I(x,y,n)'
使用2D高斯滤波器使当前帧平滑
- 对整个序列I(x,y,n)执行3D FFT
使用3D DFT的实部和虚部计算相位谱
使用(公式4.2)计算重建序列Î(x,y,n)
对于输入视频中的每个帧执行步骤7到步骤10以获得每个帧的分段掩码并附加步骤10导致得到的分段掩码阵列BW(x,y,n)'
< / LI>使用平均滤波器平滑重建的Î(x,y,n)帧。
计算当前帧的平均值
- 将当前帧转换为二进制图像
使用平均值作为阈值
进行形态处理,即填充和关闭,以获得当前帧的移动物体的分段遮罩
- 醇>
结束算法。
如果您运行我的MATLAB代码,您可以观察到我在检测每个视频帧中的所有移动对象方面非常成功。但是现在我想通过在相同的代码或算法中进行更改,从当前帧一次检测一个移动对象避免其他移动对象 >。但不明白它是如何完成的。
任何人都可以告诉我
在算法/ MATLAB代码中应该做哪些更改才能进行单车辆跟踪?
注意:如果您遇到问题需要达到方程式4.1和算法的方程式4.2的链接,请按照(Eq.4.1)
中的公式进行操作更新:根据Hugh Sir的建议,我应该尝试标记移动物体,以便跟踪。 但标记主要难点的同时:运行上面的MATLAB代码后,我会看到形态处理后得到的分段帧没有“正确填充”。所以我无法标记它们。可以通过观察二进制图像形式的分段掩模来交叉检查它
tic
clc;
clear all;
close all;
%read video file
video = VideoReader('D:\dvd\Matlab code\test videos\5.mp4');
T= video.NumberOfFrames ; %number of frames%
frameHeight = video.Height; %frame height
frameWidth = video.Width ; %frameWidth
get(video); %return graphics properties of video
i=1;
for t=300:15:550 %select frames between 300 to 550 with interval of 15 from the video
frame_x(:,:,:,i)= read(video, t);
frame_y=frame_x(:,:,:,i);
%figure,
%imshow(f1),title(['test frames :' num2str(i)]);
frame_z=rgb2gray(frame_y); %convert each colour frame into gray
frame_m(:,:,:,i)=frame_y; %Store colour frames in the frame_m array
%Perform Gaussian Filtering
h1=(1/8)*(1/8)*[1 3 3 1]'*[1 3 3 1] ; % 4*4 Gaussian Kernel
convn=conv2(frame_z,h1,'same');
g1=uint8(convn);
Filtered_Image_Array(:,:,i)=g1; %Store filtered images into an array
i=i+1;
end
%Apply 3-D Fourier Transform on video sequences
f_transform=fftn(Filtered_Image_Array);
%Compute phase spectrum array from f_transform
phase_spectrum_array =exp(1j*angle(f_transform));
%Apply 3-D Inverse Fourier Transform on phase spectrum array and
%reconstruct the frames
reconstructed_frame_array=(ifftn(phase_spectrum_array));
k=i;
i=1;
for t=1:k-1
%Smooth the reconstructed frame of Î(x, y, n) using the averaging filter.
Reconstructed_frame_magnitude=abs(reconstructed_frame_array(:,:,t));
H = fspecial('disk',4);
circular_avg(:,:,t) = imfilter(Reconstructed_frame_magnitude,H);
%Convert the current frame into binary image using mean value as the threshold
mean_value=mean2(circular_avg(:,:,t));
binary_frame = im2bw(circular_avg(:,:,t),1.6*mean_value);
%Perform Morphological operations
se = strel('square',3);
morphological_closing = imclose(binary_frame,se);
morphological_closing=imclearborder(morphological_closing); %clear noise present at the borders of the frames
%Superimpose segmented masks on it's respective frames to obtain moving
%objects
moving_object_frame = frame_m(:,:,:,i);
moving_object_frame(morphological_closing) = 255;
figure,
imshow(moving_object_frame,[]), title(['Moving objects in Frame :' num2str(i)]);
i=i+1;
end
toc