Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-03-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Acelerar carga de imágenes desde archivo

Un saludo a todos.
Estoy desarrollando un programa que permite visualizar imágenes médicas, en formato .dcm.
Estas imágenes se almacenan en el disco duro en carpetas que poseen la siguiente estructura:

Estudio > Series > Imágenes (.dcm)

Se llaman las imágenes a partir de la ruta del directorio Estudio, la que se encuentra almacenada en una BD de Access.
El problema es que cada imagen pesa 0.5 Mb y un estudio puede contener hasta 2000 imágenes, o sea 1 Gb, lo que obviamente produce un retardo en su aparición en el visor.

¿Es posible acelerar este proceso?

El código que utilizo para llamar las imágenes es el siguiente:

Código Delphi [-]
procedure TVisor.ButtonCargarClick(Sender: TObject);
begin
CnsDMTable1.Clear;
DicomMultiViewer1.DicomDatasets.Clear;
try
CnsDMTable.LoadDcmFileDirEx(DBEditDir.Text);
Application.ProcessMessages;
finally
DicomMultiViewer1.ActiveView.Attributes.ImageData.MagnificationType:= mftCUBIC;
DicomMultiViewer1.Update;
end;
end;

CnsDMTable es una tabla temoral que permite la carga de imágenes desde directorios, archivos o streams.
DicomMultiViewer1 es el Visor de imágenes (algo así como un TImage mejorado).
DBEditDir muestra el directorio donde se encuentran almacenadas las imágenes en el disco duro.
Como siempre agradezco cualquier ayuda.

Salu2
Responder Con Cita
  #2  
Antiguo 04-03-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
¿No hay sugerencias para acelerar la carga de las imágenes?
Salu2
Responder Con Cita
  #3  
Antiguo 04-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.067
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hola, ¿y en qué tarda?, ¿descargarla, la red, el disco, procesado, presentación, etc.?, ¿lo has comprobado?
Responder Con Cita
  #4  
Antiguo 04-03-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Hola, ¿y en qué tarda?, ¿descargarla, la red, el disco, procesado, presentación, etc.?, ¿lo has comprobado?
Estimado Casimiro Notevi:

Muchas gracias por responder.
La demora se produce al cargar las imágenes desde el disco duro en la tabla temporal (CnsDMTable1), que está conectada al Visor (DicomMultiViewer1), dependiendo del tamaño del archivo puede ser desde unos segundos hasta 1-2 minutos. Esto ocurre en mi computador (HpWorkstation Z1) que posee un procesador Xeon de 8 núcleos, de 3.4 Ghz, con 16 Gb de Ram y un SSD de 240 Gb, aunque estoy seguro que todo ese potencial no lo aprovecha ni mi programa ni Delphi, por ser de 32 bits. Otros programas comerciales similares no presentan tanto retraso.
Es posible implementar streams o threads que aceleren el proceso. Si bien he leido algo sobre estos no tengo idea de como se pueden implementar.

Saludos
Responder Con Cita
  #5  
Antiguo 04-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.067
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Está claro que tienes algún problema raro por ahí, no puede tardar 2 minutos en presentar una imagen, ni un minuto, vería normal como mucho 1 segundo.
¿Acaso cargas las 2000 imágenes de una vez?
Haría falta saber exactamente qué hace tu programa y cómo.
Responder Con Cita
  #6  
Antiguo 04-03-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Estimado Casimiro Notevi :

Tienes toda la razón. Deben cargarse todas las imágenes de un determinado directorio, que pueden llegar a 2000 o más.
Los archivos de imágenes médicas en formato dicom3 se obtienen de equipos de Tomografía computada y Resonancia magnética, entre otros y representan volúmenes de diversas partes del cuerpo, que se segmentan en " cortes" de un determinado espesor. Una analogía burda podría ser por ejemplo un pan de molde, que representa el volumen y cada rebanada representa una imagen.
Este volumen puede manipularse ya sea rotandolo o seccionandolo en cualquier plano.
Si lo deseas te puedo enviar por correo un visor básico que yo desarrollé, que hace lo que te señalo, para que puedas comprender mejor lo que trato de resolver. Pesa sólo 2 Mb y no requiere instalación.

