exponenta event banner

Подсчет объектов

В этом примере показано, как использовать морфологические операции для подсчета объектов в видеопотоке.

Введение

Входной видеопоток содержит изображения скрепок. В этом примере для удаления неравномерного освещения используется морфологическая операция верхней шляпы, а для удаления зазоров между скобками - морфологическая операция открытия. Затем изображения преобразуются в двоичные с использованием различных пороговых значений для каждого кадра. После применения этого порога подсчитывается количество скобок и вычисляется центроид каждой скобки.

Инициализация

Используйте следующие разделы кода для инициализации требуемых переменных и системных объектов.

Создайте объект System для чтения видео из файла avi.

filename = 'staples.mp4';
hVideoSrc = VideoReader(filename);

Создайте системный объект анализа больших двоичных объектов для подсчета скобок и поиска их центроидов.

hBlob = vision.BlobAnalysis( ...
            'AreaOutputPort', false, ...
            'BoundingBoxOutputPort', false, ...
            'OutputDataType', 'single');

Создайте объект System для отображения выходного видео.

hVideoOut = vision.VideoPlayer('Name', 'Counted Staples');
hVideoOut.Position(3:4) = [650 350];

Цикл обработки потока

Здесь вызывается цикл обработки для подсчета скобок во входном видео. В этом цикле используются созданные вами системные объекты.

Цикл останавливается при достижении конца входного файла, обнаруженного объектом BinureFileReader System.

while hasFrame(hVideoSrc)
    I = im2gray(readFrame(hVideoSrc));
    Im = imtophat(I, strel('square',18));
    Im = imopen(Im, strel('rect',[15 3]));
    th = multithresh(Im); % Determine threshold using Otsu's method
    BW = Im > th;
    Centroids = step(hBlob, BW);               % Blob Analysis
    
    StaplesCount = int32(size(Centroids,1));  
    txt = sprintf('Staple count: %d', StaplesCount);
    It = insertText(I,[10 280],txt,'FontSize',22); % Display staples count
             
    Centroids(:, 2) = Centroids(1,2);            % Align markers horizontally

    It = insertMarker(It, Centroids, 'o', 'Size', 6, 'Color', 'r');
    It = insertMarker(It, Centroids, 'o', 'Size', 5, 'Color', 'r');
    It = insertMarker(It, Centroids, '+', 'Size', 5, 'Color', 'r');
    
    step(hVideoOut, It);
end

Figure Counted Staples contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains an object of type image.

Резюме

В выходном видео показаны отдельные скрепки, отмеченные кружком и знаком «плюс». Также отображается количество скобок, отображаемых в каждом кадре.