2

Je souhaite convertir une image fisheye plein cadre en une forme équirectangulaire. Je peux donc l'utiliser pour la broderie panoramique. J'ai utilisé Hugin et libpano à cet effet et ils fonctionnent bien. L'image suivante a été convertie par hugin. Je veux connaître les équations mathématiques avec lesquelles une telle transformation ou une transformation similaire peut être réalisée.Conversion d'un œil de poisson plein cadre en équirectangulaire mathématiquement

image Orignal Full-Frame FishEye

image convertie

Converted Image

Répondre

2

En utilisant cette link comme référence je réussi à transformer l'image proche de celle Hugin généré. Il a encore besoin d'échantillonnage sous-pixel pour une meilleure qualité d'image

#include <iostream> 
#include <sstream> 
#include <time.h> 
#include <stdio.h> 
#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/calib3d/calib3d.hpp> 
#include <opencv2/highgui/highgui.hpp> 
using namespace std; 
using namespace cv; 
#define PI 3.1415926536 
Point2f getInputPoint(int x, int y,int srcwidth, int srcheight) 
{ 
    Point2f pfish; 
    float theta,phi,r; 
    Point3f psph; 
    //float FOV = PI; 
    float FOV =(float)PI/180 * 150; 
    float FOV2 = (float)PI/180 * 120;; 
    float width = srcwidth; 
    float height = srcheight; 
    theta = PI * (x/width - 0.5); // -pi to pi 
    phi = PI * (y/height - 0.5); // -pi/2 to pi/2 
    psph.x = cos(phi) * sin(theta); 
    psph.y = cos(phi) * cos(theta); 
    psph.z = sin(phi); 
    theta = atan2(psph.z,psph.x); 
    phi = atan2(sqrt(psph.x*psph.x+psph.z*psph.z),psph.y); 
    r = width * phi/FOV; 
    float r2 = height * phi/FOV2; 
    pfish.x = 0.5 * width + r * cos(theta); 
    pfish.y = 0.5 * height + r2 * sin(theta); 
    return pfish; 
} 
int main(int argc, char **argv) 
{ 
    if(argc< 3) 
     return 0; 
    Mat orignalImage = imread(argv[1]); 
    if(orignalImage.empty()) 
    { 
     cout<<"Empty image\n"; 
     return 0; 
    } 
    Mat outImage(orignalImage.rows,orignalImage.cols,CV_8UC3); 
     //getInputPoint(0,5,10,10); 
    namedWindow("result",CV_WINDOW_NORMAL); 
    for(int i=0; i<outImage.cols; i++) 
    { 
     for(int j=0; j<outImage.rows; j++) 
     { 

      Point2f inP = getInputPoint(i,j,orignalImage.cols,orignalImage.rows); 
      //cout<<"in "<<i<<","<<j<<endl; 
      //cout<<"out "<<inP.x<<","<<inP.y<<endl; 
      Point inP2((int)inP.x,(int)inP.y); 
      if(inP2.x >= orignalImage.cols || inP2.y >= orignalImage.rows) 
       continue; 
      if(inP2.x < 0 || inP2.y < 0) 
       continue; 
      Vec3b color = orignalImage.at<Vec3b>(inP2); 
      outImage.at<Vec3b>(Point(i,j)) = color; 

     } 
    } 

    imshow("result",outImage); 
    imwrite(argv[2],outImage); 


}