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

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

Введение

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

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

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

Создайте системный объект, чтобы считать видео из файла avi.

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

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

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

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

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

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

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

Цикл останавливается, когда вы достигаете конца входного файла, который обнаруживается объектом BinaryFileReader 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.

Сводные данные

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