spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Jozef Bakos 13.12.2016
Hodnoť článok:
0 0

Keď sa projekt zmení na poslanie a príbeh bez šťastného konca 1.

Dozviete sa ako som začínal od nuly vytvárať pomôcky pre umierajúcich ľudí.

Toto je príbeh o tom, ako sa môj sen stal poslaním, žiaľ bez šťastného konca. Príbeh, ktorý nemá koniec a zatiaľ vždy končí stále rovnako. Dozviete sa ako som začínal od nuly vytvárať pomôcky pre umierajúcich ľudí a kde v zúfalstve pretiekli aj moje posledné nervy.

Hotový produkt ovládaný očami:

Ako to začalo:

Asi každý jeden poznáme človeka, na ktorom nám záleží. Bol som u takého a videl som člena rodiny ležať na posteli, v tom čase mohol rozprávať. Myslel som si že má takzvanú roztrúsené sklerózu, no neskôr som sa dozvedel, že je to svalová dystrofia. Tak sme si s týmto človekom vzájomne vymenili naše ťažké životné príbehy. O to viacej som odchádzal zamyslený a smutný. Po nejakom čase s týmto priateľom sme si pri pive rozprávali o pomôcke, ktorá by mohla pomôcť. Navrhol som, že sa na to skúsim pozrieť a tak som aj učinil. Keď som ale videl tie závratné ceny za pomôcky, okamžite mi bolo jasné, že tadiaľto cesta nevedie. Za tú cenu by som vedel kúpiť horský bicykel na ktorom by som sa nemusel báť jazdiť aj dole Everestom. A tak kutil Jozef (ja) začal pracovať na riešení tohto nie bežného problému. Pravdu povediac nevedel som do čoho idem a neváhal by som si to kedykoľvek zopakovať.

Začíname teda od úplného začiatku, od prvého pokusu a omylu.

V tomto období som si dobre uvedomoval, že musím postaviť vlastné zariadenie na sledovanie pohybu oka. Taktiež aj to, že to budem písať najskôr v Delphi ( Lazarus ) a že program pre sledovanie očí bude musieť byť napísaný možno predsa len v inom jazyku.

Za zníženú kvalitu obrázkov sa ospravedlňujem, sú to úplné prvé dokumenty, ktoré som predstavil budúcemu investorovi.

Na začiatok som v podstate kúpil bezpečnostné okuliare, pozinkovaný drôt, izolačku a jednoduchú web kameru.

Kameru som rozobral takým spôsobom, aby som mal k dispozícii len elektroniku a samotný C-MOS snímač.

Kameru som pripevnil na bezpečnostné okuliare.

Tak a máme plne funkčné zariadenie a môžeme začať programovať. Experimenty v Delphi so spracovávaním obrazu po dlhej dobe skončili tak, že som bol schopný zobraziť obraz z kamery ale tam to aj skončilo. Nedokázal som donútiť program spracovávať obraz presne tak, ako som to očakával. Uvedomil som si, že potrebujem pomoc a že Delphi je mi v tomto prípade k ničomu. Našiel som jedného človeka s firmy Avast, ktorý bol síce arogantný a dosť sa povyšoval, ale javil sa ako znalý problematiky. Smial sa, že on je lepší ako ja, no a tak v zápale pre dobrú vec som mu uveril to, čo o sebe tvrdil, zároveň som veril že sa bude do toho hrnúť, keďže ide o ľudské osudy. Jeden kamaráť mi odporučil istého človeka, ktorý vie programovať aplikácie priamo pre robotov. A tak som sa sním skontaktoval a dohodli sme sa na cene ( jeho meno nezverejním, nechcel byť s týmto projektom spojený ). Poslal som mu zálohu a zariadenie čo som zostrojil. Postupne som sa začal učiť Processing, aby som mohol pokračovať v jeho stopách. Bohužiaľ, napriek jeho úprimnej snahe robiť všetko preto aby to fungovalo, mi jedného dňa napísal, že mi to nedokáže spraviť a že mi vráti zálohu. Bola to pre mňa tvrdá rana, keďže to už vyzeralo, že je to na dobrej ceste. Dohodol som sa s ním nech si nehál zálohu a nech mi iba pošle to, čo už ma hotové. Chcel som pokračovať v tomto projekte za každú cenu.

Prvý kód napísaný v Procesing, ktorý v podstate riešil môj problém:

/*
(C) Jozef Bakoš, jb@jbakos.sk
Publikované pod GNU/GPL v3
*/
// Import external function
import processing.video.*;
import java.awt.AWTException;
import java.awt.Robot;

