Главная » Processing » Отслеживание цвета в Processing

0

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

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

Код из этого пример похож на код из отслеживания объектов из предыдущего примера. Единственная разница заключается в переменной типа color под именем trackColor, которую мы используем для отслеживания и трех целых переменных: для значения красного, зеленого и синего цветов. Переменная для хранения границы исчезает и вместо нее появляется целая переменная под именем maxColorDifference.

import processing.video.*; Capture webcam;

color trackColor; int trackR;

int trackG; int trackB;

int topLeftX; int topLeftY;

int bottomRightX; int bottomRightY;

int maxColorDifference; void setup()

{

size( 640, 480 );

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

trackColor = color( 255 );

trackR = (trackColor >> 16) & 0xff; trackG = (trackColor >> 8) & 0xff; trackB = trackColor & 0xff; maxColorDifference = 40;

topLeftX = width; topLeftY = height;

bottomRightX = 0;

bottomRightY = 0;

}

В функции draw() мы используем тот же прием, что и в алгоритме с яркостью. Вместо функции brightness() мы разделим цвет каждого пикселя на красную, зеленую и синюю составляющие и вычислим расстояние между ними с помощью функции dist(). Это расстояние затем будет сравнено с переменной maxColorDifference, и таким образом мы получим прямоугольник, очерченный вокруг цветных пикселей.

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]; int r = (c >> 16) & 0xff;

int g = (c >> 8) & 0xff; int b = c & 0xff;

float colorDifference = dist( r, g, b, trackR, trackG, trackB );

if ( colorDifference < maxColorDifference ) { if ( i < topLeftX ) {

topLeftX = i;

}

if ( j < topLeftY ) { topLeftY = j;

}

if ( i > bottomRightX ) { bottomRightX = i;

}

if ( j > bottomRightY ) { bottomRightY = j;

}

}

counter++;

}

}

updatePixels();

// draw tracking color fill( trackColor ); noStroke();

rect( 0, 0, 20, 20 );

noFill(); stroke( 0 );

strokeWeight( 2 );

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

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

bottomRightY = 0;

}

}

В функции mousePressed() устанавливается цвет, который нужно отследить. Поднесите к камере ярко окрашенный объект и кликните по нему мышью.

void mousePressed()

{

trackColor = webcam.get( mouseX, mouseY ); trackR = (trackColor >> 16) & 0xff;

trackG = (trackColor >> 8) & 0xff; trackB = trackColor & 0xff;

}

Если все сработает, на экране вы увидите что-то вроде этого:

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

Единственное отличие от примера с яркостью заключается в следующем фрагменте кода:

color c = webcam.pixels[counter]; int r = (c >> 16) & 0xff;

int g = (c >> 8) & 0xff; int b = c & 0xff;

float colorDifference = dist( r, g, b, trackR, trackG, trackB );

Мы берем цвет текущего пикселя и сохраняем его в переменной c. С помощью техники под названием shifting мы разделим цвет на красный, зеленый и синий компоненты.

Строка кода int r = (c >> 16) & 0xff; делает то же самое, что и int r = red( c

), но значительно быстрее. Следующие строки делают то же самое, что и функции green() и blue(). Этот код труднее читается, но он даст вам небольшой бонус по скорости, когда вы будете производить эту операцию со множеством пикселей. Узнать больше об этой технике можно в справке Processing reference at http:// processing.org/reference/rightshift.html.

Функция dist() обычно применяется для вычисления расстояния между точками и двухмерном или трехмерном пространстве. В качестве координат x, y и z используются красный, зеленый и синий компоненты цвета. Функция dist() используется для вычисния расстояния между заданным цветом и цветом текущего пикселя. Чем меньше это число, тем более схожи цвета. Если значение переменной colorDifference меньше, чем maxColorDifference, цвета достаточно схожи и текущий пиксель может быть использован для вычисления границ прямоугольника. Алгоритм для вычисления верхней, нижней, левой и правой границ прямоугольника такой же, как в примере с яркостью.

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

По теме:

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