是尘封已久的记忆再次融化 是堆积心底的烈火再次燃烧 是直觉让我来到这久违的大地 是信念让我开始了新的征途 在硝烟中我得到了成长 在伤痛中我学会了坚强 在沉默中我明白了等待 在孤独中我体味了感伤 并不是我不懂得眼泪 并不是我只知道使命 在内心深处我同你一样火热 在我的眼中也有着多情的泪光 也许我的生命如落叶般短暂 也许我只是岁月长河中的一个过客 但我对自己所做的一切无怨无悔 因为我品尝到了那最后一刻的泪光
随笔-6  评论-24  文章-8  trackbacks-0
 
传感器尺寸:

Consider a 35 mm camera with a normal lens having a focal length of F = 50 mm. The dimensions of the 35 mm image format are 24 mm (vertically) × 36 mm (horizontal), giving a diagonal of about 43.3 mm.

At infinity focus, f = F, and the angles of view are:

  • horizontally,
  • vertically,
  • diagonally,

[edit] Derivation of the angle-of-view formula

Consider a rectilinear lens in a camera used to photograph an object at a distance S1, and forming an image that just barely fits in the dimension, d, of the frame (the film or image sensor). Treat the lens as if it were a pinhole at distance S2 from the image plane (technically, the center of perspective of a rectilinear lens is at the center of its entrance pupil[6]):

Now α / 2 is the angle between the optical axis of the lens and the ray joining its optical center to the edge of the film. Here α is defined to be the angle-of-view, since it is the angle enclosing the largest object whose image can fit on the film. We want to find the relationship between:

the angle α
the "opposite" side of the right triangle, d / 2 (half the film-format dimension)
the "adjacent" side, S2 (distance from the lens to the image plane)

Using basic trigonometry, we find:

which we can solve for α, giving:

To project a sharp image of distant objects, S2 needs to be equal to the focal length, F, which is attained by setting the lens for infinity focus. Then the angle of view is given by:

where f = F
 
Table of sensor sizes

Since inch-based sensor formats are not standardized, exact dimensions may vary, but those listed are typical.[5]

Type 1/8" 1/6" 1/4" 1/3.6" 1/3.2" 1/3" 1/2.7" 1/2.5" 1/2.3" 1/2" 1/1.8" 1/1.7" 1/1.6" 2/3" Super
16mm
1" 4/3" Canon
APS-C
Pentax Sony Nikon
DX
Canon
APS-H
35mm Leica
S2
Pentax 645D Kodak
KAF 39000[6]
Leaf AFi 10 Phase One
P 65+
Diagonal (mm) 2.00 3.00 4.00 5.00 5.68 6.00 6.72 7.18 7.7 8.00 8.93 9.50 10.07 11.0 14.54 16.0 21.6 26.7 28.4 34.5 43.3 54 55 61.3 66.57 67.4
Width (mm) 1.60 2.40 3.20 4.00 4.54 4.80 5.37 5.76 6.16 6.40 7.18 7.60 8.08 8.80 12.52 12.8 17.3 22.2 23.6-.7 28.7 36 45 44 49 56 53.9
Height (mm) 1.20 1.80 2.40 3.00 3.42 3.60 4.04 4.29 4.62 4.80 5.32 5.70 6.01 6.60 7.41 9.6 13.0 14.8 15.5-.8 19.1 24 30 33 36.8 36 40.4
Area (mm2) 1.92 4.32 7.68 12.0 15.5 17.3 21.7 24.7 28.5 30.7 38.2 43.3 48.56 58.1 92.8 123 225 329 366-374 548 864 1350 1452 1803 2016 2178
Crop factor[7] 21.65 14.14 10.83 8.65 7.61 7.21 6.44 6.02 5.62 5.41 4.84 4.55 4.3 3.93 2.97 2.70 2.00 1.62 1.52 1.26 1.0 0.8 0.79 0.71 0.65 0.64

已知图像的crop factor, focus,sensor size 计算图像的HFOV

