9
votes

Déformer une image en utilisant une carte de hauteur?

J'ai une carte de hauteur pour une image qui me raconte le décalage de chaque pixel dans la direction z. Mon objectif est d'aplatir une image déformée à l'aide de la carte de hauteur de sa hauteur.

Comment allais-je faire cela? Je connais la position de la caméra, si cela aide.


Pour ce faire, je pensais à supposer que chaque pixel était un point sur un plan, puis de traduire chacun de ces points verticalement Selon la valeur Z, je reçois de la carte de hauteur et de cette traduction (imaginez que vous examinez les points ci-dessus; le décalage entraînera le point de se déplacer de votre perspective).

de Ce changement projeté, je pourrais extraire X et Y-Shift de chaque pixel, que je pourrais alimenter dans cv.remap () .

mais je n'ai aucune idée de ce que je pourrais obtenir Le décalage 3D projeté d'un point avec OpenCV, encore moins construire une carte offset de celle-ci.


Voici mes images de référence pour ce que je fais:

< img src = "https://i.stack.imgur.com/wnagn.jpg" alt = "image d'étalonnage"> image warped

Je connais l'angle des lasers (45 degrés) et de la images d'étalonnage, je peux calculer la hauteur du livre vraiment facilement: xxx

Je fais cela pour les deux lignes et interpolez linéairement les deux lignes pour générer une surface à l'aide de cette approche (python code. C'est à l'intérieur d'une boucle): xxx

J'espère que cela aide;)


en ce moment, voici ce que j'ai à rembourser le image. Tout ce que des trucs étranges au milieu sont une coordonnée 3D sur le plan de la caméra, étant donné la position de sa caméra (et l'emplacement, la rotation, etc. de la caméra, etc.): xxx

Ceci est en train de se transformer en Un énorme fil d'images et de code maintenant ... de toute façon, ce code de code prend mes 7 minutes pour courir sur une image de caméra de 18 mp; C'est way trop longtemps, et à la fin, cette approche ne fait rien à l'image (le décalage de chaque pixel est << 1 ).

Des idées?


0 commentaires

3 Réponses :


0
votes

La distorsion basée sur la distance de la caméra ne se produit qu'avec une projection de perspective. Si vous avez la position (x, y, z) d'un pixel, vous pouvez utiliser la matrice de projection de la caméra pour éviter les pixels dans un espace mondial. Avec cette information, vous pouvez rendre les pixels de manière orthographique. Cependant, vous pouvez avoir des données manquantes en raison de la projection de perspective d'origine.


1 commentaires

La carte 3D peut-elle passer en 2D? Ou dois-je trouver ma propre formule pour cela? Je vais essayer de mettre en œuvre cela, cependant, alors merci!



0
votes

Séparez votre scène comme suit:

  • Vous avez une image bitmap inconnu i (x, y) -> (r, g, b)
  • Vous avez un champ de hauteur connu h (x, y) -> h
  • Vous avez une transformation de caméra C (x, y, z) -> (u, v) qui projette la scène à un plan d'écran

    Notez que la transformation de la caméra éloigne des informations (vous n'obtenez pas de valeur de profondeur pour chaque pixel d'écran). Vous pouvez également avoir des morceaux de scène se chevauchent à l'écran, auquel cas seul le premier se montre - le reste est jeté. Donc, en général, ce n'est pas parfaitement réversible.

    • Vous avez une capture d'écran s (u, v) qui résulte de C (x, y, h (x, y )) Pour x, y dans i
    • Vous voulez générer une capture d'écran s 's' (u ', v') qui résulte de C (x, y, 0) pour x, y dans i

      Il y a deux moyens évidents de s'approcher de cela; Les deux dépendent des valeurs précises pour la transformation de la caméra.

      1. Ray-Casting: Pour chaque pixel dans s , je jette une rayon dans la scène. Découvrez où il frappe le champ de hauteur; Cela vous donne (x, y) dans l'image d'origine i et le pixel d'écran vous donne la couleur à ce point. Une fois que vous avez autant que vous avez autant de i comme vous pouvez récupérer, reproduisez-le pour trouver S '.

      2. double rendu: pour chaque x, y dans i , projet de trouver (u, v) et (u ', v'). Prenez la couleur pixelle de s (u, v) et copiez-la sur s ' (u', v ').

        Les deux méthodes auront des problèmes d'échantillonnage qui seront aidés par un super échantillonnage ou une interpolation; Méthode 1 laissera des espaces vides dans les zones occluses de l'image, la méthode 2 «projetera» à travers la première surface.

        EDIT:

        J'avais présumé que vous vouliez dire un champ de hauteur de style CG, où chaque pixel en S est directement au-dessus de l'emplacement correspondant à S '; Mais ce n'est pas la façon dont une page est relâchée sur une surface. Une page est fixée à la colonne vertébrale et est non extensible - levant le centre d'une page tire le bord libre vers la colonne vertébrale.

        Basé sur votre image d'échantillon, vous devrez inverser cette traction cumulative - détecter l'emplacement et l'orientation centrale de la colonne vertébrale et le travail progressivement à gauche et à droite, à trouver le changement de hauteur sur le haut et le bas de chaque bande verticale de la page, Calcul de l'aspect résultant - Rétrécissement et asymétrie et l'inversant à recréer la page plate d'origine.


5 commentaires

J'ai édité ma réponse en conséquence. Je comprends aussi des images de référence aussi, pour que vous puissiez voir ce que je veux dire.


Oui, les échantillons d'images sont une bonne aide. Quelques pensées: premièrement, vous pouvez faire de l'image presque-orthogonale pour commencer à utiliser un téléobjectif et en tirant de l'arrière de l'arrière de l'arrière. Deuxièmement, les pages se reposent avec des rafraîchissements verticaux pour eux - poser le bord inférieur contre une surface plane pourrait réduire ou éliminer cela. Ensuite, la correction d'image finit par une correction de largeur juste par l'arcoscosine de l'angle d'incidence de la page (c'est-à-dire vraiment simple).


Je suis coincé avec seulement une lentille de zoom 3x, donc je vais devoir vivre avec une correction manuelle pour un gauchissement tangentiel et radial. Pourriez-vous élaborer un peu plus sur la méthode arccos () ? Je ne l'obtiens pas bien.


Considérons une mince tranche verticale de page. La largeur apparente de cette tranche (telle que visualisée par la caméra) varie avec le cosinus de l'angle auquel la page est inclinée (si la page est plate, elle apparaît à 100% de largeur, à 45 degrés, il apparaît 70,7% de largeur, etc.) . Donc, si vous connaissez l'angle d'inclinaison, multipliez la largeur apparente par 1 / cos (angle) pour obtenir la largeur réelle.


Oh, je pensais à la page Dewarping;) L'inclinaison de la caméra est recouverte par l'étalonnage de la caméra d'Opencv, donc je ne m'inquiète pas trop à ce sujet. J'ai essayé de mettre en œuvre ce que je décrivais, et c'était tout à fait avorté. Mes images d'entrée / sortie diffèrent par littéralement un pixel ...



3
votes

J'ai fini par mettre en œuvre ma propre solution: xxx

ceci (lentement) remapose chaque pixel à l'aide de la fonction CV.REMAP , et cela semble être un type de travail. ...


0 commentaires