11/3/09

Feria 2008: Shooter/Mover mouse con la mano.

Para la feria de ciencias d la EET nº9 de Lanus del 2008 yo,pereira y britez teniamos algo en la mente: Un jueguito donde le disparas a unos logos de WindowsXP con una pistola de jugete a un monitor/pantalla de proyector.

El proyector teniamos (prestaba profesor), la pistola de juegete y la webcam las aporte yo.

La idea constaba de poner un led infrarojo arriba del monitor y una webcam atada a la pistola y hackeada para que no filtre los rayos infrarojos, pero filtrando todos los demas con el material de los diskettes (la cosa gris/negra/marron) y que mande una foto a una PC que detectaria la posicion del punto mas brillante (led infrarojo) y calcularia la posicion XY donde se esta apuntando.

El programa era una mezcla rara de C con opencv (libreria analizadora de imagenes) y bash.

/***laopencv.c***/

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>


int main(int argc, char *argv[])
{
  IplImage* img = 0;
  int height,width,step,channels;
  uchar *data;
  int i,j,k;

  if(argc<2){
    printf("Usage: main <image-file-name>\n\7");
    exit(0);
  }

  // load an image  
  img=cvLoadImage(argv[1],-1);
  if(!img){
    printf("Could not load image file: %s\n",argv[1]);
    exit(0);
  }

  // get the image data
  height    = img->height;
  width     = img->width;
  step      = img->widthStep;
  channels  = img->nChannels;
  data      = (uchar *)img->imageData;
  printf("Processing a %dx%d image with %d channels\n",height,width,channels);

  // create a window
  //cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
  //cvMoveWindow("mainWin", 100, 100);

  // invert the image
  //for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++)
  //  data[i*step+j*channels+k]=255-data[i*step+j*channels+k];

  //IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
  for (int x=0;x<width;x+=10) {
  for (int y=0;y<height;y+=10){
    CvScalar s;
    s=cvGet2D(img,y,x); // get the (i,j) pixel value
    printf("%f %i %i\n",s.val[0],x,y);
  }
  }

  // show the image
  //cvShowImage("mainWin", img );

  // wait for a key
  //cvWaitKey(0);

  // release the image
  cvReleaseImage(&img );
  return 0;
}

/***laopencv.c***/

/***shooter.sh***/

XY=($(./laopncv tmp.jpg | sort -r -n | head -n 1 | awk '{printf("%i %i",$2*3.41,$3*3.41)}'))
echo "mousemove ${XY[0]} ${XY[1]}" | xte

/***shooter.sh***/

El C esta practicamente robado de los ejemplos que vienen con la libreria, lo que hace es agarrar una foto y detectar el punto mas "brillante" (creo, yo en realidad fui cambiando el 0 en s.val: printf("%f %i %i\n",s.val[0],x,y);) hasta que me dio mas o menos lo que esperaba)

La documentacion daba asco, lo que encontramos era poco y dificil de entender, casi sin ejemplos simples.

La cosa esta andaba bastante bien, pero algo fallab enormemente: para adquirir la foto probamos cientos de comandos, tecnicas y programas, y todos tardaban mas de 1 segundo (lo que es excesivo siendo un jugeito de disparar que tenga un lag de mas de 1 segundo).

Capaz era el driver, capaz era la webcam, capaz mi kernel, nadie supo; pero el proyecto quedo ahi, ademas nadie tenia ganas de ensamblarlo(pereira = C, britez = PHP, alvare = Python, nadie sabia ni queria).

No solo eso sino que ademas si la persona era mas baja o se paraba mas cerca y al costado ya el mouse se movia para cualquier lado.

Bueno eso quedo en la nada, hace unos dias britez me viene mostrando progresos con una libreria llamada "touchlib" que encima es multitouch, con una caja y un vidrio (absurdamente simple comparado con nuestro pandemonium).

Dejo el codigo ahi, si cualquiera quiero robarlo, invitado sea.

4/3/09

Pygame error.

Si alguna vez le paso esto:

/usr/lib/python2.5/pydoc.py:1459: RuntimeWarning: use movieext: No module named movieext

Y se rompieron el tuje buscando una solucion yo la tengo.
Me habia baja un plugin para Vim que autocompletaba las clases, y cuando intentaba autocompletar pygame. tiraba un error. Despeus de googlear inutilmente intente arreglarlo yo, y encontre que el error surgia cuando pgyame intentaba cargar los mudulos, entonces la solucion fue esta:

[python]
try: import pygame.movie
except (ImportError,IOError), msg:movie=MissingModule("movie", msg, 0)

#try: import pygame.movieext
#except (ImportError,IOError), msg:movieext=MissingModule("movieext", msg, 0)

try: import pygame.surfarray
except (ImportError,IOError), msg:surfarray=MissingModule("surfarray", msg, 0)
[/python]

Comentarear esas dos lineas del demonio!
Habria que decirles a los de pygame de esto, solo apsaba con esa clase, movieext.

3/3/09

apt-cache search con colores.

Cuando use Arch lo que mas me gusto era que pacman era super colorido, eso ademas de facilitar las cosas es "sexy", yme decidi hacer que apt tambien tenga. Como hacer esto? Una RegEx horrible y gigantesca o recompilar apt y hacer bien las cosas?

acs (){
    echo -e `apt-cache search $* | sed "s:\s$*\s:\\\\\e[1;31m&\\\\\e[0m:I" | sed -e '2,$ s:^:\\\n:' -e 's:^\S*\s:\\\e[1;32m&\\\e[0m:'` #Fucking ReGeX !!!
}

Pones eso en tu .bashrc y ahora buscas haciendo:

$ acs package

Y el nombre del paquete saldra en verde, y las palabras exactas que buscaste en rojo. Ej:

Mas wallpapers Fractal/GIMP

Estos los hice cuando mi escritorio era todavia mas oscuro, pero ya se volvia dificil vivir en tanto negro. El primero es un IFS y el otro un Barnsley 3:


PS: Correr esto en Python:

# Alvare-ClrnD 2.66 @ 3.52
d = list(set("tuiqwnolyasedfjkhzxcmvb")^set ("qwryipasdfghjklzxcv bnm"))
b = "5321504673"
for q in range(len(b)): print d[int(b[q])],

GIMP Art for newcomers.

Hace poco me sumergi en el tema de los fractales, y descubri que podia hacer mis propios wallpapers sin robar de algun 3º. La posta esta en los fractales tipo flama, aca dejo una compilacion de mierdas:




Use GIMP !