Відстеження кольору в Processing

У прикладі з відстеженням великих обєктів ви зробили простий алгоритм для відстеження яскравих обєктів У цьому прикладі ми підемо далі і створимо алгоритм для відстеження обєктів певного кольору Цей прийом гарний для тих, хто хоче створити інсталяцію, в якій буде взаємодіяти кілька людей Наприклад, ви можете вручити кожному учаснику кольоровий мяч, яким вони будуть маніпулювати для управління чим-небудь на екрані

Як це робиться

Код з цього приклад схожий на код з відстеження обєктів з попереднього прикладу Єдина різниця полягає в змінної типу color під імям trackColor, яку ми використовуємо для відстеження та трьох цілих змінних: для значення червоного, зеленого і синього кольорів Змінна для зберігання кордону зникає і замість неї зявляється ціла змінна під імям maxColorDifference

import processingvideo* 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 ) webcamstart()

trackColor = color( 255 )

trackR = (trackColor &gt&gt 16) &amp 0xff trackG = (trackColor &gt&gt 8) &amp 0xff trackB = trackColor &amp 0xff maxColorDifference = 40

topLeftX = width topLeftY = height

bottomRightX = 0

bottomRightY = 0

}

У функції draw () ми використовуємо той же прийом, що і в алгоритмі з яскравістю Замість функції brightness () ми розділимо колір кожного пікселя на червону, зелену і синю складові і обчислимо відстань між ними за допомогою функції dist () Це відстань потім буде сравнено із змінною maxColorDifference, і таким чином ми отримаємо прямокутник, окреслений навколо кольорових пікселів

void draw()

{

if ( webcamavailable() ) { webcamread()

image( webcam, 0, 0 ) loadPixels()

int counter = 0

for ( int j = 0 j &lt webcamheight j++ ) { for ( int i = 0 i &lt webcamwidth i++ ) {

color c = webcampixels[counter] int r = (c &gt&gt 16) &amp 0xff

int g = (c &gt&gt 8) &amp 0xff int b = c &amp 0xff

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

if ( colorDifference &lt maxColorDifference ) { if ( i &lt topLeftX ) {

topLeftX = i

}

if ( j &lt topLeftY ) { topLeftY = j

}

if ( i &gt bottomRightX ) { bottomRightX = i

}

if ( j &gt 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 = webcamget( mouseX, mouseY ) trackR = (trackColor &gt&gt 16) &amp 0xff

trackG = (trackColor &gt&gt 8) &amp 0xff trackB = trackColor &amp 0xff

}

Якщо все спрацює, на екрані ви побачите щось на зразок цього:

Як це працює

Єдина відмінність від прикладу з яскравістю полягає в наступному фрагменті коду:

color c = webcampixels[counter] int r = (c &gt&gt 16) &amp 0xff

int g = (c &gt&gt 8) &amp 0xff int b = c &amp 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:// processingorg / reference / rightshifthtml

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

Джерело: Ян Вантомм, Processing 2: креативне програмування, переклад з англійської Олександри Мішутіної, Published by Packt Publishing Ltd, 2012, BIRMINGHAM – MUMBAI

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*