2010-05-24 6 views
0

Je travaille sur un problème de manipulation d'image. J'ai un rétroprojecteur qui projette sur un écran, et j'ai une caméra qui prend des photos de cela. Je peux établir une correspondance 1: 1 entre un sous-ensemble de coordonnées du projecteur et un sous-ensemble de pixels de la caméra en projetant des points sur l'écran et en trouvant les centres de masse des régions résultantes sur la caméra. J'ai donc une carteInterpolation et morphing d'une image dans labview et/ou openCV

proj_x, proj_y < -> cam_x, cam_y pour les paires de points bruités

Mon plan initial était de régulariser cette carte en utilisant la fonction MathScript gridData. Cela fonctionne très bien dans Matlab, comme suit

[pgridx, pgridy] = meshgrid(allprojxpts, allprojypts) 
fitcx = griddata (proj_x, proj_y, cam_x, pgridx, pgridy); 
fitcy = griddata (proj_x, proj_y, cam_y, pgridx, pgridy); 

et l'inverse pour la caméra vers le projecteur cartographie

Malheureusement, ce code provoque Labview à manquer de mémoire sur l'étape de meshgrid (l'appareil photo est de 5 mégapixels , qui est apparemment trop pour que labview gère)

J'ai alors commencé à regarder à travers openCV, et j'ai trouvé la fonction cvRemap. Malheureusement, cette fonction prend comme point de départ une carte de pixel-pixel régularisée comme celle que j'ai essayé de générer ci-dessus. Cependant, cela m'a fait espérer que des fonctions pour créer une telle carte pourraient être disponibles dans openCV. Je ne pouvais pas le trouver dans l'API openCV 1.0 (je suis coincé avec 1.0 pour des raisons héritées), mais j'espérais que c'est là ou que quelqu'un a un tour facile.

Donc ma question est une des façons suivantes

1) Comment puis-je interpoler des points dispersés à une grille dans OpenCV; (ie, donné z = f (x, y) pour les valeurs dispersées de x et y, comment remplir une image avec f (im_x, im_y)?

2) Comment puis-je effectuer une transformation d'image qui mappe l'image 1 à l'image 2, étant donné que je connais un mappage dispersé de points dans le système de coordonnées 1 pour coordonner le système 2. Cela pourrait être mis en œuvre soit dans Labview ou OpenCV.

Note: Je tagging cette delaunay post, parce que c'est une méthode de faire une interpolation dispersée, mais la meilleure étiquette serait « interpolation dispersée »

+1

Quelle version de LV utilisez-vous? Le problème "out of memory" avec meshgrid * devrait * avoir été corrigé dans LV2009 ... au moins, c'était pour nous. Pas que les mises à jour sont toujours une option, je sais :(. –

+0

8.5 Nous avons une licence de site, donc je pourrais mettre à niveau vers la dernière version en théorie.En pratique, 2009 ressemble à une mise à jour majeure, et je ne veux pas Si vous savez si le bug de mémoire est spécifique à mathscript, il y a un vi sur la palette d'interpolation et d'extrapolation qui fait la même chose, donc je pourrais juste balayer ça à la place Merci, Marc – Marc

+0

OK, j'ai pu obtenir pour travailler en utilisant la palette vi on i & e au lieu de meshgrid. – Marc

Répondre

2

Alors cela finit par être une solution spécifique pour les bugs dans Labview 8.5 . Néanmoins, comme ils sont mal documentés et que j'ai passé une journée douloureuse, je pense que je les posterai pour que quelqu'un d'autre google ce problème.

1) Les bombes grillagées. Je ne sais pas quand cela a été réparé, certainement un bug en 8.5. Solution: utilisez la fonction meshgrid sur la palette d'extrapolation & à la place. Ou passer à LV2009 qui fonctionne apparemment (merci Underflow)

2) Griddata est défectueux dans 8.5. Ceci est mal documenté. Les notes de mise à jour 8.6 disent qu'un problème avec les griddata et le réglage "cubique", mais c'est aussi un problème avec le réglage DEFAULT LINEAR. Solutions dans l'ordre décroissant de kludginess: 1) Passer le drapeau 'v4', qui fait une sorte d'interpolation spline, mais n'a pas de bugs. 2) mise à niveau vers au moins la version 8.6. 3) Battre les ingénieurs avec des anches jusqu'à ce qu'ils documentent correctement les bugs.

3) J'étais capable d'utiliser la fonction de remappage openCV pour effectuer la transformation d'une image à l'autre. J'ai essayé juste d'utiliser le matlab construit dans interp2 vi, mais il s'est étouffé sur de grandes baies et m'a donné des erreurs de mémoire.D'un autre côté, il est assez simple de mapper une image IMAQ à une image IPL, ce qui n'est pas si grave, sauf pour l'ajout de la bibliothèque externe.