一、簡介
核跟蹤方法是目標跟蹤的主要方法, 應用非常廣泛。例如Meashift、Camshift 算法, 它直接運用最速下降法的原理, 向梯度下降方向對目標模板逐步迭代, 直到迭代到最優位置。它的核心就是一步一步迭代尋找最優點, 在跟蹤中, 就是爲了尋找相似度值最大的候選區間。
本文主要介紹基於Meashift算法的目標跟蹤的MATLAB實現,原理不再詳細解釋,具體原理可以參考文章結尾處的參考文獻。
二、代碼內容
1.載入圖片,獲取圖片參數。
2.初始化跟蹤器,在第一幀圖片中手動框出跟蹤目標。
3.定義目標模板的顏色模型,計算顏色概率分佈。
-----------進入循環----------
4.計算上一幀目標中心位置的概率分佈,即候選模型。
5.計算目標模型和候選模型之間的相似程度。
6.計算候選模型區域每個像素點的權重。
7.計算meanshift vector得到新的候選中心位置。
8.計算新的候選模型和相似度。
9.得到相似度最大的候選位置作爲當前目標中心位置。
三、MATLAB代碼實現
clc
clear all
close all
%% 載入圖片
imPath = 'car'; imExt = 'jpg'; %定義文件路徑
%檢查圖片文件路徑是否存在
if isdir(imPath) == 0
error('USER ERROR : The image directory does not exist');
end
%載入路徑中的文件
filearray = dir([imPath filesep '*.' imExt]); % 獲取目錄下所有文件
NumImages = size(filearray,1); %圖片數量
if NumImages < 0
error('No image in the directory');
end
disp('Loading image files from the video sequence, please be patient...');
%獲取圖片參數
imgname = [imPath filesep filearray(1).name]; %獲取圖片名
I = imread(imgname);
VIDEO_WIDTH = size(I,2);
VIDEO_HEIGHT = size(I,1);
ImSeq = zeros(VIDEO_HEIGHT, VIDEO_WIDTH, NumImages);%讀取目錄下全部圖片
for i=1:NumImages
imgname = [imPath filesep filearray(i).name]; %獲取圖片名
ImSeq(:,:,i) = imread(imgname); %放入所有圖片
end
disp(' ... OK!');
%% 初始化跟蹤器
%在第一幀圖片中框出感興趣區域作爲跟蹤目標
% 使用函數imcrop手動初始化,框出跟蹤目標,該函數用於返回圖像的一個裁剪區域。可把圖像顯示在一個圖像窗口中, 並允許用戶以交互方式使用鼠標選定要剪切的區域。
[patch, rect] = imcrop(ImSeq(:,:,1)./255);%rect輸出左上角橫縱座標 寬度 高度
%獲取ROI參數(中心點座標/寬度/高度),ROI(region of interest),感興趣區域
ROI_Center = round([rect(1)+rect(3)/2 , rect(2)+rect(4)/2]);
ROI_Width = rect(3);
ROI_Height = rect(4);
rectangle('Position', rect, 'EdgeColor','r');%畫矩陣框出初始目標位置
%**********MEANSHIFT跟蹤算法**********
%%首先定義目標的顏色模型,計算顏色概率分佈
% compute target object color probability distribution given the center and size of the ROI
imPatch = extract_image_patch_center_size(ImSeq(:,:,1), ROI_Center, ROI_Width, ROI_Height);
%該函數截取了感興趣區域的顏色數據
%RGB顏色空間中的顏色分佈
Nbins = 8;
TargetModel = color_distribution(imPatch, Nbins);%以上函數用來計算目標模型的qu概率密度
%
figure('name', 'Mean Shift Algorithm', 'units', 'normalized', 'outerposition', [0 0 1 1]);
prev_center = ROI_Center;
disp(prev_center);
for n = 2:NumImages
%讀取下一幀圖片
I = ImSeq(:,:,n);
while(1)
% STEP 1
% 計算上一幀目標中心位置的PDF,即候選模型
imPatch = extract_image_patch_center_size(I, prev_center, ROI_Width, ROI_Height);
ColorModel = color_distribution(imPatch, Nbins);
% 計算目標模型和候選模型之間的相似程度-bhattacharyya距離
rho = compute_bhattacharyya_coefficient(TargetModel, ColorModel);
% STEP 2, 3
% 計算候選模型區域每個像素點的權重
weights = compute_weights_NG(imPatch, TargetModel, ColorModel, Nbins);
% 計算mean-shift vector得到新的候選中心位置
z = compute_meanshift_vector(imPatch, prev_center, weights);
new_center = round(z);
% STEP 4, 5計算新的候選模型和相似度
imPatch2 = extract_image_patch_center_size(I, new_center, ROI_Width, ROI_Height);
ColorModel2 = color_distribution(imPatch2, Nbins);
% 相似度
rho2 = compute_bhattacharyya_coefficient(TargetModel, ColorModel2);
while(rho2<rho)%當移動後的候選位置相似度小於移動前的時候 進行以下迭代搜索
new_center = (prev_center+new_center)/2;
imPatch2 = extract_image_patch_center_size(I, new_center, ROI_Width, ROI_Height);
ColorModel2 = color_distribution(imPatch2, Nbins);
rho2 = compute_bhattacharyya_coefficient(TargetModel, ColorModel2);% 相似度
end
% STEP 6
if norm(new_center-prev_center, 1) < 0.0001
break
end
prev_center = new_center;
end
disp(new_center);
subplot(1,1,1); imshow(I, []);
hold on;
plot(new_center(1), new_center(2) , '+', 'Color', 'r', 'MarkerSize',10);
drawnow;
end
(這個代碼格式也太醜了== 哪位兄弟知道怎麼整的好看一點)
運行結果:
圖1 第一幀手動框定跟蹤目標 圖2 第二幀跟蹤結果
四、參考
基於MeanShift的目標跟蹤算法及實現 https://blog.csdn.net/jinshengtao/article/details/30258833
孟琭,楊旭,目標跟蹤算法綜述,自動化學報,2019
本文代碼包下載地址:
https://download.csdn.net/download/weixin_41537599/11643548
(似乎是需要C幣的誒,跟我一樣的平民玩家可以在評論區留下郵箱)