Módulo de visión por computador

Started by grisendo, November 22, 2009, 04:19:55 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

grisendo

Está bien, me rindo. Este es mi código:

[code language="c"]
#include "bgddl.h"
#include "highgui.h"
#include "libgrbase.h"
#include "libblit.h"
#include "SDL_image.h"
#include "g_pixel.h"

static int toGraph(INSTANCE *my, int *params){
    GRAPH *graph;
    IplImage* image;
    image=(IplImage*)params[0];
    graph=bitmap_new_syslib(image->width,image->height,image->nChannels);
    gr_put_pixel(graph,0,0,255);
    return((int)(graph->code));
}
[/code]

En el linker tengo libbgdrtm.dll y libgrbase.dll, y el error que tira es:

.\Image.o:Image.c:(.text+0xe75)    undefined reference to '_gr_put_pixel'
.\main.o:main.c:(.text+0x32d5)      undefined reference to '_gr_put_pixel'
                                                === Build finished: 2 errors, 0 warnings ===


Pero veo claramente que gr_put_pixel está ahí... en g_pixel.h, que lo incluyo.
Probando a incluir g_pixel.c en su lugar (he probado de todo...) me salta esto:

Info: resolving _sys_pixel_format by linking to __imp__sys_pixel_format

Me tira ese warning, y ningún error, pero no me genera nada (como si diese error).
¿Me sobra/falta algun include o alguna librería de linkar?
Me decanto a que el error es de linkar, no de compilar... pero no sé 100% seguro.

grisendo

Me auto-respondo, me faltaba linkar el liblit.dll xDDD qué tontería...

Ahora bien (otra vez necesito la opinión de los expertos)...

En C:
¿Qué valor le pongo al color pixel a partir de las componentes RGB? ¿Hay alguna macro?
He probado varios colores y me sale todo negro

En Bennu:
¿Qué "file" ha de usarse? Es decir, cuál es el file del nuevo bitmap que se crea

josebita

Primera pregunta:
Ahora mismo no sé qué contestar, tendría que mirar el código...

Segunda pregunta:
file para un bitmap creado en memoria (o a partir de cualquier cosa que no sea un fpg) es 0.

grisendo

Gracias!

Me vuelvo a auto-responder (no sé qué tiene este foro hoy, que es poner una pregunta y venirme a la cabeza cómo se hace).
El color es un entero (4 bytes): Primer byte componente azul, segundo componente verde, tercero el rojo y cuarto la opacidad xDD
Eso para colores de 32bits, para el resto ya me tocará investigar...

josebita

¡Eso es!.

Mira a ver si este código te vale de algo. No es lo que quieres, pero te puede dar una buena idea de cómo funcionan los colores exactamente.

[code language="c"]void gr_get_rgb( int color, int *r, int *g, int *b )
{
    /* 8 bits mode, work with system palette */

    if ( sys_pixel_format->depth < 16 )
    {
        rgb_component * rgb ;

        if ( !sys_pixel_format->palette )
            rgb = ( rgb_component * ) default_palette;
        else
            rgb = sys_pixel_format->palette->rgb ;

        color &= 0xFF ;
        ( *r ) = rgb[ color ].r ;
        ( *g ) = rgb[ color ].g ;
        ( *b ) = rgb[ color ].b ;

        return ;
    }

    ( *r ) = (( color & sys_pixel_format->Rmask ) >> sys_pixel_format->Rshift ) << sys_pixel_format->Rloss;
    ( *g ) = (( color & sys_pixel_format->Gmask ) >> sys_pixel_format->Gshift ) << sys_pixel_format->Gloss;
    ( *b ) = (( color & sys_pixel_format->Bmask ) >> sys_pixel_format->Bshift ) << sys_pixel_format->Bloss;
}[/code]

Windgate

Para 16 bits son 5 para rojo, 6 para verde y 5 para azul... Lo que no sé decirte es si los rojos son los más significativos o los menos... Yo diría que el rojo son los más significativos y en 32 bits yo diría que los más significativos son el alpha, pero tal como lo explica Grisendo (El 4º la opacidad) no sé si me da la razón o me la quita JoaZ :P

¿Por qué 6 bits para el verde? Pues por motivos históricos y políticos que tienen que ver con la belle epoque de los nazis y los judíos... Es broma, le dieron más precisión al verde porque nuestras características genéticas humanas están más adaptadas a entornos rodeados de vegetación, de allá cuando éramos monos (Incluso ratas), al menos eso es lo que dicen los libros ::)
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

josebita


SplinterGU

no hagas nada de eso, para los rgb tenes que usar las funciones que estan en el fuente g_pal.c en el modulo libgrbase.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Hola de vuelta Splinter, que placercillo verte de nuevo xD

Me temo que Grisendo y yo somos de los que todavía no usamos paletas, ¿Lo dices para darle validez "universal" al módulo, no?, para que funcione tanto para los que las usan como para los que no :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

grisendo

Puff... paletas... Recuerdo allá por los tiempos de DIV2 que había un juego de Dragon Ball que,
o bien me cargué yo mismo la paleta de algún FPG o bien cada FPG usaba la que le daba la gana,
porque no había forma de que todos los personajes estuviesen bien pintados a la vez.

Bueno, intentaré darle validez "universal" cuando consiga primero darle validez en 32-bits :P

Windgate

Yo con DIV lo mismo, les tenía pánico a las paletas y por eso en Bennu sólo las he tocado a partir de un ejemplillo que cambia el color de las ropas de un bicho, por creerme que funcionan bien, pero vamos, las instrucciones que hay que usar son un coñazo que te khagas.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

grisendo

#56
Quote from: Windgate on December 16, 2009, 12:17:42 AM
Para 16 bits son 5 para rojo, 6 para verde y 5 para azul... Lo que no sé decirte es si los rojos son los más significativos o los menos... Yo diría que el rojo son los más significativos y en 32 bits yo diría que los más significativos son el alpha, pero tal como lo explica Grisendo (El 4º la opacidad) no sé si me da la razón o me la quita JoaZ :P

¿Por qué 6 bits para el verde? Pues por motivos históricos y políticos que tienen que ver con la belle epoque de los nazis y los judíos... Es broma, le dieron más precisión al verde porque nuestras características genéticas humanas están más adaptadas a entornos rodeados de vegetación, de allá cuando éramos monos (Incluso ratas), al menos eso es lo que dicen los libros ::)

Me equivoqué con los colores. Tienes razón tú, de más a menos significativo es Alpha, Rojo, Verde y Azul

SplinterGU

gracias... pero no, no lo digo por las paletas... lo digo porque ahi estan las funciones de conversion RGB y RGBA, segun el formato del mapa y segun el formato del modo de video... las tenes todas...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

Aunque parezca mentira, sigo con la librería de 3d, solo que
estoy muy liado y no tengo mucho tiempo... esperemos que
la Navidad me deje respirar un poco más...

Primero de todo, las funciones es mejor hacerlas así:

[code language="c"]funcion(entrada,entrada2,salida)[/code]

Que así:

[code language="c"]salida=funcion(entrada,entrada2)[/code]

No? Porque de la segunda forma no es necesaria la variable de
salida, y al hacer llamadas "anidadas" funcion(funcion(funcion(entrada)))
se crearían zonas de memoria que luego no se puede acceder... y me imagino
que Bennu no tiene garbage collector. Al obligar a meter la salida como un
parametro más, estamos obligando a que siempre cada elemento esté asociado
a una variable y luego podamos reutilizarlas o borrarlas... no? Si me equivoco
y no hace falta me decís, es que es para reorganizar todas las funciones o no xD

Otra cosa, tengo problemas con una funcion, necesito meterle un parametro cadena, pero me peta en
tiempo de ejecución... lo he copiao tal cual de un ejemplo pero a mi no me va:

[code language="bennu"]
static int setPattern(INSTANCE *my, int *params){
    TrackSystem *track=(TrackSystem *)params[0];
    char *cadena=(char *)string_get(params[1]);
    track->patron=(CvHaarClassifierCascade*)cvLoad(cadena,0,0,0);
    string_discard(params[1]);
   return(1);
}
[/code]

Finalmente, he subido un RAR actualizado de dos "juegos" con la librería experimental.
El primero el de siempre de las monedas, pero ahora se ve la imagen de la webcam
como fondo del juego. El segundo (esta muy chapucero) un intento de integración
en un ejemplo sencillo del motor 3D (no tengo ni guarra de usar el 3D, a ver si Windgate
me hace algo en condiciones, yo he tocao la primera variable que he pillao y he tenido
suerte de que el bicho giraba xDD). El juego es un truño, solo puedes girar la cabeza
y ya está (y ENTER para resetear si se pierde, como siempre), sólo quería probarlo con
3D.

La direción de siempre: http://www.grisendo.com/subidas/opencv.rar

Salud!

Drumpi

Hombre, hasta donde se, el devolver un valor no gasta memoria salvo en la función que guarda el dato (si es que guarda el dato en una variable). El usar paso por referencia (siempre lo confudo con "paso por valor") también requiere de dicha variable, pero es una menos en la función llamada... peeeero, ya estamos trabajando con punteros, y eso es algo con lo que hay que tener mucho cuidado.
Si estamos hablando de C, no hay problema, porque ahi eres tu el que controla el asunto y lo puedes hacer como venga en gana. El problema es que hablemos de código Bennu, porque al usuario novato no se le puede pedir que haga según qué cosas (una función como GET_RGB es algo complejo para el que no ha visto un IF en su vida).

Respecto a las cadenas, ni idea, eso estaba prohibidísimo en clase de C (usad listas enlazadas, decía). ¿Puede ser que te falte la declaración de tipos (una cadena de tipo IIIEI...)?

Por cierto, te has ganado un karma por tu MP, la única alegría de todo el día ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)