Estoy buscando el algoritmo (mapa de bits manipulación de píxeles) para simular la lente ojo de pez (Distorsión de Barril) de fotos normales. Hasta ahora he encontrado la aplicación que involucran a las bibliotecas externas como OpenCV, OpenGL o jhlabs. Desde que estoy tomando una clase en el tratamiento de la Imagen Digital y estoy haciendo un curso de evaluación de proyectos, no estoy seguro de si el uso de cualquier externa lib ganará mí una buena calificación. Así que a alguien podría darme la referencia a dicho algoritmo?

Ps. Me preguntan a implementar en Java, pero el ejemplo de cualquier lenguaje que haría.

InformationsquelleAutor tsong99 | 2011-02-12

3 Comentarios

  1. 6

    Es bueno que has sido capaz de encontrar ejemplos que haga lo que quiera. Es útil para incluir en la pregunta — se asegura de que las personas que la leen están en la misma página como usted. Así que aquí está un enlace.

    También es bueno que usted quiere hacer las cosas por sí mismo, sin depender de alguna biblioteca para hacer el trabajo duro por usted. Pero eso no significa que usted tiene que ignorar este tipo de soluciones. He aquí por qué.

    Vistazo a lo que OpenCV en realidad está siendo utilizado para la ese enlace. Estas son funciones que comienzan con cv:

    $ grep -o "cv\w*" barrel.cpp | sort | uniq
    cv
    cvCreateImage
    cvGet2D
    cvGetSize
    cvLoadImage
    cvNamedWindow
    cvSaveImage
    cvSet2D
    cvShowImage
    cvWaitKey

    Si usted mira la OpenCV API, todas estas funciones sólo manejar las tareas más mundanas, como la creación de la imagen, borrado, la pantalla, la configuración de píxeles, etc. Ninguna de estas tareas son particulares a la distorsión de barril. Tan lejos como la distorsión de barril va, que la solución es no OpenCV específicos.

    De hecho, el corazón del programa es aquí:

    float getRadialX(float x,float y,float cx,float cy,float k){
      x = (x*xscale+xshift);
      y = (y*yscale+yshift);
      float res = x+((x-cx)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
      return res;
    }
    
    float getRadialY(float x,float y,float cx,float cy,float k){
      x = (x*xscale+xshift);
      y = (y*yscale+yshift);
      float res = y+((y-cy)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
      return res;
    }

    Que es el radial transformar la leche de fórmula, esta es la parte que usted necesita para comprender. Como se puede ver, no hay OpenCV llamadas de allí.

    • Wow, muchas gracias! Supongo que no he de examinar ese código a fondo suficiente. Aunque yo podría ser capaz de continuar con mi proyecto sin el uso de OpenCV basado en el código, ya que no estoy tan familiarizado con OpenCV, es Java contenedor de ser compatible con esta tarea específica?
    • Sí, en teoría debería ser capaz de volver a utilizar la mayoría del código en Java sin demasiado esfuerzo. Pero nunca la he utilizado OpenCV con Java, así que no sé cómo sería en la práctica.
    • Hola, estoy tratando de crear el mismo efecto pero en Android. Podría usted explicarme cómo los anteriores métodos de trabajo. Atm tengo una aplicación donde me coloque un círculo en el mapa de bits, tengo un algoritmo que se dirige sólo los píxeles en el círculo. sé que, obviamente, el radio del círculo, el punto central del círculo y puedo recorrer el mapa de bits de un pixel por un pixel. esto es lo más lejos que he llegado con el procesamiento de la imagen como soy nuevo en esto. ¿te importaría hablar de mí a través de cómo podría aplicar este efecto? cualquier ayuda se agradece. puedo empezar un hilo con mi fuente si te gusta
    • por desgracia, no tengo ninguna experiencia de Android, así que no puedo ayudarte. Si haces una pregunta y etiqueta con «android», usted es probable encontrar a alguien que te puede ayudar, aunque.
    • ok gracias pero el código no es particular para Android, me preguntaba cómo un radial de transformar funciona y cómo hacer que la transformación del mapa de bits. por ejemplo yo creo que por lo general se tiene un src de la imagen y una imagen de destino, entonces usted va a trazar los nuevos puntos en el destino. cosas de los demás no me queda claro en qué variables necesito por ejemplo radio, x y coordenadas de píxeles etc
    • Una vez que haya RadialX y RadialY, ¿cómo se aplica esto para hacer una imagen de nuevo? Yo estoy usando la R y no está seguro de cómo aplicar esta solución para obtener una imagen de vuelta en el final.

  2. 3

    Escribí un artículo sobre esto en http://www.helviojunior.com.br/fotografia/barrel-and-pincushion-distortion/

    • Bienvenido a Desbordamiento de Pila! Por favor, tenga en cuenta que desnuda enlaces a su propio sitio web/producto no se anima aquí por dos razones; en Primer lugar, una respuesta debe ser publicado como un equipo autónomo de respuesta, no un simple enlace a un sitio externo. Segundo, la auto-promoción tiende a ser mal visto aquí, y a menudo es marcado como spam (especialmente si no hay ninguna divulgación que se une a su propio sitio web/producto).
    • Como dijo Andrew, parece que tienes una muy detallada de postear. ¿Podría resumir la información relevante para esta pregunta, y colocarlo en tu respuesta? Para proteger contra su enlace va a desaparecer en algún momento en el futuro.

Dejar respuesta

Please enter your comment!
Please enter your name here