la correction de la déformation du fisheye par programmation

BOUNTY MISE À JOUR DE STATUT:

J'ai découvert comment mapper un linéaire de la lentille, de destination coordonnées source coordonnées.

Comment calculer la distance radiale à partir du centre pour aller de fisheye pour rectiligne?

  • 1). J'ai fait de la lutte pour l'inverser, et à la carte coordonnées source à destination des coordonnées. Qu'est-ce que l'inverse, dans le code, dans le style des fonctions de conversion que j'ai posté?
    la correction de la déformation du fisheye par programmation

  • 2). Je vois aussi que mon undistortion est imparfaite sur certains objectifs - sans doute à ceux qui ne sont pas strictement linéaire. Quel est l'équivalent d'-et-à partir de la source et de la destination des coordonnées pour les lentilles? Encore une fois, que le code juste de formules mathématiques s'il vous plaît...
    la correction de la déformation du fisheye par programmation


Question initialement déclaré:

J'ai quelques points qui décrivent les positions dans une photo prise avec un objectif fisheye.

Je veux convertir ces points de coordonnées rectilignes. Je veux undistort l'image.

J'ai trouvé cette description de la façon de générer un effet fisheye, mais pas comment inverser la tendance.

Il y a aussi un post de blog qui explique comment utiliser les outils pour le faire; ce sont des photos de que:

(1) : SOURCE Photo originale lien

la correction de la déformation du fisheye par programmation

Entrée : image d'Origine avec œil-de-poisson déformation à corriger.

(2) : DESTINATION Photo originale lien

la correction de la déformation du fisheye par programmation

Sortie : image Corrigée (techniquement aussi avec la correction de la perspective, mais c'est une étape distincte).

Comment calculer la distance radiale à partir du centre pour aller de fisheye pour rectiligne?

Mon stub de fonction ressemble à ceci:

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;
}

Sinon, j'arrivais à les convertir à l'image de fisheye pour rectiligne avant de trouver les points, mais je suis complètement déconcerté par la OpenCV documentation. Est-il un moyen simple de le faire dans OpenCV, et le fait d'effectuer assez bien pour le faire à un flux vidéo en direct?

  • Je n'arrive pas à obtenir ce que vous cherchez. Le fisheye cartes à partir d'une sphère à l'image de l'avion. La cartographie inverse serait de l'image en arrière à une sphère de droite? Ce rectilignes de coordonnées que vous recherchez?
  • Ma source de l'image est fisheye déformée, et je veux undistort il
  • Donc, est à l'image de la photo.net/learn/fisheye ce que vous recherchez?
  • Oui, l'image rectifiée par exemple par l'intermédiaire d'OpenCV, ou une formule de correction de point dans l'image.
  • Avez-vous besoin de faire cela pour une gamme de caméras, ou tout simplement pour une caméra / un type de lentille?
  • Va, avez-vous jamais obtenir une réponse définitive à cette question? Je serais très intéressé de voir tout le code dont vous avez fini avec.
  • Je sais, ça fait un bon moment depuis que cette question a été posée, mais j'ai un problème similaire -- avez-vous jamais obtenir un morceau de code fonctionnel pour la transformation, y compris la correction de la perspective que vous avez mentionné?
  • J'ai fini par utiliser la solution que j'ai posté moi-même ci-dessous; bonne chance!

InformationsquelleAutor Will | 2010-03-19