Te saluda y agradece

Iván
Responder Con Cita
  #7  
Antiguo 04-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.067
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¡Oh!, es que cargar tantísimas imágenes es normal que tarde, salvo que tengas un equipo muy potente, con muchísima memoria, una tarjeta gráfica "monstruosa", etc.
Suponiendo que tarde 0,1 segundos en cargar una, para cargar 100 necesitaría 10 segundos, si hablas de 2000
No sé, quizás puedas tener las imágenes en pequeñitas cada una y sólo cargar las grandes cuando realmente sean necesarias, por decir algo.
Responder Con Cita
  #8  
Antiguo 05-03-2013
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.915
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Bueno, el problema es que obviamente cargar 2000 imagenes sequencialmente + sincronico va ser lento, y traga cpu y memoria. El asunto es como evitarlo.

Hay 2 cosas que son la causa de la lentitud.

1- Sequencial. Para acelerar un proceso sequencial, lo debes hacer es volverlo asincrónico y/o paralelo. Lo que describes se paraleliza facil porque la imagen N+1 no depende de la imagen previa N ni de la imagen N+2. Para esto, uso de threads y/o liberia asincronica con threads verdes o corutinas

Eso es lo que parece mas obvio, pero el dia que cargues 100.000 imagenes la PC se va a morir.

2- Lo mejor, es solo cargar lo que es necesario para que el usuario visualize las imagenes, pero no mas. Eso se llama un "stream" o una fuente de datos "virtual".

El ejemplo mas popular ahora es lo que se usa en iOS:

http://developer.apple.com/library/i...ViewDataSource

Lo que se hace es que en vez de cargar TODOS los datos en una estructura, se carga solos N necesarios (mas un poquito mas para que no haya un parpadeo al desplazarse con scroll) y se van reciclando las estructuras en la medida que vayan cargandose las cosas. Si buscas como se usa un UITableViewController en tutoriales de iOS veras el esquema, pero te lo voy a poner en seuodocodigo:

El truco se parte, al menos, en 2 partes.

Primero, debes usar un "Record Count" que puede ser totalmente inventado o real. Luego solicitas el "registro" numero N. Ese registro lo buscas en una cola (o matriz o lista). Si esta, lo devuelves, sino, lo cargas de donde sea que este el verdadero registro.

Esto significa que debes recordar en cual registro vas.

O sea:

Código:
function AltoVisualizacion:
  //Aqui calculas el alto de la celda o fila, o de la foto o lo que sea. Si es estatico retornas un #, sino debes llamarlo luego de retornar la imagen y consultar su alto
  return 100

function TotalImages:
    return 1000000 //De alguna manera averiguaste el total. O pones un numero alto pa arrancar, y progresivamente mientras avanzas creces el totalimagenes hasta que te das cuenta que no hay mas...

function RetornarImagen:(posicion:Int):
   img = nil
   imgCtrl = nil

   llaveControl = 'Imagen' //Si tienes varios tipos de visualizadores, un diccionario con cada uno.

   if llaveControl in ListaCache:
     imgCtrl = ListaCache[llaveControl] //Este es el control que muestra la imagen, no la imagen en si
   else
    imgCtrl = CrearControlImagen();
    ListaCache[llaveControl] = img

   img = CargarImagenAhoraSiEnSerio(posicion)

   return img
Una variacion que simplifica la cosa, si puedes obtener la lista de archivos a ver muy rapido (que es lo que parece) es meter en un array o hastable la info de los archivos y usarlo como apuntadores al dato real:

Código:
function AltoVisualizacion:
  //Aqui calculas el alto de la celda o fila, o de la foto o lo que sea. Si es estatico retornas un #, sino debes llamarlo luego de retornar la imagen y consultar su alto
  return 100

function TotalImages:
    return ListaArchivos.Count()