double SrcPanoImage::calcHFOV(SrcPanoImage::Projection proj, double fl, double crop, vigra::Size2D imageSize)
{
    
// calculate diagonal of film
    double d = sqrt(36.0*36.0 + 24.0*24.0/ crop;
    
double r = (double)imageSize.x / imageSize.y;
    
    
// calculate the sensor width and height that fit the ratio
    
// the ratio is determined by the size of our image.
    FDiff2D sensorSize;
    sensorSize.x 
= d / sqrt(1 + 1/(r*r));
    sensorSize.y 
= sensorSize.x / r;
    
    
double hfov = 360;
    
    
switch (proj) {
        
case SrcPanoImage::RECTILINEAR:
            hfov 
= 2*atan((sensorSize.x/2.0)/fl)  * 180.0/M_PI;
            
break;
        
case SrcPanoImage::CIRCULAR_FISHEYE:
        
case SrcPanoImage::FULL_FRAME_FISHEYE:
        
case SrcPanoImage::FISHEYE_ORTHOGRAPHIC:
        
case SrcPanoImage::FISHEYE_STEREOGRAPHIC:
        
case SrcPanoImage::FISHEYE_EQUISOLID:
            hfov 
= sensorSize.x / fl * 180/M_PI;
            
break;
        
case SrcPanoImage::EQUIRECTANGULAR:
        
case SrcPanoImage::PANORAMIC:
            hfov 
= (sensorSize.x / fl) / M_PI * 180;
            
break;
        
default:
            hfov 
= 360;
            
// TODO: add formulas for other projections
            DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images");
    }

    
return hfov;
}


double SrcPanoImage::calcFocalLength(SrcPanoImage::Projection proj, double hfov, double crop, vigra::Size2D imageSize)
{
    
// calculate diagonal of film
    double d = sqrt(36.0*36.0 + 24.0*24.0/ crop;
    
double r = (double)imageSize.x / imageSize.y;
    
    
// calculate the sensor width and height that fit the ratio
    
// the ratio is determined by the size of our image.
    FDiff2D sensorSize;
    sensorSize.x 
= d / sqrt(1 + 1/(r*r));
    sensorSize.y 
= sensorSize.x / r;
    
    
switch (proj)
    
{
        
case SrcPanoImage::RECTILINEAR:
            
return (sensorSize.x/2.0/ tan(hfov/180.0*M_PI/2);
            
break;
        
case SrcPanoImage::CIRCULAR_FISHEYE:
        
case SrcPanoImage::FULL_FRAME_FISHEYE:
        
case SrcPanoImage::FISHEYE_ORTHOGRAPHIC:
        
case SrcPanoImage::FISHEYE_STEREOGRAPHIC:
        
case SrcPanoImage::FISHEYE_EQUISOLID:
            
// same projection equation for both fisheye types,
            
// assume equal area projection.
            return sensorSize.x / (hfov/180*M_PI);
            
break;
        
case SrcPanoImage::EQUIRECTANGULAR:
        
case SrcPanoImage::PANORAMIC:
            
return  (sensorSize.x / (hfov/180*M_PI));
            
break;
        
default:
            
// TODO: add formulas for other projections
            DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images");
            
return 0;
    }

}


double SrcPanoImage::calcCropFactor(SrcPanoImage::Projection proj, double hfov, double focalLength, vigra::Size2D imageSize)
{
    
// calculate diagonal of film
    double r = (double)imageSize.x / imageSize.y;

    
double x = 36;
    
switch (proj)
    
{
        
case SrcPanoImage::RECTILINEAR:
            x 
= focalLength * tan(hfov/180.0*M_PI/2);
            
break;
        
case SrcPanoImage::CIRCULAR_FISHEYE:
        
case SrcPanoImage::FULL_FRAME_FISHEYE:
        
case SrcPanoImage::EQUIRECTANGULAR:
        
case SrcPanoImage::FISHEYE_ORTHOGRAPHIC:
        
case SrcPanoImage::FISHEYE_STEREOGRAPHIC:
        
case SrcPanoImage::FISHEYE_EQUISOLID:
        
case SrcPanoImage::PANORAMIC:
            
// same projection equation for both fisheye types,
            
// assume equal area projection.
            x = focalLength * (hfov/180*M_PI);
            
break;
        
default:
            
// TODO: add formulas for other projections
            DEBUG_WARN("Focal length calculations only supported with rectilinear and fisheye images");
            
return 0;
    }

    
// diagonal of sensor
    double diag = x * sqrt(1+ 1/(r*r));
    
return sqrt(36.0*36.0 + 24.0*24.0/ diag;
}
posted on 2009-07-31 14:46 noBugnoGain 阅读(725) 评论(0)  编辑 收藏 引用 所属分类: 图像处理

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理