// Global definition
Capture cam;
PImage img; // Eye motion detect
iWidth = 640; // Screen resolution Width
int ScreenHeight = 480; // Screen resolution Height
int brightestX = ScreenWidth/2; // X-coordinate of the brightest video pixel
int brightestY = ScreenHeight/2; // Y-coordinate of the brightest video pixel
int MouseXposition=ScreenWidth/2;
int MouseYposition=ScreenHeight/2;
PImage prevFrame; // Eye motion detect
Capture video;
Robot robot;
// Setup web cam and frame definition
void setup() {
size(ScreenWidth, ScreenHeight); // Setup screen resolution
String[] cameras = Capture.list(); // List of web cams
img = loadImage("jblogo.png"); // Load logo

// Check if web cam is available
if (cameras.length == 0) {
exit(); // Not present is exit
}

// Web cam available
cam = new Capture(this, cameras[0]);
println("Selected camera:"+ cameras[0]);
cam.start();
prevFrame = createImage(ScreenWidth,ScreenHeight,RGB);
try {
robot = new Robot();
}
catch (AWTException e) {
e.printStackTrace();
}
robot.mouseMove(displayWidth/2, displayHeight/2);
}
void draw() {
frame.setTitle("eyeCTRL by jb"); // Frame name
if (cam.available() == true) {
prevFrame.copy(cam,0,0,cam.width,cam.height,0,0,cam.width,cam.height);
prevFrame.updatePixels();
cam.read();
}
image(cam, 0, 0);
image(img, 0, ScreenHeight-60, img.width/2, img.height/2); // Show logo

// Draw a large, yellow circle at the darkest pixel
fill(255, 204, 0, 128);
//ellipse(brightestX, brightestY, 40, 40);


float brightestValue = 255; // Brightness of the darkest video pixel
// Search for the darkest pixel: For each row of pixels in the video image and
cam.loadPixels();
int index = 0;
for (int y = 0; y < cam.height; y++) {
for (int x = 0; x < cam.width; x++) {

int loc = x + y*cam.width;
color current = cam.pixels[loc];
color previous = prevFrame.pixels[loc];


float r1 = red(current); float g1 = green(current); float b1 = blue(current);
float r2 = red(previous); float g2 = green(previous); float b2 = blue(previous);
float diff = dist(r1,g1,b1,r2,g2,b2);
if (diff > 190) {

for (y = 0; y < cam.height; y++) {
for (x = 0; x < cam.width; x++) {
// Get the color stored in the pixel
int pixelValue = cam.pixels[index];
// Determine the brightness of the pixel
float pixelBrightness = brightness(pixelValue);
float pixelBrightness2 = brightness(pixelValue+1);
float pixelBrightness3 = brightness(pixelValue+2);
float pixelBrightness4 = brightness(pixelValue+3);
float pixelBrightness5 = brightness(pixelValue+4);
float pixelBrightness6 = brightness(pixelValue+5);
float pixelBrightness7 = brightness(pixelValue+6);
float pixelBrightness8 = brightness(pixelValue+7);
// If that value is darker than any previous, then store the
// brightness of that pixel, as well as its (x,y) location
if (pixelBrightness < brightestValue && pixelBrightness2 < brightestValue && pixelBrightness3 < brightestValue && pixelBrightness4 < brightestValue && pixelBrightness5 < brightestValue && pixelBrightness6 < brightestValue && pixelBrightness7 < brightestValue && pixelBrightness8 < brightestValue ) {
brightestValue = pixelBrightness;
brightestY = y;
brightestX = x;
println("Suradnice X: "+x+" Suradnice Y:"+y);
robot.mouseMove(x, y);
}
index++;
}
}
}
}
}

}

No vždy tu boli tie isté problémy, ktorými sú:

  • neurčitosť kurzora (x*x) + c = x ( entropia, teória chaosu, atraktory ) pokiaľ ste sa pozerali na to isté miesto, tak prepočítané súradnice mali odlišné údaje. Táto odchýlka sa postupne znásobovala a tým pádom nebolo možné ovládanie počítača zrakom. Tento problém sa mi zatiaľ nepodarilo úplne vyriešiť, ale podarilo sa mi ho aspoň eliminovať.
  • java extrémne vyťažovala procesor
  • podsvietenie dráždilo oko už po krátkej dobe používania
  • zariadenie spôsobovalo nepríjemné otlaky

Riešenie problémov:

  • podsvietenie som vymenil za infračervené po konzulatácii s očnou lekárkou
  • otlaky sa mi podarilo odstrániť lepším rozložením váhy a prítlaku vypolstrovaním konštrukcie

Keď som to dočasne vzdal s java a entropiou tak som sa začal venoval programovaniu aj iných dôležitých aplikácií, akými sú napríklad hlasový syntetizátor, personálny asistent a podobne. Všetko som to písal v Delphi, no ako sa časom ukázalo, je to tvrdý oriešok, keďže som používal Lazarus a ten mal nepredvídateľné chovanie. To, čo mne fungovalo na mojom PC, nešlo na inom a tak som začal zdvojovať algoritmus pre jednu a tú istú vec. Všetko bolo funkčné a na programy, ktoré som nedokázal vyrobiť v tej dobe som si zohnal za povolenia ich autorov. Bohužiaľ ale musím konštatovať, že zahraničný vývojári sú viacej ústretovejší ako naši.

V ďalšej časti si ukážeme podrobnejšie, ako mnou písané programy v Delphi fungovali, zdrojové kódy si môžete stiahnuť tu: http://jbakos.sk

Jozef Bakos Jozef Bakos

Astronóm, hacker, programator a milovník všetkého čo boh stvoril. Astronóm srdcom aj dušou nenávidím ľudskú hlúposť lebo ta je bez konca na rozdiel od vesmíru. Moje projekty: nadejazivot.sk


Hodnoť článok:
0 0

1 komentár k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

0 0 Jozef Bakos 14.12.2016 01:32:41
Ďalšia čast hotová.
Zajtra.sk > Technológie > Software > Keď sa projekt zmení na poslanie a príbeh bez šťastného konca 1.


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama