Главная » Processing » Отслеживание крупных объектов в Processing

0

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

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

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

import processing.video.*;

Capture webcam; int threshold;

int topLeftX; int topLeftY;

int bottomRightX; int bottomRightY;

void setup()

{

size( 640, 480 );

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

threshold = 127;

topLeftX = width; topLeftY = height;

bottomRightX = 0;

bottomRightY = 0;

}

В функции draw() мы сделаем алгоритм ограничения, такой же, как в примере Размечаем видео. Мы переберем массив пикселей с помощью вложенного цикла for, потому что нам нужно знать точное местоположение каждого белого пикселя для обновления значения переменных с границами. Остаток кода не отличается от прошлого примера.

void draw()

{

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

image( webcam, 0, 0 ); loadPixels();

int counter = 0;

for ( int j = 0; j < webcam.height; j++ ) { for ( int i = 0; i < webcam.width; i++ ) {

color c = webcam.pixels[counter]; float b = brightness( c );

if ( b > threshold ) { pixels[counter] = color( 255 ); if ( i < topLeftX ) {

topLeftX = i;

}

if ( j < topLeftY ) { topLeftY = j;

}

if ( i > bottomRightX ) { bottomRightX = i;

}

if ( j > bottomRightY ) { bottomRightY = j;

}

} else {

pixels[counter] = color( 0 );

}

counter++;

}

}

updatePixels();

noFill();

stroke( 255, 0, 0 );

strokeWeight( 2 );

rect( topLeftX, topLeftY, bottomRightX – topLeftX, bottomRightY – topLeftY );

// reset tracking points topLeftX = width; topLeftY = height;

bottomRightX = 0;

bottomRightY = 0;

fill( 255, 0, 0 );

noStroke();

rect( 10, 10, 110, 20 );

fill( 255 );

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

}

}

void keyPressed()

{

if ( key == CODED ) {

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

}

if ( keyCode == DOWN ) { threshold–;

}

}

}

Когда вы запустите скетч, вы увидите красный прямоугольник вокруг белых пикселей. Этот алгоритм лучше всего работает в темной комнате, когда вы освещаете что-то лампой.

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

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

В начале каждого кадра значение переменной topLeftX равно ширине окна скетча. Переменная topLeftY равна высоте окна. Они указывают на правый нижний угол окна скетча.

topLeftX = width; topLeftY = height;

Цикл for с счетчиком i используется для перебора рядов пикселей. Если пиксель – белый, мы сравниваем его местоположение с величиной topLeftX. Если она меньше, мы меняем значение мы меняем значение переменной topLeftX. С каждым шагом мы приближаемся к координате x крайнего левого пикселя. Цикл for с счетчиком j используется для перебора столбцов пикселей. Аналогично мы получаем координату y самого верхнего пикселя. Для этого я применил функцию min(). Эта функция возвращает наименьшее значение из двух введенных:

topLeftX = min( i, topLeftX ); topLeftY = min( j, topLeftY );

Переменные i и j также сравниваются со значениями bottomRightX и bottomRightY для вычисления левого верхнего угла скетча. Но на этот раз они должны быть больше. Для этого я применил функцию max(). Эта функция действует обратно функции min() и воращает большее число из двух введенных. Когда мы найдем все нужные координаты, мы сможем нарисовать вокруг белых пикселей прямоугольник с помощью этой строки кода:

rect( topLeftX, topLeftY, bottomRightX – topLeftX, bottomRightY – topLeftY );

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

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

По теме:

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