corrigiendo la distorsión de ojo de pez mediante programación

ACTUALIZACIÓN DEL ESTADO DE LA OFERTA:

Descubrí cómo mapear una lente lineal, dedestination coordina asource coordenadas

¿Cómo se calcula la distancia radial desde el centro para pasar de ojo de pez a rectilíneo?

1) De hecho, me cuesta revertirlo y asignar coordenadas de origen a coordenadas de destino. ¿Cuál es el inverso, en código en el estilo de las funciones de conversión que publiqué?

2) También veo que mi distorsión es imperfecta en algunas lentes, presumiblemente aquellas que no son estrictamente lineales. ¿Cuál es el equivalente hacia y desde las coordenadas de origen y destino para esas lentes? Una vez más, más código que solo fórmulas matemáticas, por favor ...

Pregunta como se dijo originalmente:

Tengo algunos puntos que describen las posiciones en una imagen tomada con una lente ojo de pez.

Quiero convertir estos puntos en coordenadas rectilíneas. Quiero distorsionar la imagen.

He encontradoesta descripcion de cómo generar un efecto ojo de pez, pero no cómo revertirlo.

También hay unentrada en el blog que describe cómo usar herramientas para hacerlo; estas fotos son de eso:

(1) : SOURCE Enlace de foto original

Entrada:Imagen original con distorsión de ojo de pez para arreglar.

(2) : DESTINATION Enlace de foto original

Salida:Imagen corregida (técnicamente también con corrección de perspectiva, pero ese es un paso separado).

¿Cómo se calcula la distancia radial desde el centro para pasar de ojo de pez a rectilíneo?

Mi stub de función se ve así:

Point correct_fisheye(const Point& p,const Size& img) {
    // to polar
    const Point centre = {img.width/2,img.height/2};
    const Point rel = {p.x-centre.x,p.y-centre.y};
    const double theta = atan2(rel.y,rel.x);
    double R = sqrt((rel.x*rel.x)+(rel.y*rel.y));
    // fisheye undistortion in here please
    //... change R ...
    // back to rectangular
    const Point ret = Point(centre.x+R*cos(theta),centre.y+R*sin(theta));
    fprintf(stderr,"(%d,%d) in (%d,%d) = %f,%f = (%d,%d)\n",p.x,p.y,img.width,img.height,theta,R,ret.x,ret.y);
    return ret;
}

Alternativamente, podría de alguna manera convertir la imagen de ojo de pez a rectilíneo antes de encontrar los puntos, pero estoy completamente confundido por elDocumentación de OpenCV. ¿Hay una manera directa de hacerlo en OpenCV y funciona lo suficientemente bien como para hacerlo en una transmisión de video en vivo?

Respuestas a la pregunta(6)

Su respuesta a la pregunta