传感器尺寸:
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) 编辑 收藏 引用 所属分类:
图像处理