8
Pelacakan pejalan kaki dari mobil yang bergerak Contoh ini menunjukkan bagaimana untuk melacak pejalan kaki menggunakan kamera yang dipasang di mobil yang bergerak. Ikhtisar Contoh ini menunjukkan bagaimana melakukan deteksi otomatis dan pelacakan orang dalam video dari kamera bergerak. Ini menunjukkan fleksibilitas dari sistem pelacakan yang diadaptasi untuk sebuah kamera yang bergerak, yang sangat ideal untuk aplikasi keamanan otomotif. Tidak seperti contoh kamera stasioner, The MotionBased beberapa objek pelacakan, contoh ini berisi beberapa langkah algoritmik tambahan.Langkah ini termasuk orang deteksi, disesuaikan bebasmaksimum penindasan dan heuristik untuk mengidentifikasi dan menghilangkan trek alarm palsu. Untuk informasi lebih lanjut silakan lihat Beberapa objek pelacakan. Contoh ini adalah fungsi dengan tubuh utama di atas dan penolong rutinitas dalam bentuk fungsi bersarang di bawah ini. function PedestrianTrackingFromMovingCameraExample() % Create system objects used for reading video, loading prerequisite d videoFile = 'vippedtracking.mp4'; scaleDataFile = 'pedScaleTable.mat'; % An auxiliary file that helps obj = setupSystemObjects(videoFile, scaleDataFile); % Create an empty array of tracks. tracks = initializeTracks(); % ID of the next track. nextId = 1; % Set the global parameters. option.ROI = [40 95 400 140]; % A rectangle [x, y, w option.scThresh = 0.3; % A threshold to contr option.gatingThresh = 0.9; % A threshold to rejec option.gatingCost = 100; % A large value for th option.costOfNonAssignment = 10; % A tuning parameter t option.timeWindowSize = 16; % A tuning parameter t option.confidenceThresh = 2; % A threshold to deter option.ageThresh = 8; % A threshold to deter option.visThresh = 0.6; % A threshold to deter % Detect people and track them across video frames. cont = ~isDone(obj.reader); while cont frame = readFrame(); [centroids, bboxes, scores] = detectPeople(); predictNewLocationsOfTracks(); [assignments, unassignedTracks, unassignedDetections] = ... detectionToTrackAssignment(); updateAssignedTracks(); updateUnassignedTracks(); deleteLostTracks(); createNewTracks(); displayTrackingResults(); % Exit the loop if the video player figure is closed by user. cont = ~isDone(obj.reader) && isOpen(obj.videoPlayer); end Open Script

Tracking pedestrians from a moving car matlab & simulink example

Embed Size (px)

Citation preview

Page 1: Tracking pedestrians from a moving car   matlab & simulink example

Pelacakan pejalan kaki dari mobil yang bergerak

Contoh ini menunjukkan bagaimana untuk melacak pejalan kakimenggunakan kamera yang dipasang di mobil yang bergerak.

IkhtisarContoh ini menunjukkan bagaimana melakukan deteksi otomatis dan pelacakan orang dalam video dari kamerabergerak. Ini menunjukkan fleksibilitas dari sistem pelacakan yang diadaptasi untuk sebuah kamera yang bergerak,yang sangat ideal untuk aplikasi keamanan otomotif. Tidak seperti contoh kamera stasioner, The Motion­Basedbeberapa objek pelacakan, contoh ini berisi beberapa langkah algoritmik tambahan.Langkah ini termasuk orangdeteksi, disesuaikan bebas­maksimum penindasan dan heuristik untuk mengidentifikasi dan menghilangkan trekalarm palsu. Untuk informasi lebih lanjut silakan lihat Beberapa objek pelacakan.

Contoh ini adalah fungsi dengan tubuh utama di atas dan penolong rutinitas dalam bentuk fungsi bersarang di bawahini.

function PedestrianTrackingFromMovingCameraExample()

% Create system objects used for reading video, loading prerequisite data file, detecting pedestrians, and displaying the results.videoFile = 'vippedtracking.mp4'; scaleDataFile = 'pedScaleTable.mat'; % An auxiliary file that helps to determine the size of a pedestrian at different pixel locations.

obj = setupSystemObjects(videoFile, scaleDataFile);

% Create an empty array of tracks.tracks = initializeTracks();

% ID of the next track. nextId = 1;

% Set the global parameters. option.ROI = [40 95 400 140]; % A rectangle [x, y, w, h] that limits the processing area to ground locations.option.scThresh = 0.3; % A threshold to control the tolerance of error in estimating the scale of a detected pedestrian.option.gatingThresh = 0.9; % A threshold to reject a candidate match between a detection and a track.option.gatingCost = 100; % A large value for the assignment cost matrix that enforces the rejection of a candidate match.option.costOfNonAssignment = 10; % A tuning parameter to control the likelihood of creation of a new track.option.timeWindowSize = 16; % A tuning parameter to specify the number of frames required to stabilize the confidence score of a track.option.confidenceThresh = 2; % A threshold to determine if a track is true positive or false alarm.option.ageThresh = 8; % A threshold to determine the minimum length required for a track being true positive.option.visThresh = 0.6; % A threshold to determine the minimum visibility value for a track being true positive.

% Detect people and track them across video frames. cont = ~isDone(obj.reader); while cont frame = readFrame();

[centroids, bboxes, scores] = detectPeople();

predictNewLocationsOfTracks();

[assignments, unassignedTracks, unassignedDetections] = ... detectionToTrackAssignment();

updateAssignedTracks(); updateUnassignedTracks(); deleteLostTracks(); createNewTracks();

displayTrackingResults();

% Exit the loop if the video player figure is closed by user. cont = ~isDone(obj.reader) && isOpen(obj.videoPlayer); end

Open Script

Page 2: Tracking pedestrians from a moving car   matlab & simulink example

Auxiliary Input dan Global parameter sistem pelacakanSistem pelacakan ini membutuhkan file data yang berisi informasi yang berkaitan dengan lokasi piksel dalamgambar ukuran kotak yang melompat­lompat menandai lokasi pejalan kaki. Pengetahuan ini disimpan dalamvektor pedScaleTable. N­th entri dalam pedScaleTable mewakili perkiraan ketinggian orang dewasa dalampixel. Indeksn referensi perkiraan koordinat Y­pejalan kaki di kaki.

Untuk mendapatkan sebuah vektor, koleksi pelatihan gambar yang diambil dari sudut pandang yang sama dan dalamsebuah adegan yang sama untuk lingkungan pengujian.Pelatihan gambar berisi gambar pejalan kaki pada berbagaijarak dari kamera.Menggunakan trainingImageLabeler app, melompat­lompat kotak pejalan kaki dalam gambar itusecara manual anotasi. Ketinggian kotak melompat­lompat dengan lokasi pejalan kaki dalam gambar yangdigunakan untuk menghasilkan berkas data skala melalui regresi. Berikut adalah fungsi pembantu untukmenunjukkan langkah­langkah algoritmik sesuai model regresi linear: helperTableOfScales.m

Ada juga satu set parameter global yang dapat disetel untuk mengoptimalkan kinerja pelacakan. Anda dapatmenggunakan Deskripsi di bawah ini untuk mempelajari tentang parameter bagaimana ini mempengaruhi kinerjapelacakan.

ROI : wilayah dari bunga dalam bentuk [x, y, w dan h]. Hal ini membatasi daerah pengolahan untuk lokasi tanah.

scThresh : ambang toleransi untuk estimasi skala. Ketika perbedaan antara terdeteksi skala dan skaladiharapkan melebihi toleransi, Deteksi calon dianggap tidak realistis dan akan dihapus dari output.

gatingThresh : Gating parameter untuk mengukur jarak. Ketika biaya pencocokan kotak melompat­lompatterdeteksi dan kotak melompat­lompat diperkirakan melebihi ambang batas, sistem menghapus Asosiasi duakotak melompat­lompat dari pelacakan pertimbangan.

gatingCost : nilai untuk matriks penetapan biaya untuk mencegah kemungkinan pelacakan untuk deteksi tugas.

costOfNonAssignment : nilai untuk matriks penetapan biaya untuk tidak menentukan deteksi atautrek. Pengaturan terlalu rendah meningkatkan kemungkinan membuat baru melacak, dan dapat mengakibatkantrek fragmentasi.Pengaturan itu terlalu tinggi mengakibatkan satu lagu sesuai dengan serangkaian bendabergerak terpisah.

timeWindowSize : jumlah bingkai yang diperlukan untuk memperkirakan kepercayaan dari trek.

confidenceThresh : ambang keyakinan untuk menentukan apakah jalur positif benar.

ageThresh : panjang Minimum trek yang positif benar.

visThresh : ambang visibilitas Minimum untuk menentukan apakah jalur positif benar.

Menciptakan objek sistem untuk inisialisasi sistem pelacakanFungsi setupSystemObjects menciptakan objek sistem yang digunakan untuk membaca dan menampilkan framevideo dan beban skala data file.

pedScaleTable vektor, yang disimpan dalam skala data file, mengkode kami pengetahuan sebelumnya dari targetdan adegan. Setelah Anda memiliki regressor yang dilatih dari sampel Anda, Anda dapat menghitung ketinggian

Page 3: Tracking pedestrians from a moving car   matlab & simulink example

diharapkan pada setiap Y­posisi mungkin dalam gambar. Nilai­nilai ini disimpan dalam vektor. N­th entridalam pedScaleTable mewakili kami perkiraan ketinggian orang dewasa dalam pixel.Indeks n referensi perkiraankoordinat Y­pejalan kaki di kaki.

function obj = setupSystemObjects(videoFile,scaleDataFile) % Initialize Video I/O % Create objects for reading a video from a file, drawing the % detected and tracked people in each frame, and playing the video.

% Create a video file reader. obj.reader = vision.VideoFileReader(videoFile, 'VideoOutputDataType'

% Create a video player. obj.videoPlayer = vision.VideoPlayer('Position', [29, 597, 643, 386]);

% Load the scale data file ld = load(scaleDataFile, 'pedScaleTable'); obj.pedScaleTable = ld.pedScaleTable; end

Menginisialisasi trekFungsi initializeTracks menciptakan array trek, dimana setiap trek merupakan struktur yang mewakili sebuahobjek bergerak dalam video. Tujuan dari struktur adalah untuk mempertahankan keadaan benda yangdilacak. Negara bagian terdiri dari informasi yang digunakan untuk tugas deteksi­ke­track, penghentian trek, danlayar.

Struktur berisi bidang­bidang berikut:

id : sebuah integer ID trek.

color : warna jalur untuk tujuan tampilan.

bboxes : N­oleh­4 matriks mewakili kotak melompat­lompat objek dengan kotak saat ini di baris terakhir. Setiapbaris memiliki bentuk [x, y, lebar, tinggi].

scores : vektor N­oleh­1 untuk merekam Skor klasifikasi dari detektor orang dengan Skor deteksi saat ini di baristerakhir.

kalmanFilter : Kalman objek filter yang digunakan untuk melacak gerakan berbasis. Kami melacak titik pusatdari objek dalam gambar;

age : jumlah bingkai karena jalur yang diinisialisasi.

totalVisibleCount : jumlah total frame di mana objek terdeteksi (terlihat).

confidence : sepasang dua nomor yang mewakili bagaimana yakin kita percaya trek. Ini menyimpan maksimumdan nilai rata­rata deteksi di masa lalu dalam jendela waktu yang telah ditetapkan.

predPosition : kotak melompat­lompat diperkirakan pada frame berikutnya.

function tracks = initializeTracks() % Create an empty array of tracks tracks = struct(... 'id', , ... 'color', , ... 'bboxes', , ... 'scores', , ... 'kalmanFilter', , ... 'age', , ... 'totalVisibleCount', , ... 'confidence', , ... 'predPosition', ); end

Membaca Video bingkaiMembaca frame video berikutnya dari video file.

function frame = readFrame() frame = step(obj.reader); end

Page 4: Tracking pedestrians from a moving car   matlab & simulink example

Mendeteksi orang­orangFungsi detectPeople mengembalikan centroids, kotak melompat­lompat dan klasifikasi puluhan orangterdeteksi. Melakukan penyaringan dan bebas­maksimum penindasan pada output mentah dari detectPeopleACF.

centroids : N­oleh­2 matriks dengan setiap baris dalam bentuk [x, y].

bboxes : N­oleh­4 matriks dengan setiap baris dalam bentuk [x, y, lebar, tinggi].

scores : N­oleh­1 vektor dengan setiap elemen adalah Skor klasifikasi pada frame yang sesuai.

function [centroids, bboxes, scores] = detectPeople() % Resize the image to increase the resolution of the pedestrian. % This helps detect people further away from the camera. resizeRatio = 1.5; frame = imresize(frame, resizeRatio, 'Antialiasing',false);

% Run ACF people detector within a region of interest to produce % detection candidates. [bboxes, scores] = detectPeopleACF(frame, option.ROI, ... 'Model','caltech',... 'WindowStride', 2,... 'NumScaleLevels', 4, ... 'SelectStrongest', false);

% Look up the estimated height of a pedestrian based on location of their feet. height = bboxes(:, 4) / resizeRatio; y = (bboxes(:,2)‐1) / resizeRatio + 1; yfoot = min(length(obj.pedScaleTable), round(y + height)); estHeight = obj.pedScaleTable(yfoot);

% Remove detections whose size deviates from the expected size, % provided by the calibrated scale estimation. invalid = abs(estHeight‐height)>estHeight*option.scThresh; bboxes(invalid, :) = []; scores(invalid, :) = [];

% Apply non‐maximum suppression to select the strongest bounding boxes. [bboxes, scores] = selectStrongestBbox(bboxes, scores, ... 'RatioType', 'Min', 'OverlapThreshold', 0.6);

% Compute the centroids if isempty(bboxes) centroids = []; else centroids = [(bboxes(:, 1) + bboxes(:, 3) / 2), ... (bboxes(:, 2) + bboxes(:, 4) / 2)]; end end

Memprediksi lokasi rel yang sudah adaMenggunakan Kalman filter untuk memprediksi centroid setiap lagu dalam rangka saat ini, dan memperbaruikotaknya melompat­lompat sesuai. Kami mengambil lebar dan tinggi dari kotak melompat­lompat di framesebelumnya sebagai prediksi kami saat ini ukuran.

function predictNewLocationsOfTracks() for i = 1:length(tracks) % Get the last bounding box on this track. bbox = tracks(i).bboxes(end, :);

% Predict the current location of the track. predictedCentroid = predict(tracks(i).kalmanFilter);

% Shift the bounding box so that its center is at the predicted location. tracks(i).predPosition = [predictedCentroid ‐ bbox(3:4)/2, bbox(3:4)];

Page 5: Tracking pedestrians from a moving car   matlab & simulink example

end end

Menetapkan pendeteksian ke trekMenetapkan objek pendeteksian dalam bingkai saat ini ke trek yang ada dilakukan dengan meminimalkanbiaya. Biaya dihitung dengan menggunakan fungsibboxOverlapRatio , dan adalah rasio tumpang tindih antaradiperkirakan berlari kotak dan kotak melompat­lompat terdeteksi. Dalam contoh ini, kami menganggap orang akanbergerak secara bertahap di berturut­turut bingkai tinggi frame rate video dan kecepatan rendah gerak seseorang.

Algoritma melibatkan dua langkah:

Langkah 1: Menghitung biaya menugaskan deteksi setiap untuk setiap lagu yang menggunakanukuran bboxOverlapRatio . Ketika orang bergerak menuju atau menjauh dari kamera, gerakan mereka akan tidakakurat dijelaskan oleh titik centroid sendirian. Biaya memperhitungkan jarak pada pesawat gambar serta skala kotakmelompat­lompat. Hal ini mencegah menetapkan pendeteksian jauh dari kamera ke trek lebih dekat ke kamera,bahkan jika mereka centroids bertepatan. Pilihan fungsi biaya ini akan memudahkan perhitungan tanpa beralih kemodel dinamis yang lebih canggih.Hasil disimpan dalam matriks MxN, dimana M adalah jumlah trek, dan N adalahjumlah pendeteksian.

Langkah 2: Memecahkan masalah tugas yang diwakili oleh matriks biaya menggunakanfungsi assignDetectionsToTracks . Fungsi mengambil matriks biaya dan biaya tidak menetapkan pendeteksianapapun ke trek.

Nilai untuk biaya tidak menentukan deteksi untuk melacak tergantung pada berbagai nilai­nilai yang dikembalikanoleh fungsi biaya. Nilai ini harus disetel secara eksperimental. Pengaturan terlalu rendah meningkatkan kemungkinanmembuat baru melacak, dan dapat mengakibatkan trek fragmentasi. Pengaturan itu terlalu tinggi mengakibatkansatu lagu sesuai dengan serangkaian benda bergerak terpisah.

Fungsi assignDetectionsToTracks menggunakan Munkres' versi dari Hungaria algoritma untuk menghitungsebuah tugas yang meminimalkan biaya total. Itu kembali M x 2 matriks yang mengandung indeks yang terkaitditugaskan trek dan pendeteksian dalam dua kolom. Itu juga kembali indeks trek dan pendeteksian yang tetap belumditugaskan.

function [assignments, unassignedTracks, unassignedDetections] = ... detectionToTrackAssignment()

% Compute the overlap ratio between the predicted boxes and the % detected boxes, and compute the cost of assigning each detection % to each track. The cost is minimum when the predicted bbox is % perfectly aligned with the detected bbox (overlap ratio is one) predBboxes = reshape([tracks(:).predPosition], 4, [])'; cost = 1 ‐ bboxOverlapRatio(predBboxes, bboxes);

% Force the optimization step to ignore some matches by % setting the associated cost to be a large number. Note that this % number is different from the 'costOfNonAssignment' below. % This is useful when gating (removing unrealistic matches) % technique is applied. cost(cost > option.gatingThresh) = 1 + option.gatingCost;

% Solve the assignment problem. [assignments, unassignedTracks, unassignedDetections] = ... assignDetectionsToTracks(cost, option.costOfNonAssignment); end

Update ditugaskan trekFungsi updateAssignedTracks update setiap lagu yang ditugaskan dengan deteksi sesuai. Ini panggilan metodeyang correct visi vision.KalmanFilter untuk memperbaiki perkiraan lokasi. Selanjutnya, itu toko kotakmelompat­lompat baru dengan mengambil rata­rata ukuran kemarin (hingga) 4 kotak, dan meningkatkan usia trek danjumlah total terlihat oleh 1. Akhirnya, fungsi menyesuaikan nilai kepercayaan kita dalam lagu berdasarkan nilaideteksi sebelumnya.

function updateAssignedTracks() numAssignedTracks = size(assignments, 1); for i = 1:numAssignedTracks

Page 6: Tracking pedestrians from a moving car   matlab & simulink example

trackIdx = assignments(i, 1); detectionIdx = assignments(i, 2);

centroid = centroids(detectionIdx, :); bbox = bboxes(detectionIdx, :);

% Correct the estimate of the object's location % using the new detection. correct(tracks(trackIdx).kalmanFilter, centroid);

% Stabilize the bounding box by taking the average of the size % of recent (up to) 4 boxes on the track. T = min(size(tracks(trackIdx).bboxes,1), 4); w = mean([tracks(trackIdx).bboxes(end‐T+1:end, 3); bbox(3)]); h = mean([tracks(trackIdx).bboxes(end‐T+1:end, 4); bbox(4)]); tracks(trackIdx).bboxes(end+1, :) = [centroid ‐ [w, h]/2, w, h];

% Update track's age. tracks(trackIdx).age = tracks(trackIdx).age + 1;

% Update track's score history tracks(trackIdx).scores = [tracks(trackIdx).scores; scores(detectionIdx)];

% Update visibility. tracks(trackIdx).totalVisibleCount = ... tracks(trackIdx).totalVisibleCount + 1;

% Adjust track confidence score based on the maximum detection % score in the past 'timeWindowSize' frames. T = min(option.timeWindowSize, length(tracks(trackIdx).scores)); score = tracks(trackIdx).scores(end‐T+1:end); tracks(trackIdx).confidence = [max(score), mean(score)]; end end

Memperbarui Unassigned trekFungsi updateUnassignedTracks menandai setiap lagu yang belum ditugaskan sebagai terlihat, meningkat umur 1,dan menambahkan kotak melompat­lompat diperkirakan ke trek. Kepercayaan diatur ke nol karena kita tidak yakinmengapa itu tidak ditugaskan untuk melacak.

function updateUnassignedTracks() for i = 1:length(unassignedTracks) idx = unassignedTracks(i); tracks(idx).age = tracks(idx).age + 1; tracks(idx).bboxes = [tracks(idx).bboxes; tracks(idx).predPosition]; tracks(idx).scores = [tracks(idx).scores; 0];

% Adjust track confidence score based on the maximum detection % score in the past 'timeWindowSize' frames T = min(option.timeWindowSize, length(tracks(idx).scores)); score = tracks(idx).scores(end‐T+1:end); tracks(idx).confidence = [max(score), mean(score)]; end end

Menghapus trek yang hilangdeleteLostTracks fungsi menghapus trek yang telah terlihat untuk terlalu banyak frame berturut­turut. Namun jugamenghapus baru saja dibuat track yang telah terlihat untuk banyak frame secara keseluruhan.

Pendeteksian bising cenderung mengakibatkan pembentukan trek palsu. Untuk contoh ini, kami menghapus trek dibawah kondisi berikut:

Objek dilacak untuk waktu yang singkat. Hal ini biasanya terjadi ketika deteksi palsu muncul untuk beberapa

Page 7: Tracking pedestrians from a moving car   matlab & simulink example

frame dan trek dimulai untuk itu.

Jalur yang ditandai terlihat untuk sebagian besar frame.

Gagal untuk menerima deteksi kuat dalam beberapa frame masa lalu, yang dinyatakan sebagai nilai kepercayaandeteksi maksimum.

function deleteLostTracks() if isempty(tracks) return; end

% Compute the fraction of the track's age for which it was visible. ages = [tracks(:).age]'; totalVisibleCounts = [tracks(:).totalVisibleCount]'; visibility = totalVisibleCounts ./ ages;

% Check the maximum detection confidence score. confidence = reshape([tracks(:).confidence], 2, [])'; maxConfidence = confidence(:, 1);

% Find the indices of 'lost' tracks. lostInds = (ages <= option.ageThresh & visibility <= option.visThresh) | (maxConfidence <= option.confidenceThresh);

% Delete lost tracks. tracks = tracks(~lostInds); end

Menciptakan lagu baruMembuat lagu baru dari unassigned pendeteksian. Menganggap bahwa setiap unassigned deteksi awal lagubaru. Dalam praktek, Anda dapat menggunakan isyarat lain untuk menghilangkan bising pendeteksian, sepertiukuran, lokasi, atau penampilan.

function createNewTracks() unassignedCentroids = centroids(unassignedDetections, :); unassignedBboxes = bboxes(unassignedDetections, :); unassignedScores = scores(unassignedDetections);

for i = 1:size(unassignedBboxes, 1) centroid = unassignedCentroids(i,:); bbox = unassignedBboxes(i, :); score = unassignedScores(i);

% Create a Kalman filter object. kalmanFilter = configureKalmanFilter('ConstantVelocity', ... centroid, [2, 1], [5, 5], 100);

% Create a new track. newTrack = struct(... 'id', nextId, ... 'color', 255*rand(1,3), ... 'bboxes', bbox, ... 'scores', score, ... 'kalmanFilter', kalmanFilter, ... 'age', 1, ... 'totalVisibleCount', 1, ... 'confidence', [score, score], ... 'predPosition', bbox);

% Add it to the array of tracks. tracks(end + 1) = newTrack; %#ok<AGROW>

% Increment the next id. nextId = nextId + 1;

Page 8: Tracking pedestrians from a moving car   matlab & simulink example

end end

Tampilan hasil pelacakanFungsi displayTrackingResults menarik kotak melompat­lompat berwarna untuk setiap lagu pada videoframe. Tingkat transparansi kotak dengan angka yang ditampilkan menunjukkan kepercayaan pendeteksian dan trek.

function displayTrackingResults()

displayRatio = 4/3; frame = imresize(frame, displayRatio);

if ~isempty(tracks), ages = [tracks(:).age]'; confidence = reshape([tracks(:).confidence], 2, [])'; maxConfidence = confidence(:, 1); avgConfidence = confidence(:, 2); opacity = min(0.5,max(0.1,avgConfidence/3)); noDispInds = (ages < option.ageThresh & maxConfidence < option.confidenceThresh) | (ages < option.ageThresh / 2);

for i = 1:length(tracks) if ~noDispInds(i)

% scale bounding boxes for display bb = tracks(i).bboxes(end, :); bb(:,1:2) = (bb(:,1:2)‐1)*displayRatio + 1; bb(:,3:4) = bb(:,3:4) * displayRatio;

frame = insertShape(frame, ... 'FilledRectangle', bb, ... 'Color', tracks(i).color, ... 'Opacity', opacity(i)); frame = insertObjectAnnotation(frame, ... 'rectangle', bb, ... num2str(avgConfidence(i)), 'Color', tracks(i).color); end end end

frame = insertShape(frame, 'Rectangle', option.ROI * displayRatio, 'Color', [255, 0, 0], 'LineWidth', 3);

step(obj.videoPlayer, frame);

end

end

Apakah topik ini bermanfaat?