Возникли трудности с отслеживанием одного транспортного средства по видео с помощью Matlab?

Я работаю над проектом по обработке изображений, который основан на важности реконструкции только фазы. Для получения дополнительной информации вы можете прочитать ответ, данный geometrikal в https://dsp.stackexchange.com/questions/16462/how-moving-part-pixel-intensity-values-of-video-frames-becomes-доминантноесравнение

Проект состоит из 2 частей.

  1. Обнаружение движущихся объектов из видео о дорожном движении (загрузите видео размером 1,47 МБ ( шаг 1) ) нажмите кнопку воспроизведения, затем (шаг 2) щелкните правой кнопкой мыши видео, затем (шаг 3) нажмите кнопку «Сохранить как»)

  2. Выполните отслеживание любого отдельного движущегося объекта из видео.

Сейчас я вполне успешно справился с 1-й частью проекта. Алгоритм для этого таков:

Алгоритм №1 Предлагаемый подход

Требование: входная последовательность изображений I(x, y, n) (где x и y — размеры изображения, а n — номер кадра в видео), которая извлекается из видео.

Результат: Маска сегментации движущегося объекта для каждого кадра

  1. Для каждого кадра входного видео выполните шаг 2, добавьте результат шага 2 в результирующий массив «I (x, y, n)».

  2. Сглаживание текущего кадра с помощью 2D-фильтра Гаусса

  3. Выполните трехмерное БПФ для всей последовательности I(x, y, n), используя (уравнение 4.1)

  4. Рассчитайте фазовый спектр, используя действительную и мнимую части 3D DFT.

  5. Рассчитайте реконструированную последовательность Î(x, y, n), используя (уравнение 4.2)

  6. Для каждого кадра входного видео выполните шаги с 7 по 10, чтобы получить маску сегментации для каждого кадра, и добавьте шаг 10, чтобы получить результирующий массив масок сегментации BW(x,y,n)».

  7. Сгладьте восстановленный кадр Î(x, y, n) с помощью усредняющего фильтра.

  8. Вычислить среднее значение текущего кадра

  9. Преобразуйте текущий кадр в бинарное изображение, используя среднее значение в качестве порога

  10. Выполните морфологическую обработку, т.е. заполнение и закрытие, чтобы получить сегментированную маску движущегося объекта для текущего кадра.

  11. Конечный алгоритм.

С помощью приведенного выше алгоритма я смог найти все движущиеся объекты из видео. Теперь я хочу перейти ко второй части, т.е. выполнить отслеживание любого отдельного движущегося объекта из видео.

введите здесь описание изображения

Как вы можете видеть на рисунке, я достиг результатов, показанных в 1-м столбце. Я достиг только результатов 1-го столбца. Но моя цель – отследить одно транспортное средство, как показано во 2-м столбце рисунка. (Результаты, показанные во 2-м столбце, были получены с помощью Photoshop)

Так кто-нибудь может мне помочь?

 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

person sagar    schedule 27.05.2015    source источник


Ответы (1)


После того, как вы определили свой объект для отслеживания, примените фильтр Калмана, и вы получите желаемое отслеживание, которое ищете.

Существует довольно много ресурсов, но если вы хотите сделать это вручную, я предлагаю вам использовать объяснение StudentDave на YouTube, оно довольно хорошее. https://www.youtube.com/watch?v=FkCT_LV9Syk

person ABC    schedule 27.05.2015
comment
Спасибо, сэр, за ваш отзыв, но, как вы заметили, я обнаружил все движущиеся объекты в каждом видеокадре. Но теперь я хочу обнаруживать только один движущийся объект за раз из текущего кадра и избегать других движущихся объектов. Итак, какие изменения я должен внести в свой код MATLAB? - person sagar; 29.05.2015
comment
А, это сложнее. Имеет ли значение, за какой машиной вы следите? Если это не так, насколько я помню, strel в Matlab возвращает набор объектов, а также их площади в пикселях - потенциально вы можете изначально выбрать самый большой и просто отслеживать его с помощью фильтра Калмана. В противном случае вам нужно будет определить характеристику конкретного автомобиля, которую вы хотите отслеживать, и внедрить ее в свой алгоритм. - person ABC; 29.05.2015
comment
сэр, я отредактировал свой код и попытался максимально упростить его с помощью значимых имен. Теперь, если возможно, вы могли бы добавить операцию фильтра Калмана в мой код и показать мне отслеживание любого транспортного средства. Итак, не могли бы вы добавить измененный код в поле для ответов? - person sagar; 29.05.2015
comment
Из того, что я могу сказать, в Matlab нет встроенной функции фильтра Калмана. У StudentDave в предоставленной мной ссылке на YouTube есть код Matlab, который вы мог бы добавить в свой проект. Когда у вас есть позиция объекта — центры объектов, перечисленных в вашей переменной se, вы вводите эти точки в свой фильтр. Идея состоит в том, что при заданной позиции ваш фильтр пытается предсказать следующую позицию вашего объекта, а затем выполняет коррекцию на следующем кадре. Если не имеет позиции, он угадывает, где должен быть объект. - person ABC; 29.05.2015
comment
Вы должны вставить этот код для вызова фильтра Калмана после этой строки morphological_closing = imclose(binary_frame,se);. Кстати, если вы не знали, эта линия morphological_closing=imclearborder(morphological_closing); на самом деле более эстетична и не нужна для отслеживания. Вся информация об объекте будет в se. - person ABC; 29.05.2015