function RetornarImagen:(posicion:Int):
   img = nil
   imgCtrl = nil

   llaveControl = 'Imagen' //Si tienes varios tipos de visualizadores, un diccionario con cada uno.

   if llaveControl in ListaCache:
     imgCtrl = ListaCache[llaveControl] //Este es el control que muestra la imagen, no la imagen en si
   else
    imgCtrl = CrearControlImagen();
    ListaCache[llaveControl] = img

   img = CargarImagenAhoraSiEnSerio(ListaArchivos[posicion])

   return img
La ultima cosa es si la imagen es lenta de cargar. Uniendo a lo anterior, se peude colocar una imagen "temporal", se carga la real de forma asincronica, y se cambia la temporal por la real cuando esta lista. Asi es posible incluso cargar imagenes desde internet.

Eso se enlaza con el control que llama la fuente de datos virtual para alimentarse. Con este esquema, no importa si son 1 o un millon, el gasto d ememoria y CPU nunca sera mayor a AltoVisualizacion() * AltoDeLaVentana() + ImagenesPrecargadasExtra.

Este esquema es la razon principal por la que en iOS se pueden visualizar miles o millones de registro, super rapido, super eficiente en maquinas menos potentes que un desktop. Cuando lo aprendi, me di cuenta de lo idiota que es el modelo de todos los demas lenguajes y frameworks
__________________
El malabarista.

Última edición por mamcx fecha: 05-03-2013 a las 00:05:59.
Responder Con Cita
  #9  
Antiguo 05-03-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Muchas gracias mamcx :

Parece que por ahí va la cosa.
Me imaginaba que la solución era utilizar algo como lo que tu señalas, que te muestre sólo lo que vas necesitando y guarda en memoria los posibles pasos siguientes.
A pesar de que no me manejo muy bien en lo que tú me has señalado, como mi proyecto es por hobby y por desafío personal, me mantendré entretenido con tus sugerencias por un buen tiempo.
Muchas gracias por tu aporte y espero encontrar la solución.
Saludos.
Responder Con Cita
  #10  
Antiguo 05-03-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¡Oh!, es que cargar tantísimas imágenes es normal que tarde, salvo que tengas un equipo muy potente, con muchísima memoria, una tarjeta gráfica "monstruosa", etc.
Suponiendo que tarde 0,1 segundos en cargar una, para cargar 100 necesitaría 10 segundos, si hablas de 2000
No sé, quizás puedas tener las imágenes en pequeñitas cada una y sólo cargar las grandes cuando realmente sean necesarias, por decir algo.
Muchas gracias Casimiro Notevi.
Tus aportes me hacen encarar mejor este proyecto y sus desafíos.
De hecho las imágenes que identifican a cada serie de un examen justamente son .bmp tumbnails de 100 x 100 y se muestran en el programa como "aperitivo" de lo que contiene cada estudio.
Salu2
Responder Con Cita
  #11  
Antiguo 25-04-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
He estado intentando cargar las imágenes en un TMemoryStream con el siguiente código:

Código Delphi [-]
for I := 0 to ListBox1.Count - 1 do
begin
DicomStream := TMemoryStream.Create;
DicomStream.Clear;
DicomStream.LoadFromFile(ListBox1.Items.Strings[i]);
DicomStream.Position:= 0;
try
CnsDMTable1.LoadFromStream(DicomStream, False);
Application.ProcessMessages;
DicomMultiViewer1.DicomDatasets:= CnsDMTable1;
DicomMultiViewer2.DicomDatasets:= CnsDMTable1;
DicomMultiViewer5.DicomDatasets:= CnsDMTable1;
DcmMultiImage1.DicomDatasets:= CnsDMTable1;
finally
DicomStream.Free;

Donde el ListBox contiene los strings de las rutas de las imágenes y a partir del MemoryStream cargar las imágenes en la CnsDMTable que se conecta al visor para mostrar las imágenes de formato .dcm
Sin embargo el stream sólo carga los strings de la ubicación de las imágenes como tales y no como archivos de imágenes, por lo que la carga finalmente es igual de lenta.
¿Cómo puedo cargar en un TMemoryStream o TFileStream las imágenes y no sus rutas de ubicación en el HD?
Agradezco sus valiosos aportes.
Saludos
Responder Con Cita
  #12  
