Ik ben nu op school bezig met een project in de programmeer taal processing wat java-based is.
Hierbij moet ik op een bepaalde kleur inzoomen, in dit geval paars. De kleur heb ik een variabele 'color' van gemaakt.
En wil met behulp van een if statement hierop inzoomen, door de waarde += 0.02 te doen.
Alleen kan ik de waarde van de kleur niet op tellen omdat het niet kan bij dit type variabele. Dit zou wel kunnen
met behulp van een float aangezien je bij deze variabele getallen kan gebruiken. Hoe kan ik dit doen?
De code ziet er als volgt uit. Hij zoomt, en vind de kleur maar hij zoomt niet in op de kleur wat uiteindelijk de bedoeling is.
import processing.video.*; //Importeer de videolibraries.
Capture myCapture; //Maak een nieuw object van de klasse myCapture aan, genaamd myCapture.
color trackColor; //Maak een variabele van het type color aan, genaamd trackColor.
int currentX, currentY, closestX, closestY; //Maak variabelen aan van het type int voor de x- en y-waarden.
float bestScore; //Maak een variabele aan van het type float, om de beste score in op te slaan.
color currentColor; //Maak een variabele aan om per pixel de huidige kleur in op te slaan.
float distance; //Maak een variabele aan waarin de afstand tussen twee kleuren kan worden opgeslagen.
//toegevoegde var
float r = 1.0; //Zoom waarde op 0 oftewel default
color zoomKleur; //2e kleur om een grens te stellen dat er meer kleuren paars gevonden kunnen worden
void setup() {
size(320,240); //Maak een werkvenster aan van 320 pixels breed en 240 pixels hoog.
frameRate(20); //Zet de frameRate van het programma op 20 schermverversingen per seconde.
myCapture = new Capture(this,width,height,int(frameRate)); //Vul het object myCapture d.m.v. de constructor,
//en maak het captureobject even groot als het werkvenster en geef het dezelfde framerate als het programma.
trackColor = color(255,0,255); //Voer in de variabele trackColor de kleurwaarde paars in.
zoomKleur = color(200,0,200);//heeft een iets lagere waarde dan de trackcolor om een grens te hebben voor paars
}
void draw() { //Voer alle geincludeerde code 20 maal (framerate) per seconde uit
if (myCapture.available()) { //Als er een nieuw beeld uit de myCapture bron aanwezig is,
myCapture.read(); //lees deze dan in.
}
//Dit zorgt voor het zoomen
scale(r);
//Dit zorgt voor het zoomen
myCapture.loadPixels(); //Laad de pixels uit het myCapturebeeld.
image(myCapture,0,0); //Geef het myCapturebeeld weer op het werkvenster.
bestScore = dist(255,255,255,0,0,0); //Maak een nieuwe variabele van het type float genaamd bestScore aan
//en stop hier de maximale afstand tussen twee RGB kleuren in.
closestX = 0; //Zet in de variabele closestX het getal 0.
closestY = 0; //Zet in de variabele closestY het getal 0.
//Verderop in het programma gaan we voor elke pixel uitrekenen in hoeverre de kleur hiervan overeenkomt met de kleur
//die we zoeken. De afstand tussen de kleur van de onderzochte pixel en de gezochte kleur moet zo klein mogelijk
//zijn. In de variabele bestScore wordt deze afstand opgeslagen. Hoe lager het getal, hoe beter de kleur van de
//gevonden pixel overeenkomt met de gezochte kleur. We zetten bestScore in het begin op 500, een waarde die, zo
//zullen we zien, gemakkelijk te overtreffen is.
for (int i = 0; i < myCapture.pixels.length; i++ ) { //Doorloop de iteratie voor pixel.
currentX = i%myCapture.width; //Reken de x-waarde behorende bij de huidige pixel uit.
currentY = (i-currentX)/myCapture.width; //Reken de y-waarde behorende bij de huidige pixel uit.
currentColor = myCapture.pixels; //Maak een variabele van het type color genaamd currentColor, en stop
//hier de kleurwaarde van de bij de iteratie behorende pixel in (dus van pixel 0 t/m 76799).
distance = dist(red(currentColor), green(currentColor), blue(currentColor),
red(trackColor), green(trackColor), blue(trackColor));
//Stop in de variabele distance de uitkomst van de functie dist
//met als parameters de kleurwaarden van de huidige pixel en de kleurwaarden van de gezochte kleur.
//De functie dist rekent de afstand tussen haar parameters uit.
if (distance < bestScore) { //Als de afstand tussen de kleur van de huidige pixel en de gezochte kleur kleiner is
//dan al eerder gevonden pixels,
bestScore = distance; //zet dan de huidige afstand in de variabele bestScore
closestX = currentX; //en sla de hierbij behorende xclosestY
closestY = currentY; //en y-waarden op.
}
}
if (bestScore < 200) { //als de kleinste afstand kleiner is dan 200 (dit heet een threshhold. Zet je de threshhold
//lager, dan wordt het programma accurater, maar zet je de threshhold hoger, dan zal het programma sneller resultaat
//boeken.
noFill(); //dan wordt de invulkleur op de trackkleur gezet,
strokeWeight(1.0); //de lijndikte wordt op 4.0 pixels gezet,
stroke(0,0,0); //de lijnkleur wordt op zwart gezet
ellipse(closestX,closestY,15,15); //en er wordt een cirkel met een diameter van 15 pixels om de pixel getekend die
//het beste overeenkomt met de gezochte kleur.
}
// Zorg dat er gezoomt kan worden op de kleurherkenning
if(trackColor < zoomKleur){
r += 0.02; //Zorgt dat de waarde met 0.02 ingezoomt wordt.
}
}
Hierbij moet ik op een bepaalde kleur inzoomen, in dit geval paars. De kleur heb ik een variabele 'color' van gemaakt.
En wil met behulp van een if statement hierop inzoomen, door de waarde += 0.02 te doen.
Alleen kan ik de waarde van de kleur niet op tellen omdat het niet kan bij dit type variabele. Dit zou wel kunnen
met behulp van een float aangezien je bij deze variabele getallen kan gebruiken. Hoe kan ik dit doen?
De code ziet er als volgt uit. Hij zoomt, en vind de kleur maar hij zoomt niet in op de kleur wat uiteindelijk de bedoeling is.
import processing.video.*; //Importeer de videolibraries.
Capture myCapture; //Maak een nieuw object van de klasse myCapture aan, genaamd myCapture.
color trackColor; //Maak een variabele van het type color aan, genaamd trackColor.
int currentX, currentY, closestX, closestY; //Maak variabelen aan van het type int voor de x- en y-waarden.
float bestScore; //Maak een variabele aan van het type float, om de beste score in op te slaan.
color currentColor; //Maak een variabele aan om per pixel de huidige kleur in op te slaan.
float distance; //Maak een variabele aan waarin de afstand tussen twee kleuren kan worden opgeslagen.
//toegevoegde var
float r = 1.0; //Zoom waarde op 0 oftewel default
color zoomKleur; //2e kleur om een grens te stellen dat er meer kleuren paars gevonden kunnen worden
void setup() {
size(320,240); //Maak een werkvenster aan van 320 pixels breed en 240 pixels hoog.
frameRate(20); //Zet de frameRate van het programma op 20 schermverversingen per seconde.
myCapture = new Capture(this,width,height,int(frameRate)); //Vul het object myCapture d.m.v. de constructor,
//en maak het captureobject even groot als het werkvenster en geef het dezelfde framerate als het programma.
trackColor = color(255,0,255); //Voer in de variabele trackColor de kleurwaarde paars in.
zoomKleur = color(200,0,200);//heeft een iets lagere waarde dan de trackcolor om een grens te hebben voor paars
}
void draw() { //Voer alle geincludeerde code 20 maal (framerate) per seconde uit
if (myCapture.available()) { //Als er een nieuw beeld uit de myCapture bron aanwezig is,
myCapture.read(); //lees deze dan in.
}
//Dit zorgt voor het zoomen
scale(r);
//Dit zorgt voor het zoomen
myCapture.loadPixels(); //Laad de pixels uit het myCapturebeeld.
image(myCapture,0,0); //Geef het myCapturebeeld weer op het werkvenster.
bestScore = dist(255,255,255,0,0,0); //Maak een nieuwe variabele van het type float genaamd bestScore aan
//en stop hier de maximale afstand tussen twee RGB kleuren in.
closestX = 0; //Zet in de variabele closestX het getal 0.
closestY = 0; //Zet in de variabele closestY het getal 0.
//Verderop in het programma gaan we voor elke pixel uitrekenen in hoeverre de kleur hiervan overeenkomt met de kleur
//die we zoeken. De afstand tussen de kleur van de onderzochte pixel en de gezochte kleur moet zo klein mogelijk
//zijn. In de variabele bestScore wordt deze afstand opgeslagen. Hoe lager het getal, hoe beter de kleur van de
//gevonden pixel overeenkomt met de gezochte kleur. We zetten bestScore in het begin op 500, een waarde die, zo
//zullen we zien, gemakkelijk te overtreffen is.
for (int i = 0; i < myCapture.pixels.length; i++ ) { //Doorloop de iteratie voor pixel.
currentX = i%myCapture.width; //Reken de x-waarde behorende bij de huidige pixel uit.
currentY = (i-currentX)/myCapture.width; //Reken de y-waarde behorende bij de huidige pixel uit.
currentColor = myCapture.pixels; //Maak een variabele van het type color genaamd currentColor, en stop
//hier de kleurwaarde van de bij de iteratie behorende pixel in (dus van pixel 0 t/m 76799).
distance = dist(red(currentColor), green(currentColor), blue(currentColor),
red(trackColor), green(trackColor), blue(trackColor));
//Stop in de variabele distance de uitkomst van de functie dist
//met als parameters de kleurwaarden van de huidige pixel en de kleurwaarden van de gezochte kleur.
//De functie dist rekent de afstand tussen haar parameters uit.
if (distance < bestScore) { //Als de afstand tussen de kleur van de huidige pixel en de gezochte kleur kleiner is
//dan al eerder gevonden pixels,
bestScore = distance; //zet dan de huidige afstand in de variabele bestScore
closestX = currentX; //en sla de hierbij behorende xclosestY
closestY = currentY; //en y-waarden op.
}
}
if (bestScore < 200) { //als de kleinste afstand kleiner is dan 200 (dit heet een threshhold. Zet je de threshhold
//lager, dan wordt het programma accurater, maar zet je de threshhold hoger, dan zal het programma sneller resultaat
//boeken.
noFill(); //dan wordt de invulkleur op de trackkleur gezet,
strokeWeight(1.0); //de lijndikte wordt op 4.0 pixels gezet,
stroke(0,0,0); //de lijnkleur wordt op zwart gezet
ellipse(closestX,closestY,15,15); //en er wordt een cirkel met een diameter van 15 pixels om de pixel getekend die
//het beste overeenkomt met de gezochte kleur.
}
// Zorg dat er gezoomt kan worden op de kleurherkenning
if(trackColor < zoomKleur){
r += 0.02; //Zorgt dat de waarde met 0.02 ingezoomt wordt.
}
}