2011-06-01 16 views

Trả lời

18

Mục 2 của this paper giải thích sự chuyển đổi. Về cơ bản:

enter image description here

Ở đây tôi đưa ra một ví dụ trong Mathematica:

enter image description here

+2

Khi tạo lại mã này trong openGL mà không cắt tỉa (như bạn có trong hình ảnh thứ nhất), hình ảnh trông bị rời rạc. Tôi đã thành công hơn khi sử dụng thuật toán này http://www.geeks3d.com/20140213/glsl-shader-library-fish-eye-and-dome-and-barrel-distortion-post-processing-filters/2/ – user819640

+0

Biến đổi của bạn chỉ hợp lệ để biến một hình ảnh trực tuyến thành một hình bị méo, để đảo ngược sự biến dạng đó, bạn cần hàm nghịch đảo là 'p1 = cbrt (2/(3 * a)); \t p2 = cbrt (sqrt (3 * a) * sqrt (27 * a * x * x + 4) - 9 * a * x); \t p3 = cbrt (2) * pow (3 * a, 2/3); \t trả lại p1/p2 - p2/p3; ' –

0

méo pincushion thùng \ đơn giản trong opencv C++

IplImage* barrel_pincusion_dist(IplImage* img, double Cx,double Cy,double kx,double ky) 
{ 
    IplImage* mapx = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); 
    IplImage* mapy = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1); 

    int w= img->width; 
    int h= img->height; 

    float* pbuf = (float*)mapx->imageData; 
    for (int y = 0; y < h; y++) 
    { 
     for (int x = 0; x < w; x++) 
     {   
      float u= Cx+(x-Cx)*(1+kx*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy))); 
      *pbuf = u; 
      ++pbuf; 
     } 
    } 

    pbuf = (float*)mapy->imageData; 
    for (int y = 0;y < h; y++) 
    { 
     for (int x = 0; x < w; x++) 
     { 
      *pbuf = Cy+(y-Cy)*(1+ky*((x-Cx)*(x-Cx)+(y-Cy)*(y-Cy))); 
      ++pbuf; 
     } 
    } 

    /*float* pbuf = (float*)mapx->imageData; 
    for (int y = 0; y < h; y++) 
    { 
     int ty= y-Cy; 
     for (int x = 0; x < w; x++) 
     { 
      int tx= x-Cx; 
      int rt= tx*tx+ty*ty; 

      *pbuf = (float)(tx*(1+kx*rt)+Cx); 
      ++pbuf; 
     } 
    } 

    pbuf = (float*)mapy->imageData; 
    for (int y = 0;y < h; y++) 
    { 
     int ty= y-Cy; 
     for (int x = 0; x < w; x++) 
     { 
      int tx= x-Cx; 
      int rt= tx*tx+ty*ty; 

      *pbuf = (float)(ty*(1+ky*rt)+Cy); 
      ++pbuf; 
     } 
    }*/ 

    IplImage* temp = cvCloneImage(img); 
    cvRemap(temp, img, mapx, mapy); 
    cvReleaseImage(&temp); 
    cvReleaseImage(&mapx); 
    cvReleaseImage(&mapy); 

    return img; 
} 

hình thức phức tạp hơn http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html

1

Một xấp xỉ của mô hình méo xuyên tâm đa thức bạn có thể tìm thấy trong Fitzgibbon, 2001

enter image description here

nơi thứ và ru là khoảng cách từ trung tâm của méo. Điều này cũng được sử dụng để lọc méo hình ảnh máy ảnh góc rộng cho mục đích xử lý hình ảnh và máy tính.

Bạn có thể tìm thấy một lời giải thích chi tiết hơn về các nguyên tắc và mã đổ bóng để thực hiện việc lọc undistortion (và cũng có thể chuyển đổi về phía trước) ở đây: http://marcodiiga.github.io/radial-lens-undistortion-filtering

Tôi cũng đăng các giấy tờ bạn nên có một cái nhìn tại nếu bạn muốn biết chi tiết toán học cho phương pháp tôi đã đăng

  • Zhang Z. (1999). Hiệu chỉnh máy ảnh linh hoạt bằng cách xem mặt phẳng từ hướng không xác định
  • Andrew W. Fitzgibbon (2001). Ước lượng tuyến tính đồng thời của nhiều hình dạng xem và biến dạng ống kính
Các vấn đề liên quan