Antiguo 25-04-2013
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 22
gatosoft Va camino a la fama
Cita:
Empezado por radenf Ver Mensaje
Estimado Casimiro Notevi :

Tienes toda la razón. Deben cargarse todas las imágenes de un determinado directorio, que pueden llegar a 2000 o más.
Los archivos de imágenes médicas en formato dicom3 se obtienen de equipos de Tomografía computada y Resonancia magnética, entre otros y representan volúmenes de diversas partes del cuerpo, que se segmentan en " cortes" de un determinado espesor. Una analogía burda podría ser por ejemplo un pan de molde, que representa el volumen y cada rebanada representa una imagen.
Este volumen puede manipularse ya sea rotandolo o seccionandolo en cualquier plano.
Si lo deseas te puedo enviar por correo un visor básico que yo desarrollé, que hace lo que te señalo, para que puedas comprender mejor lo que trato de resolver. Pesa sólo 2 Mb y no requiere instalación.

Te saluda y agradece

Iván

Bueno, ¿¿¿pero realmente es necesario cargar las 2000 imagenes al tiempo???, una vez en memoria ¿cómo las muestras? armas una imagen tridimencioal del "pastel" con cada "corte"?...

Porque si no es asi, puedes hacer lo que te han aconsejado Casimiro y Mamcx... "Mostrar solo lo que necesites"....Trabaja cargando imagenes en un buffer... 20, 30 imágenes.... y como dice mamcx vas cargando y si quieres dejando en memoria lo que ya cargaste....

Por otro lado... ¿porque cargas la imagen físicamente en una tabla?, Si necesitas cargarlas todas, intenta dejarla en memoria (utiliza una lista de objetos TMemoryStream). Porque como entiendo el problema, cargar la imagen en el TMemoryStream es un trabajo y Grabarlo en la BD es otro trabajo para el procesador....

Si necesitas la tabla para almacenar datos adicionales, pues almacenalos, pero cambia el campo de la imagen por una referencia (un indice de tu arreglo de imagenes en memoria).....

Tu mismo lo dijiste:
Cita:
Empezado por radenf Ver Mensaje
La demora se produce al cargar las imágenes desde el disco duro en la tabla temporal
Responder Con Cita
  #13  
Antiguo 25-04-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Gracias por responder [gatosoft].
En realidad se deben cargar todas las imágenes, porque como tú señalas el programa posee la opción de hacer reconstrucciones volumétricas, ya que debe operar con datasets específicos DICOM. La CnsDMTable es uno de los componentes de DicomVCL y no está ligada a ninguna base de datos, es autónoma, de tipo temporal.
No tengo la más mínima idea e como estructurar un buffer, pero lo ideal sería poder ir llamando las imágenes como tú señalas, de acuerdo a lo que se va necesitando, 20 o 30 para la visualización 2D y todas para las reconstrucciones, con algún método que evite que consuma toda la RAM del equipo.
Una idea de cómo es el programa la puedes ver en mi proyecto inconcluso de página web www. softmedica.cl
Saludos y muchas gracias
Responder Con Cita
  #14  
Antiguo 25-04-2013
jmvene jmvene is offline
Miembro
NULL
 
Registrado: abr 2013
Ubicación: Sevilla
Posts: 11
Poder: 0
jmvene Va por buen camino
Buenas tardes Radenf,

yo también uso la DicomVCL pero solo para la parte 3D de nuestra solución, para el tema del 2D llevamos varios años con otras librerías que nos parecen mas robustas.

Con respecto al tema de la carga, es verdad que cuando empezamos a trabajar con estudios que tienen series de hasta 3000 cortes la cosa empieza a ponerse difícil. La solución "carga lo que muestra" es la mejor, y si quieres darle un apretón de tuerca mas, incluso tendría un segundo hilo que mientras no te estas moviendo por la serie ("lo que muestra" esta fijo) vaya cargando en "background" lo que queda de los ficheros.

