1. Problembeschreibung:
Zielverfolgungsalgorithmus in der dynamischen Hintergrundzielverfolgung
2. Teil des Programms:
% Programmierung von ALireza Fasih
% E-Mail: [email protected]%
Bitte kopieren Sie die Bilder (* .ppm) in das Arbeitsverzeichnis und drücken Sie F5, um die Ergebnisse anzuzeigen.
clc; % klarer Konsul
alles klar; % lösche alle Variablen
% Ball Threshold Min & Max Werte
th_min_ball = 80;
th_max_ball = 214;
% Anzahl der Frams
Frams = 88;
% Ball Pos initialize
old_ball_pos_x = 0;
old_ball_pos_y = 0;
Ball_speed_list (2,10) = 0;
ball_vel_x = 0;
ball_vel_y = 0;
delta_x = 25;
delta_y = 25;
Zähler = 0;
für i = 21: frams
fname = strcat ('stennis.', int2str (i), '. ppm'); % Incrimental String Variable für die Indizierung des Dateinamens
wenn (i <35)
delta_x = 35;
delta_y = 35;
sonst
delta_x = 25;
delta_y = 25;
ende
wenn (i> 80)
delta_x = 30;
delta_y = 15;
Ende
k = imread (fname); % Bild in 'k' Matrix
laden k1 = k;
if (old_ball_pos_x ~ = 0)
k1 = imcrop (k, [round (old_ball_pos_x-delta_x) round (old_ball_pos_y-delta_y) delta_x. * 2 delta_y. * 2]);
Ende
I = rgb2gray (k1); % Konvertieren von RGB-
Bildern in Graustufenbilder I = im2double (I); % Konvertieren von Graustufenbildern in Doppeltyp
J = medfilt2 (I, [3 3]); %
Medianfilter , 3x3 Faltung auf Bild I2 = imadjust (J); % Verbessern Sie die Bildqualität und
passen Sie die Kontrast- und Helligkeitswerte an. Ib = I2> 0,8627; % (220/255); % Binärschwelle für Ball
[markiert, numObjects] = bwlabel (Ib, 4); % Indizierung von Segmenten nach binärer Beschriftungsfunktion
graindata = regionprops (beschriftet, 'all'); % extrahiert Eigenschaften aus Regionen, 'all' bedeutet, dass alle Attribute
angezeigt werden müssen (i); % Showzyklus
% ---------------------- Ball Area, Filter ---------------
a_f = find ([graindata.Area ]> th_min_ball & [graindata.Area] <th_max_ball); % Weil die Ballfläche im Bereich von 80 und 211 liegt
c1 = Länge (a_f);
% ---------------------- Ball W / H-Verhältnis, Filter ---------------
sel = 1; % Standardwert
für j = 1: c1
Ma = Graindaten (a_f (j)). MajorAxisLength;
Mi = graindata (a_f (j)). MinorAxisLength;
ratio_w_h = Ma./Mi;
if (ratio_w_h <1,7)% Ball- oder Halbkreisverhältnisbereich = Verhältnis> 0,6 & Verhältnis <1,7
sel = a_f (j);
Ende
Ende
imshow (k); % k
festhalten;
set (findobj (gca, 'Typ', 'Linie', 'Farbe', [0 0 1]), ...
'Farbe', 'Blau', ...
'Linienbreite', 3)
%
Zeichenpunkt auf Ball Center c1 = graindata (sel) .Centroid;
pos_list (1, i + 1) = c1 (1);
pos_list (2, i + 1) = 240-c1 (2);
Plot (c1 (1) + old_ball_pos_x-delta_x, c1 (2) + old_ball_pos_y-delta_y, 'rx');
für tt = 0: 0,05: (2 * pi)
Diagramm (c1 (1) + old_ball_pos_x-delta_x + 40 * cos (tt), c1 (2) + old_ball_pos_y-delta_y + 40 * sin (tt), 'g') ;;
Ende
wenn (i> 0)
ball_vel_x = (old_ball_pos_x - c1 (1)) ./ 24; % 24 Frame in der zweiten Geschwindigkeit = Änderung der Position in der Delta-Zeit
ball_vel_y = (old_ball_pos_y - c1 (2)) ./ 24;
end
Ball_speed_list (1, i + 1) = ball_vel_x;
Ball_speed_list (2, i + 1) = ball_vel_y;
if (Zähler> 0)
old_ball_pos_x = old_ball_pos_x-delta_x + c1 (1);
old_ball_pos_y = old_ball_pos_y-delta_y + c1 (2);
sonst
old_ball_pos_x = c1 (1);
old_ball_pos_y = c1 (2);
End -
Zähler = Zähler + 1;
Pause (0,1);
Ende