Error using kalman filter for motion tracking.

7 vues (au cours des 30 derniers jours)
Yashsavi
Yashsavi le 15 Mar 2014
Commenté : Yashsavi le 15 Mar 2014
%%Code in the Bold, & comments in normal font
clear all; close all; clc % Read video into MATLAB using VideoReader video = VideoReader('C:\Users\yashsavi\Desktop\input.avi'); %'n' for calculating the number of frames in the video file n = length(video); % Calculate the background image by averaging the first 10 images temp = zeros(size(video(1).cdata)); [M,N] = size(temp(:,:,1)); for i = 1:10 temp = double(video(i).cdata) + temp; end imbkg = temp/10; % Initialization step for Kalman Filter centroidx = zeros(n,1); centroidy = zeros(n,1); predicted = zeros(n,4); actual = zeros(n,4); % % Initialize the Kalman filter parameters % R - measurement noise, % H - transform from measure to state % Q - system noise, % P - the status covarince matrix
% A - state transform matrix
R=[[0.2845,0.0045]',[0.0045,0.0455]']; H=[[1,0]',[0,1]',[0,0]',[0,0]']; Q=0.01*eye(4); P = 100*eye(4); dt=1; A=[[1,0,0,0]',[0,1,0,0]',[dt,0,1,0]',[0,dt,0,1]']; % loop over all image frames in the video kfinit = 0; th = 38; for i=1:n imshow(video(i).cdata); hold on imcurrent = double(video(i).cdata);
% Calculate the difference image to extract pixels with more than 40(threshold) change
diffimg = zeros(M,N);
diffimg = (abs(imcurrent(:,:,1)-imbkg(:,:,1))>th) ...
| (abs(imcurrent(:,:,2)-imbkg(:,:,2))>th) ...
| (abs(imcurrent(:,:,3)-imbkg(:,:,3))>th);
% Label the image and mark
labelimg = bwlabel(diffimg,4);
markimg = regionprops(labelimg,['basic']);
[MM,NN] = size(markimg);
% Do bubble sort (large to small) on regions in case there are more than 1
% The largest region is the object (1st one)
for nn = 1:MM
if markimg(nn).Area > markimg(1).Area
tmp = markimg(1);
markimg(1)= markimg(nn);
markimg(nn)= tmp;
end
end
% Get the upper-left corner, the measurement centroid and bounding window size
bb = markimg(1).BoundingBox;
xcorner = bb(1);
ycorner = bb(2);
xwidth = bb(3);
ywidth = bb(4);
cc = markimg(1).Centroid;
centroidx(i)= cc(1);
centroidy(i)= cc(2);
% Plot the rectangle of background subtraction algorithm -- blue
hold on
rectangle('Position',[xcorner ycorner xwidth ywidth],'EdgeColor','b');
hold on
plot(centroidx(i),centroidy(i), 'bx');
% Kalman window size
kalmanx = centroidx(i)- xcorner;
kalmany = centroidy(i)- ycorner;
if kfinit == 0
% Initialize the predicted centroid and volocity
predicted =[centroidx(i),centroidy(i),0,0]' ;
else
% Use the former state to predict the new centroid and volocity
predicted = A*actual(i-1,:)';
end
kfinit = 1;
Ppre = A*P*A' + Q;
K = Ppre*H'/(H*Ppre*H'+R);
actual(i,:) = (predicted + K*([centroidx(i),centroidy(i)]' - H*predicted))';
P = (eye(4)-K*H)*Ppre;
% Plot the tracking rectangle after Kalman filtering -- red
hold on
rectangle('Position',[(actual(i,1)-kalmanx) (actual(i,2)-kalmany) xwidth ywidth], 'EdgeColor', 'r','LineWidth',1.5);
hold on
plot(actual(i,1),actual(i,2), 'rx','LineWidth',1.5);
drawnow;
end
%end of the code
  1 commentaire
Yashsavi
Yashsavi le 15 Mar 2014
Error encountered: No appropriate method, property, or field cdata for class VideoReader.
Error in kalman (line 11) temp = zeros(size(video(1).cdata));

Connectez-vous pour commenter.

Réponses (0)

Catégories

En savoir plus sur Tracking and Motion Estimation dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by