2

フルフレームの魚眼画像を等角に変換したいので、パノラマステッチで使用できます。私はこの目的のためにHuginとlibpanoを使いました。彼らはうまく動作します。次の画像は、huginによって変換されています。私はそのような変換が達成できる数学的方程式を知りたい。フルフレームのフィッシュアイを数学的に等角に変換する

のorignalイメージ用い Full-Frame FishEye

変換画像

Converted Image

答えて

2

Iが正常に発生した1 HUGINに近い画像を変えた参考として本link。より良い画質のためにはまだサブピクセルサンプリングが必要です

#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); 


} 
関連する問題