En nuestra solución no hemos llega tan lejos pero hemos encontrado una solución "intermedia" que nos vale (por ahora) y es usar un hilo para cargar las imágenes y mostrar las imágenes que se tal y como se van cargado en el visor (a través de racionalización con el hilo principal). La principal ventaja, es que el radiologo puede empezar a visualizar y manipular imágenes desde la imagen 1. Problema, que hasta que no se halla terminado de cargar el estudio no puede lanzar el 3D ni el MPR (normal por otra parte ya que es necesario TODO el volumen de datos para poder hacerlo).

Otro de los inconvenientes es que si basas la visualización en algún tag DICOM (como puede ser el serie UID para agrupar las imágenes de una misma serie) no sabes lo que contiene el tag hasta que haya leído el fichero...

Una pregunta, que tal con las DicomVCL?

Saludos
Responder Con Cita
  #15  
Antiguo 25-04-2013
jmvene jmvene is offline
Miembro
NULL
 
Registrado: abr 2013
Ubicación: Sevilla
Posts: 11
Poder: 0
jmvene Va por buen camino
Cita:
Empezado por radenf Ver Mensaje
He estado intentando cargar las imágenes en un TMemoryStream con el siguiente código:

Donde el ListBox contiene los strings de las rutas de las imágenes y a partir del MemoryStream cargar las imágenes en la CnsDMTable que se conecta al visor para mostrar las imágenes de formato .dcm
Sin embargo el stream sólo carga los strings de la ubicación de las imágenes como tales y no como archivos de imágenes, por lo que la carga finalmente es igual de lenta.
¿Cómo puedo cargar en un TMemoryStream o TFileStream las imágenes y no sus rutas de ubicación en el HD?
Agradezco sus valiosos aportes.
Saludos
Buenas de nuevo Radenf,
no, el MemoryStream no carga la ubicación de las imágenes sino la imagen (el fichero binario) memoria completamente que luego carga el DicomMultiviewer1 a través de ese memorystream. Pasar por un memorystream o incluso un Filestream no te va accelarerar la carga, creo yo, ya que muy probablemente, internamente, el CnsDCMTable tenga ese mecanismo implementado ya que tiene el metodo loadfromfile y loadfromstream (normalmente el loadfromfile suele ser una implementacion particular del loadfromstream donde se crea un stream a partir del nombre de fichero en parámetro y se pasa al loadfromstream, vamos el lo que tu has hecho en tu ejemplo).

Acabo de hacer pruebas con el DicomVCL para ver los tiempos de cargas que indicas estos son los tiempos:
100 img -> 0,875 s
250 img -> 3,8 s
500 img -> 13,5 s

Como puedes ver, la progresion no el lineal, con lo cual me extrañaria que sera realmente un problema de acceso al fichero (carga pura y dura), yo creo que es mas un problema de indexacion de la imagen en esa tabla interna en memoria que usa las DicomVCL (cuantas mas imagenes tengo, mas tiempo tardo en ordenarlas e indexarlas). He intentado ver si se puede desactivar la ordenación de la tabla durante la carga, pero no veo nada, la unica propiedad que hay es la de TCnsDMTable.ImageOrder, pero no permite un valor desactivado del estilo "dsNone".

No se si te ha ayudado...
Responder Con Cita
  #16  
Antiguo 25-04-2013
jmvene jmvene is offline
Miembro
NULL
 
Registrado: abr 2013
Ubicación: Sevilla
Posts: 11
Poder: 0
jmvene Va por buen camino
Perdonad, pero en el mensaje anterior tengo un error:

"no, el MemoryStream no carga la ubicación de las imágenes sino la imagen (el fichero binario) en memoria completamente que luego carga el CnsDMTable1 a través de ese Memorystream."

Esto pasa por novato y no revisar las respuesta....
Responder Con Cita
  #17  
Antiguo 25-04-2013
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Agradezco enormemente tus comentarios jmvene.
Me alegra que alguien más use estos componentes, para conversar en el mismo idioma.

