• Domingo 22 de Diciembre de 2024, 09:35

Autor Tema:  Empezando con Delphi  (Leído 3689 veces)

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Empezando con Delphi
« en: Jueves 20 de Agosto de 2009, 17:55 »
0
Hola! Estoy empezando con Delphi, haber si alguien me puede ayudar con tratamiento de imágenes usando Delphi. La sintaxis la llevo bien, ya que es como Pascal. Mi problema esta en que tengo que usar una matriz muy grande y me da un error de overflow (esta matriz la necesito porque tengo que etiquetar cada pixel de una imagen en blanco y negro mediante un algoritmo) Habia pensado en usar un vector de vectores... pero no se muy bien como implementarlo. También he visto algo sobre la función setLenght que he intentado usar. Gracias adelantadas. Un saludo  :)
« última modificación: Miércoles 26 de Agosto de 2009, 22:08 por zany_666 »
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Empezando con Delphi e Imagenes
« Respuesta #1 en: Jueves 20 de Agosto de 2009, 21:13 »
0
Disculpa, ¿qué estás intentando hacer?, porque hay que ser muy caballo para provocar un overflow en Delphi  :D (y lo digo con todo respeto).

Quizás tu idea es buena pero la implementación que intentas hacer es errónea. Muéstranos algo de código para ver qué está pasando y una explicación del algoritmo en cuestión.

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Re: Empezando con Delphi e Imagenes
« Respuesta #2 en: Viernes 21 de Agosto de 2009, 18:53 »
0
Ala que estoy empezando jajajaja.  :nosweat:

Por cierto, lo he solucionado ^^ gracias. Lo que hecho ha sido poner un ARRAY OF ARRAY OF integer y asignarle tamaño con la función setLeght, un tamaño aproximado de 1700 x 1500 (el tamaño de mi imagen).
Pero me ha surgido otro problema:
             - La imagen que abro es un texto
             - Lo que debo hacer con esa imagen es recuadrar cada una de las palabras mediante segmentación.
             - Para poder segmentarlas uso un algoritmo de componentes conexas, esto lo que hace es etiquetarme cada pixel con una etiqueta y los pixeles con        una misma etiqueta pertenecerá a la misma palabra.
             - Antes de eso, debo hacer que las letras de una misma palabra estén unidas para que el algoritmo me lo reconozca como una unidad
             - Para ello, uso una técnica llamada dilatación, que he implementado en Delphi. Lo que hace es "engordar" cada una de las letras haciendo que las letras de una misma palabra se junten.

Mi problema es que lo hace correcto hasta que llega más o menos al punto intermedio, donde no hace absolutamente nada. Para hacer esto me recorro la imagen con 2 FOR pero no se porque llega hasta un punto y se "para". En un principio las variables de los bucles eran integer, pero puse longint por si podia resolver el problema pero no fue asi. Como puedo hacer para que me recorra la imagen entera?¿?

Espero que podais ayudarme, gracias. :ayuda:
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Empezando con Delphi e Imagenes
« Respuesta #3 en: Viernes 21 de Agosto de 2009, 23:30 »
0
Bueno, acá sí necesito algo de código para mirar. Pues lo que me has dicho no me sugiere ninguna solución al problema. De hecho no estoy seguro que haya un problema en primer lugar pero igual, necesito ver algo de código. Pon el código de los for relevantes (los que dices que se paran), quitando todo lo que te parezca irrelevante.

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Re: Empezando con Delphi e Imagenes
« Respuesta #4 en: Sábado 22 de Agosto de 2009, 18:45 »
0
Lo he comprobado y he tenido que cambiarlo. Había cambiado la anchura por la altura, por eso me recorria hasta aproximadamente la mitad:

CODIGO:
For y:=0 to miImagen.Picture.Bitmap.Height -1 do
          For x:=0 to miImagen.Picture.Bitmap.Width - 1 do BEGIN
                    color_pixel:=GetRValue(miImagen.Picture.Bitmap.Canvas.Pixels[x,y]);
                    if color_pixel=0 then begin
                               imagenDilatada.Canvas.MoveTo(x,y);
                               imagenDilatada.Canvas.LineTo(x+5,y);
                     end;{if}
          end;{for}

Habia cambiado las señaladas en rojo, el que he puesto es correcto.

Por cierto, habría otra forma de hacer lo mismo? Es que he escuchado que habia una funcion (creo que era getLine, pero no recuerdo) que almacenaba todos los pixeles de una fila o algo asi, para reducir el tiempo en que se realiza el procedimiento, porque me tarda unos segundos y me gustaría poder reducirlo.
Y otra cosilla, como puedo cambiar el color de la linea (ahora me recuadra las palabras pero en negro) usando lineTo.

Gracias!
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Empezando con Delphi e Imagenes
« Respuesta #5 en: Domingo 23 de Agosto de 2009, 05:34 »
0
Pues tocará buscar en la ayuda de la clase TCanvas. Me parece que sí hay algo así pero mejor checalo tú que eres quien sabe qué es lo que necesitas.

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Re: Empezando con Delphi e Imagenes
« Respuesta #6 en: Domingo 23 de Agosto de 2009, 23:34 »
0
He usado pen.color:=clBlue para poner color azul.Gracias! Otra cosa he usado rectangle para hacer un rectangulo, pero puede hacerse de forma que sea sin relleno?  :)

EDIT: Solucionado! Con Brush.Style:=bsClear; no pone relleno  :lol:
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Re: Empezando con Delphi
« Respuesta #7 en: Miércoles 26 de Agosto de 2009, 22:07 »
0
Bueno, tengo alguna dudilla mas con delphi, est vez de como leer un archivo binario. No se muy bien como leer un campo de un registro, me explico:

- Tengo un tipo TRegistro con diferentes campos:
Código: Text
  1. TRegistro=RECORD
  2.               campo1:string[1];
  3.               campo2:integer;
  4.          end;
  5.  
  6.  

- Y un fichero binario que contiene los registros: miFichero: FILE OF TRegistro;

Como puedo leer cada campo de cada registro y avanzar por el fichero (posicionanndome de registro en registro y de cada registro leer todos sus campos????

He probado esto (suponiendo que las variables auxiliares tienen el mismo tipo que el campo del TRegistro):
Código: Text
  1.  
  2. var
  3.    registro:TRegistro;
  4.    f:file of TRegistro;
  5. begin
  6.     AssignFile (f,'fichero.fic');
  7.     Reset (f);
  8.     while not EOF(f) do begin
  9.            Read (f,registro.campo1);
  10.            campoAuxiliar:=registro.campo1;     {Aqui, seria correcto: campoAuxiliar:=campo1; ???}
  11.            Read (f,registro.campo2);
  12.            campoAuxiliar2:=registro.campo2;
  13. end;
  14.  
  15.  

Esta correcto?¿? Es que las instrucciones read creo que no están bien. He googleado pero no he visto ejemplos con registros de forma clara.

Gracias de antemano!
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Empezando con Delphi
« Respuesta #8 en: Jueves 27 de Agosto de 2009, 09:28 »
0
Deberías haber creado un tema nuevo en el foro porque esta pregunta no tiene nada que ver con la original.

Pues nada, a lo nuestro:

Cita de: "zany_666"
Código: Text
  1.  
  2. var
  3.    registro:TRegistro;
  4.    f:file of TRegistro;
  5. begin
  6.     AssignFile (f,'fichero.fic');
  7.     Reset (f);
  8.     while not EOF(f) do begin
  9.            Read (f,registro.campo1);
  10.            campoAuxiliar:=registro.campo1;     {Aqui, seria correcto: campoAuxiliar:=campo1; ???}
  11.            Read (f,registro.campo2);
  12.            campoAuxiliar2:=registro.campo2;
  13. end;
  14.  
  15.  

Esta correcto?¿? Es que las instrucciones read creo que no están bien. He googleado pero no he visto ejemplos con registros de forma clara.

Pues no, no es así. Read() cuando lee un archivo con tipo lee un registro completo y no "campo a campo". Y luego de cada lectura avanza el puntero al siguiente registro, estonces según tu código deberías hacer:
Código: Delphi
  1.  
  2. var
  3.    registro:TRegistro;
  4.    f:file of TRegistro;
  5. begin
  6.     AssignFile (f,'fichero.fic');
  7.     Reset (f);
  8.     while not EOF(f) do begin
  9.            Read (f,registro);
  10.            campoAuxiliar:=registro.campo1;     { siempre y cuando campoAuxiliar sea del mismo tipo que .campo1 }
  11.            campoAuxiliar2:=registro.campo2; { idem anterior }
  12.    end; // while
  13.   CloseFile(f); { no es educado dejar la puerta abierta cuando te marchas :D }
  14. end;
  15.  
  16.  

Saludos.

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Re: Empezando con Delphi
« Respuesta #9 en: Jueves 27 de Agosto de 2009, 22:35 »
0
Gracias!

Citar
Deberías haber creado un tema nuevo en el foro porque esta pregunta no tiene nada que ver con la original.

Mis disculpas. Pense que al ser de Delphi.. en fin pensé que más post serian molestos  ^_^  me van surgiendo dudas de diferentes tipos...

Haré los post según el tema jejeje
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: Empezando con Delphi
« Respuesta #10 en: Viernes 28 de Agosto de 2009, 02:59 »
0
Cita de: "zany_666"
Gracias!
De nada :)
Cita de: "zany_666"
Mis disculpas. Pense que al ser de Delphi.. en fin pensé que más post serian molestos  ^_^  me van surgiendo dudas de diferentes tipos...
Por el contrario, amigo. Es mejor cuando cada tema tiene un tema específico porque así el visitante ocasional puede ver en la lista si su duda o interés está allí, de lo contrario tendría que navegar página tras página si los temas estuvieran mezclados en un solo tema.

Un saludo.