Rozpoznávanie čiarových kódov: Rozdiel medzi revíziami
Zo stránky SensorWiki
Vytvorená stránka „ Inšpirovať sa môžete napríklad týmto LEGO strojom na meranie ohniskovej vzdialenosti šošoviek: https://youtu.be/0kHhbRbAFlc“ |
|||
(10 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
Modifikované cvičenie na DOMA: | |||
Inšpirovať sa môžete napríklad týmto LEGO strojom na meranie ohniskovej vzdialenosti šošoviek: https:// | == '''Úloha č. 1:''' == | ||
Nájdite doma ľubovoľnú šošovku a odmerajte jej ohniskovú vzdialenosť. Metódu merania si vymyslite, meranie a jeho výsledky | |||
zdokumentujte a nahrajte do classroomu. | |||
Inšpirovať sa môžete napríklad týmto LEGO strojom na meranie ohniskovej vzdialenosti šošoviek: https://www.youtube.com/watch?v=0kHhbRbAFlc | |||
<youtube>0kHhbRbAFlc</youtube> | |||
== '''Úloha č. 2:''' == | |||
Pomocou kamery vo svojom notebooku alebo mobile rozpoznajte čo najviac z týchto čiarových kódov. Za každý rozpoznaný kód je jeden bod. Pri demonštrácii správnej funkcie musíte ukázať viac ako jeden úspešný pokus a musíte tiež predviesť, že vám program nerozpoznáva kódy nesprávne (napríklad, ak niekto dokáže detekovať len A, | |||
nesmie jeho program ako A označiť aj B alebo C, ale práve len A). | |||
Do classroomu nahrajte zdrojový kód a screenshoty alebo video dokumentujúce funkciu programu. | |||
[[Súbor:CameraLineSensorSample.png|400px]] | |||
'''Návod:''' | |||
Prepojenie kamery a spracovanie obrázku v Processingu už viete z minulého cvičenia. Nižšie máte ukážkový program, ktorý zobrazí v okne | |||
okrem obrazu z kamery aj úroveň jasu jedného (prostredného) riadku. Úroveň jasu (brightness) sa pohybuje od 0 (čierna) po 255 (biela). | |||
Obraz z kamery viete v okne zapnúť/vypnúť klávesou 'c'. | |||
[[Súbor:CameraLineSensorExample1.jpg]] | |||
'''Čo ďalej?''' | |||
Stanovte si nejakú rozhodovaciu úroveň (threshold), od ktorej vyššie budete považovať farbu za bielu, a od ktorej nižšie za čiernu. | |||
Tým dostanete riadok hodnôt len s dvoma hodnotami - čiernou a bielou, napr. 0 a 1. | |||
[[Súbor:CameraLineSensorExample2.jpg]] | |||
Nás teraz zaujíma počet pásikov v obraze. Jedna možnosť ako to spočítať, je zistiť, koľko zmien 0->1 sa v poli nachádza. | |||
Mimochodom - zmena je vlastne derivácia, ktorá sa v diskrétnom priestore spočíta ako rozdiel dvoch po sebe idúcich hodnôt. | |||
Môžete teda pole "zderivovať" a potom už len spočítať, koľko je tam kladných zmien (a prípadne pre istotu porovnať, či | |||
je tam aj rovnaký počet záporných zmien). Týmto postupom viete zistiť, koľko čiernych prúžkov v obrázku máte a nebude to | |||
ani závislé od ich šírky. | |||
Ak chcete naviac porovnať aj šírku pásikov, pomôže vám domáca úloha z Repl.it. | |||
Pozn. 1: možno bude rozpoznávanie spoľahlivejšie, ak zahodíte zopár pixelov na oboch okrajoch obrazu. | |||
Pozn. 2: úlohy nie je nevyhnutné riešiť v Processingu, môžete použiť ľubovoľný programovací jazyk a prostredie, v ktorom viete pracovať. | |||
Pozn. 3: Predloha vzorov http://senzor.robotika.sk/sensorwiki/images/d/d6/CameraLineSensorSample.png | |||
'''Vzorový program''' | |||
<source lang="c"> | |||
import processing.video.*; | |||
Capture cam; | |||
int yOld,yNew; | |||
int[] camLine = new int[160]; // v tomto poli bude vas riadok | |||
boolean videoOnScreen=true; | |||
void setup() | |||
{ | |||
size(160, 120); // velkost okna prisposobime videu | |||
// tato cast tu nemusi byt, je tu len na zobrazenie vsetkych dostupnych videosluzieb | |||
String[] cameras = Capture.list(); | |||
if (cameras.length == 0) | |||
{ | |||
println("There are no cameras available for capture."); | |||
exit(); | |||
} | |||
else | |||
{ | |||
println("Available cameras:"); | |||
for (int i = 0; i < cameras.length; i++) | |||
println("[" + i + "] " +cameras[i]); | |||
} | |||
// potom si vyberiem bud zo zoznamu, napr. takto | |||
// cam = new Capture(this, cameras[0]); | |||
// alebo priamo urcim rozlisenie takto: | |||
cam = new Capture(this, 160, 120, cameras[0]); | |||
// Start capturing the images from the camera | |||
cam.start(); | |||
} | |||
void draw() | |||
{ | |||
if (cam.available()) | |||
{ | |||
cam.read(); | |||
cam.loadPixels(); | |||
// pixels je jednorozmerne dlhe pole po riadkoch ulozene | |||
// stredny pixel je tento: | |||
int j = cam.height / 2; | |||
int i = cam.width / 2; | |||
int pixelColor = cam.pixels[j*cam.width + i]; | |||
background(0); // cierne pozadie (a zaroven vymaze predosly?) | |||
noStroke(); | |||
if (videoOnScreen) | |||
{ | |||
set(0, 0, cam); // toto je v lavom hornom rohu | |||
} | |||
noFill(); | |||
stroke(255, 0, 0); // cervena farba ciary | |||
for (i=0; i<cam.width; i++) | |||
{ | |||
pixelColor = cam.pixels[j*cam.width + i]; | |||
camLine[i] = (int)brightness(pixelColor); // 0 je black, 255 white | |||
// naplnime riadok | |||
// toto uz je len kreslenie do obrazu: | |||
yNew = camLine[i]; | |||
yNew = (int)map(yNew,0,255,120,0); // preskalovanie 0-255 do 120-0 (lebo y suradnica zacina hore) | |||
line(i-1,yOld,i,yNew); | |||
yOld=yNew; | |||
} | |||
/* | |||
V poli int camLine[160] mate ulozeny cely stredny riadok. | |||
hodnoty su od 0 (cierna) po 255 (biela). Vasa uloha je najst | |||
nejaku prahovu hodnotu (treshold), rozlisit biele a cierne | |||
policka a rozlisit co najviac z predlozenych ciarovych kodov. | |||
Ak vas program rozpozna 1 kod, mate 1 bod, za vsetkych 7 kodov | |||
je 7 bodov. Zaroven ale nesmie program rozlisit tie nespravne. | |||
*/ | |||
} /* end of if */ | |||
} /* end of draw() */ | |||
void keyPressed() | |||
{ | |||
if (key == 'c') | |||
videoOnScreen = !videoOnScreen; | |||
} | |||
</source> | |||
[[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]] | |||
[[Category:MEMS]] |
Aktuálna revízia z 16:44, 14. marec 2022
Modifikované cvičenie na DOMA:
Úloha č. 1:
Nájdite doma ľubovoľnú šošovku a odmerajte jej ohniskovú vzdialenosť. Metódu merania si vymyslite, meranie a jeho výsledky zdokumentujte a nahrajte do classroomu.
Inšpirovať sa môžete napríklad týmto LEGO strojom na meranie ohniskovej vzdialenosti šošoviek: https://www.youtube.com/watch?v=0kHhbRbAFlc
Úloha č. 2:
Pomocou kamery vo svojom notebooku alebo mobile rozpoznajte čo najviac z týchto čiarových kódov. Za každý rozpoznaný kód je jeden bod. Pri demonštrácii správnej funkcie musíte ukázať viac ako jeden úspešný pokus a musíte tiež predviesť, že vám program nerozpoznáva kódy nesprávne (napríklad, ak niekto dokáže detekovať len A, nesmie jeho program ako A označiť aj B alebo C, ale práve len A).
Do classroomu nahrajte zdrojový kód a screenshoty alebo video dokumentujúce funkciu programu.
Návod:
Prepojenie kamery a spracovanie obrázku v Processingu už viete z minulého cvičenia. Nižšie máte ukážkový program, ktorý zobrazí v okne okrem obrazu z kamery aj úroveň jasu jedného (prostredného) riadku. Úroveň jasu (brightness) sa pohybuje od 0 (čierna) po 255 (biela). Obraz z kamery viete v okne zapnúť/vypnúť klávesou 'c'.
Čo ďalej?
Stanovte si nejakú rozhodovaciu úroveň (threshold), od ktorej vyššie budete považovať farbu za bielu, a od ktorej nižšie za čiernu. Tým dostanete riadok hodnôt len s dvoma hodnotami - čiernou a bielou, napr. 0 a 1.
Nás teraz zaujíma počet pásikov v obraze. Jedna možnosť ako to spočítať, je zistiť, koľko zmien 0->1 sa v poli nachádza. Mimochodom - zmena je vlastne derivácia, ktorá sa v diskrétnom priestore spočíta ako rozdiel dvoch po sebe idúcich hodnôt. Môžete teda pole "zderivovať" a potom už len spočítať, koľko je tam kladných zmien (a prípadne pre istotu porovnať, či je tam aj rovnaký počet záporných zmien). Týmto postupom viete zistiť, koľko čiernych prúžkov v obrázku máte a nebude to ani závislé od ich šírky.
Ak chcete naviac porovnať aj šírku pásikov, pomôže vám domáca úloha z Repl.it.
Pozn. 1: možno bude rozpoznávanie spoľahlivejšie, ak zahodíte zopár pixelov na oboch okrajoch obrazu.
Pozn. 2: úlohy nie je nevyhnutné riešiť v Processingu, môžete použiť ľubovoľný programovací jazyk a prostredie, v ktorom viete pracovať.
Pozn. 3: Predloha vzorov http://senzor.robotika.sk/sensorwiki/images/d/d6/CameraLineSensorSample.png
Vzorový program
import processing.video.*;
Capture cam;
int yOld,yNew;
int[] camLine = new int[160]; // v tomto poli bude vas riadok
boolean videoOnScreen=true;
void setup()
{
size(160, 120); // velkost okna prisposobime videu
// tato cast tu nemusi byt, je tu len na zobrazenie vsetkych dostupnych videosluzieb
String[] cameras = Capture.list();
if (cameras.length == 0)
{
println("There are no cameras available for capture.");
exit();
}
else
{
println("Available cameras:");
for (int i = 0; i < cameras.length; i++)
println("[" + i + "] " +cameras[i]);
}
// potom si vyberiem bud zo zoznamu, napr. takto
// cam = new Capture(this, cameras[0]);
// alebo priamo urcim rozlisenie takto:
cam = new Capture(this, 160, 120, cameras[0]);
// Start capturing the images from the camera
cam.start();
}
void draw()
{
if (cam.available())
{
cam.read();
cam.loadPixels();
// pixels je jednorozmerne dlhe pole po riadkoch ulozene
// stredny pixel je tento:
int j = cam.height / 2;
int i = cam.width / 2;
int pixelColor = cam.pixels[j*cam.width + i];
background(0); // cierne pozadie (a zaroven vymaze predosly?)
noStroke();
if (videoOnScreen)
{
set(0, 0, cam); // toto je v lavom hornom rohu
}
noFill();
stroke(255, 0, 0); // cervena farba ciary
for (i=0; i<cam.width; i++)
{
pixelColor = cam.pixels[j*cam.width + i];
camLine[i] = (int)brightness(pixelColor); // 0 je black, 255 white
// naplnime riadok
// toto uz je len kreslenie do obrazu:
yNew = camLine[i];
yNew = (int)map(yNew,0,255,120,0); // preskalovanie 0-255 do 120-0 (lebo y suradnica zacina hore)
line(i-1,yOld,i,yNew);
yOld=yNew;
}
/*
V poli int camLine[160] mate ulozeny cely stredny riadok.
hodnoty su od 0 (cierna) po 255 (biela). Vasa uloha je najst
nejaku prahovu hodnotu (treshold), rozlisit biele a cierne
policka a rozlisit co najviac z predlozenych ciarovych kodov.
Ak vas program rozpozna 1 kod, mate 1 bod, za vsetkych 7 kodov
je 7 bodov. Zaroven ale nesmie program rozlisit tie nespravne.
*/
} /* end of if */
} /* end of draw() */
void keyPressed()
{
if (key == 'c')
videoOnScreen = !videoOnScreen;
}