Cita:
Empezado por jmvene Ver Mensaje
Una pregunta, que tal con las DicomVCL?
En general decepcionado, el soporte de Jiawen Feng que los fabrica es un desastre. A mi más me ha confundido que ayudado.
Yo soy médico radiólogo aficionado a la programación con Delphi, la que ido aprendiendo a golpes y errores. Mi sueño es realizar para Windows un programa igual o mejor que Osirix (puedes revisar mi página web) y distribuirlo gratuitamente, para incorporarle más adelante procesos de pago como Reconstrucciones vasculares, detección de nódulos pulmonares y un sistema de diagnóstico en TC de cerebro basado en algo similar al de reconocimiento de huellas digitales, para reconocer automáticamente las lesiones, tipo CAD (Soñar no cuesta nada). Tengo múltiples funciones ya habilitadas, sin embargo la ausencia de algunas como las reconstrucciones multiplanares dinámicas con scroll en visor independiente, que no utilizen el componente MPR y las reconstrucciones MIP, MinIP y Promedio necesarias para el diagnóstico se echan de menos, A pesar de que me prometieron que se incorporarían en nuevas versiones, así como el soporte para Delphi XE3 y para 64bits.
Cita:
Empezado por jmvene Ver Mensaje
La solución "carga lo que muestra" es la mejor, y si quieres darle un apretón de tuerca mas, incluso tendría un segundo hilo que mientras no te estas moviendo por la serie ("lo que muestra" esta fijo) vaya cargando en "background" lo que queda de los ficheros.
Y esto ¿cómo se puede hacer con delphi? Me puedes dar una mano ya que mi nivel de conocimientos es mínimo.
Saludos y muchas gracias por tus aportes
Responder Con Cita
  #18  
Antiguo 26-04-2013
jmvene jmvene is offline
Miembro
NULL
 
Registrado: abr 2013
Ubicación: Sevilla
Posts: 11
Poder: 0
jmvene Va por buen camino
Buenas Radenf,
con respecto a Jiawen Feng, y sin querer extenderme demasiado ya que no se si se puede en el foro, solo te dire que lo de este hombre roza la estafa. Sus componentes valen 1200 Euros (la versión sin código fuente) y, por lo menos en la parte 3D, esta plagada de errores y fallos que para nosotros los vuelven inútil, estamos buscando alternativas... Si quieres, y si algún moderador me indica donde, abrimos un tema especifico para discutirlos. Lo que mas me preocupa, es que en una de sus contadas respuesta a nuestras peticiones me ha llegado a decir que "algunos bug se podrán solucionar y otros no"... es un poco "wtf"?. Se supone que esta vendiendo unos componentes de los cuales tiene todo el código fuente y nos dices que hay fallos que no vas a poder solucionar??.. en fin, si quieres lo discutimos en otro hilo... y por lo menos nos consolamos...

Con respecto a implementar lo que ya te ha comentado mamcx o algo parecido, el problema es que me parece difícil hacerlo por "encima" de los componentes DICOMVCL, ya que la relacion entre el visor (donde se ven las imagenes) y la tabla de almacenamiento (donde se cargan las imagenes) esta hecha en la propia definición de los componentes y con mecanismos interno. Para que los demás nos entiendan, el visor tiene una propiedad DicomDataset, es un poco como la relación entre un DBGrid y un TDataset (sin el TDataSource por medio). Cuando interactuas con el visor, este se encarga de leer y presentar las imágenes ya cargada a través de la tabla (cnsDMTable). No lo he mirado a fondo, pero habria que ver la posibilidad de interceptar alguno procesos a través de eventos (OnScrollDown, etc...) para poder alterar el modo de interacción y por ejemplo ahí mismo lanzar la carga de "las imágenes que quedan por cargar"... hay que mirarlo, sino, tener acceso al código fuente del componente e intentar alterar el comportamiento ya sea directamente o creando un componente heredado (aquí yo ya me pierdo y es para gurus de la programación...).

