Главная » Processing » Размечаем видео в Processing

0

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

Как это делается

Начните с импорта библиотеки video. Вы научились это делать в примере Использование вебкамеры. После объявления объекта Capture нам нужно еще объявить целые переменные под именами numPixels и threshold.

import processing.video.*; Capture webcam;

int numPixels; int threshold;

В функции setup() мы запустим вебкамеру по аналогии с примером Использование вебкамеры. Переменная numPixels будет хранить общее количество пикселей в изображении с вебкамеры. Это удобно, потому что мы будем перебирать их по одному в функции draw(). Для начала присвоим переменной threshold значение 127.

void setup()

{

size( 640, 480 );

smooth();

webcam = new Capture( this, width, height, 30); webcam.start();

numPixels = webcam.width * webcam.height; threshold = 127;

}

В функции draw() мы используем метод webcam.available() перед захватом нового изображения и выводом его на экран. Код между функциями loadPixels() и updatePixels() это алгоритм ограничения. Также вы выведем на экран красный прямоугольник с текстом, отображающим текущую граничную величину.

void draw()

{

if ( webcam.available() ) { webcam.read();

image( webcam, 0, 0 );

loadPixels();

for ( int i = 0; i < numPixels; i++ ) { float b = brightness( webcam.pixels[i] ); if ( b > threshold ) {

pixels[i] = color( 255 );

} else {

pixels[i] = color( 0 );

}

}

updatePixels();

}

fill( 255, 0, 0 );

noStroke();

rect( 10, 10, 110, 20 );

fill( 255 );

text( "Threshold: " + threshold, 14, 24 );

}

Функция keyPressed() используется как интерфейс для управления значением граничной величины. По нажатию клавиши-стрелки вверх граничная величина увеличится, при нажатии на стрелку вниз – уменьшится.

void keyPressed()

{

if ( key == CODED ) {

if ( keyCode == UP ) { threshold++;

}

if ( keyCode == DOWN ) { threshold–;

}

}

}

Запустите скетч, понажимайте на клавиши-стрелки вверх и вниз и посмотрите на результат.

Как это работает

Возможно, вы заметили, что в этом скетче я не использовал функцию captureEvent(). В функции draw() я применил метод webcam.available(), возвращающий логическую переменную. Если доступен новый кадр, это величина является истоной. Если иользовать этот метод с условием if, код в условии будет выполняться только когда будет доступен новый кадр. Я считал новое изображение с помощью метода webcam.read() и отображил его с помощью встроенной в Processing функции image().

Следующее, что нужно сделать – загрузить текущее изображение с экрана в массив пикселей с помощью функции loadPixels(). Я выбрал цикл for для перебора пикселей из массива и сравнения яркости каждого пикселя с граничным значением. Если яркость пикселя выше граничной, цвет пикселя сменяется на белый. Остальные пиксели становятся черными.

for ( int i = 0; i < numPixels; i++ ) { float b = brightness( webcam.pixels[i] ); if ( b > threshold ) {

pixels[i] = color( 255 );

} else {

pixels[i] = color( 0 );

}

}

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

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии