3D Stereo Base Calculations



Recently I have been taking close-up photos of flowers in 3D stereo and needed to find the best formula to compute the interaxial camera separation distance. Since my subject is not moving I was able to use a single camera on a tripod mounted slider to shoot sequential left and right eye view photos (the cha-cha method). The question is how far (interaxial distance) to move the camera to photograph the flower to give the most comfortable viewing experience for the 3D stereo photo. Normally I might use the quick 1:30 ratio rule for the stereo base calculation, (1/30 of subject distance), but I wanted an accurate measurement for my camera lens and studio setup. The 1/30 rule breaks down for close-ups.

I did some research on the Internet and found a good reference for stereo base calculation. See http://nzphoto.tripod.com/stereo/3dtake/fbercowitz.htm   (note: Bercovitz name in URL is misspelled). The author, John Wattie, summarized the various formulas used to calculate the stereo base. 

Other references I found are:

An important research paper by John Bercovitz, "Image-side Perspective and Stereoscopy",
IS&T/SPIE’s Stereoscopic Displays and Applications IX, (January 1998, San Jose, California, USA), vol.3295, pg 288-298, is cited by many researchers interested in stereo base calculation for accurate and comfortable stereo viewing.

The distance to the flowers I shot in 3D was less than 1 meter, so I used the Davis modified Bercovitz formula for close-ups, as described by Wattie. For example, the above photo, used a 50 mm focal length lens, at .838 meters from the flower, with a white background at 1.118 meters. The calculated interaxial distance was 38.4 mm. The 1:30 rule gives a stereo base of 28 mm. 

I shot the flower at different base distances of 20, 40, 60, and 80 mm. The 40 mm stereo base distance seemed to produce the best 3D photo.

Later, I found out about the Numworks.com graphing calculator for high school students. It's an open source platform and uses micro Python. Students can write formulas in Python and save on the device. I bought the calculator and coded the formulas that I would need for future stereo base calculation.

The link is to the downloadable Python code for use with the Numworks calculator is:

I reproduced the source code listing below. You may convert this code into other programming languages and calculators:
For 3D photography, calculate the stereo base for dual left and right cameras or sequential left and right eye photos from a single camera. The calculated base (mm) gives the most comfortable viewing experience for the stereo photo. Use different formulas for normal, close-up, or macro photography.
## 3D Photography: Stereo base calculation
# For dual camera stereo configuration
# or single camera sequential L/R base separation
# Assumes 35mm equivalent lens focal length
# P parallax for standard 35mm film - 36mm x 24 mm
# P = 1.2 for 1/30 of 36mm width, 3.33% deviation
# Assumes 3.33% is maximum deviation for comfortable viewing
# This is the standard 1/30 rule.
# F lens focal length mm
# N near subject distance mm
# L background distance mm
# B interaxial distance mm between left and right camera
# Reference: http://nzphoto.tripod.com/stereo/3dtake/fbercowitz.htm
# Bercovitz formula for dual camera separation
def base(F, N, L, P=1.2):
    B=P*((L*N)/(L-N))*(1/F-(L+N)/(2*L*N))
    return B
# same as base()
def b(F, N, L, P=1.2):
    B=P/(L-N)*(L*N/F-(L+N)/2)
    return B
def near(F, B, L, P=1.2):
    t=B/P
    N = (L*(t + 0.5))/(t+L/F-0.5)
    return N
# Davis modification of Bercovitz formula for close-up photography
# assumes background is close to the subject
def base_closeup(F, N, L, P=1.2):
    if L<2*N:
      L = 2*N
    B=P*((L*N)/(L-N))*(1/F-(L+N)/(2*L*N))
    return B
# Wattie modification of Bercovitz formula for correct roundness
# for macro photography
# V is viewing distance mm typically 600mm for 15 inch diagonal notebook
# I is Interocular distance mm, average 63mm
def base_macro(F, N, L, V, I=63, P=1.2):
    B=P*((L*N)/(L-N))*(1/F-(L+N)/(2*L*N))
    W = N*I/V
    if W < B:
        return W
    else:
        return B
def base_meindre(F, N, L, P=1.2):
    B = (P/F)*((L*N)/(L-N))
    return B 
def near_meindre(F, B, L, P=1.2):
    t = F*B/P
    N = (t*L)/(t + L)
    return N