Con respecto a tu proyecto, me parece fantástico y la meta que te has puesto es de las mas audaz que he visto (igualar o superar a OsirX). Solo como apunte, desde mi humilde opinión y sin querer que pienses que de alguna manera te estoy intentando quitar el entusiasmo, tienes que tener en mente varias cosas: OsiriX, aunque no lo parezca, es un proyecto que tiene mas de 10 años, no estoy seguro pero creo que en realidad una evolución de un software que ya existía llamado "Osiris" (ambos de los Hospitales Universitarios de Ginebra, Suiza). Es un proyecto OpenSource con bastante colaboradores externos, tanto clínicos (medico y radiologos) como técnicos (programadores) y con una buena dirección de proyecto, lo que le ha permitido llegar a unos niveles de calidad bastantes altos. La colaboración de médicos y programadores puros (y muy buenos) ha permitido que se le vayan agregando herramientas muy especificas (como las que tu mencionas) usando tecnologías y librerías de bastante bajo nivel (como pueden ser las vtk para el 3D).

Resumiendo y, repito, sin querer que pierdas ni una onza de tu ilusión, es un trabajo de titanes y no a muy corto plazo. Quizás debas re enfocar la estrategia de tu proyecto, buscar otra manera de llegar al mismo fin ya que si, por ejemplo, dependes de componentes de tercero te puedes encontrar en un callejón sin salida o con limitaciones impuestas por estos componentes. Aqui hay una comunidad de desarolladores en delphi que tiene un muy alto nivel, quizas seria buena idea intentar implicar a gente de este grupo y avanzar hacia un proyecto collaborativo opensource. Tu formación como medico radiologo es una gran ventaja que puedes aprovechar para dirigir la parte "clínica" del proyecto, pero creo que debes buscar aliados con un perfil mas técnico para la parte de programación.

Con todo y con esto espero haberte ayudado o por lo menos aclarado algo.

Un saludo.
Responder Con Cita
  #19  
Antiguo 26-04-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.067
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jmvene Ver Mensaje
... y sin querer extenderme demasiado ya que no se si se puede en el foro
Puedes extenderte todo lo que quieras
Cita:
Empezado por jmvene Ver Mensaje
... Si quieres, y si algún moderador me indica donde, abrimos un tema especifico para discutirlos.
Puedes crear un nuevo tema en el foro "Debates"
Cita:
Empezado por jmvene Ver Mensaje
... OsiriX, aunque no lo parezca, es un proyecto que tiene mas de 10 años, no estoy seguro pero creo que en realidad una evolución de un software que ya existía llamado "Osiris" (ambos de los Hospitales Universitarios de Ginebra, Suiza). Es un proyecto OpenSource con bastante colaboradores externos, tanto clínicos (medico y radiologos) como técnicos (programadores) y con una buena dirección de proyecto, lo que le ha permitido llegar a unos niveles de calidad bastantes altos. La colaboración de médicos y programadores puros (y muy buenos) ha permitido que se le vayan agregando herramientas muy especificas (como las que tu mencionas) usando tecnologías y librerías de bastante bajo nivel (como pueden ser las vtk para el 3D).
Y teniendo ese proyecto opensource, ¿para qué crear otro desde cero?, mejor aprovecharlo y usarlo. Luego, con tiempo, lo podéis adaptar más a vuestras necesidades.
Responder Con Cita
  #20  
Antiguo 26-04-2013
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hola,
no es que sea muy profano en el asunto, pero habeis visto esto ?
http://cgarcia.blogspot.com.es/2006/...es-mdicas.html

Utiliza Delphi y OpenGL.

Espero que os sirva.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
WebBrowser bloqueo de carga de imagenes titomigue Internet 1 17-08-2010 09:53:34
Acelerar apertura de consulta desde Delphi contra Access Sergiov SQL 4 13-04-2007 10:42:59
Acelerar carga de Delphi mamcx Noticias 4 13-09-2006 00:51:52
Transparencias y carga de imágenes david.rguez Gráficos 1 04-09-2006 18:01:40
carga de imagenes en timage jvalles Gráficos 2 15-12-2005 19:06:57


La franja horaria es GMT +2. Ahora son las 17:03:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi