MeanShift跟蹤MATLAB實現

一、簡介

核跟蹤方法是目標跟蹤的主要方法, 應用非常廣泛。例如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幣的誒,跟我一樣的平民玩家可以在評論區留下郵箱)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章