Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Distance to Object Webcam C920HD or use OpenCV calibrate.py

I am trying to determine the distance of an object and the height of an object towards my camera. Is it possible or do I need to use OpenCV calibrate.py to gather more information? I am confused because the Logitech C920HD has 3 MP and scales to 15 MP via software.

I have following info:

  • Resolution (pixel): 1920x1080
  • Focal Length (mm): 3.67mm
  • Pixel Size (µm): 3.98
  • Sensor Size (inches): 1/2.88
  • Object real height (mm): 180
  • Object image height (px): 370

I checked this formula:Distance

distance (mm) = 3.67(mm) * 180(mm) * 1080(px) / 511 (px) * (1/2.88)(inches)*2.54 (mm/inches)

Which gives me 15.8 cm. Altough it should be about 60cm.

What am I doing wrong?

Thanks for help!

like image 784
zer02 Avatar asked May 26 '18 16:05

zer02


People also ask

How to find the distance between object and camera in OpenCV?

there is no such function available in opencv to calculate the distance between object and the camera. see this : Finding distance from camera to object of known size. You should know that the parameters depend on the camera and will change if the camera is changed.

How are the camera parameters calculated during calibration?

In the process of calibration we calculate the camera parameters by a set of know 3D points and their corresponding pixel location in the image. For the 3D points we photograph a checkerboard pattern with known dimensions at many different orientations.

How to refine the camera matrix in OpenCV using OpenCV?

OpenCV comes with two methods for doing this. However first, we can refine the camera matrix based on a free scaling parameter using cv.getOptimalNewCameraMatrix (). If the scaling parameter alpha=0, it returns undistorted image with minimum unwanted pixels.

What is the resolution of image in OpenCV?

Resolution of image (frame) must be the same, as in reference image I have kept to defaults of OpenCV which is (640, 480) Keep the camera straight as possible while capturing the reference images. Measure distance ( KNOWN_DISTANCE )from object camera, note it down and capture the image which is set to 76.2 centimetres.


1 Answers

Your formula looks the correct one, however, for it to hold over the entire image plane, you should correct lens distortions first, e.g., following the answer

Camera calibration, reverse projection of pixel to direction

Along the way, OpenCV lens calibration module will estimate your true focal length.

Filling the formula gives

Distance = 3.67 mm * 180 mm * 1080/511 / sensor_height_mm = 1396 mm^2 / sensor_height_mm

Leaving sensor_height_mm unknown. Given your camera is 16:9 format

w^2 + h^2 = D^2
(16x)^2+(9x)^2 = D^2
<=>
x = sqrt( D^2/337 )
<=>
h = 9x = 9*sqrt( D^2/337 )

Remember the rule of 16:

https://photo.stackexchange.com/questions/24952/why-is-a-1-sensor-actually-13-2-%C3%97-8-8mm/24954

Most importantly, a 1/2.88" sensor has 16/2.88 mm image circle diameter instead of 25.4/2.88 mm. Funny enough, the true image circle diameter is metric. Thus the sensor diameter is

D = 16 mm/ 2.88 = 5.556 mm

and

sensor_height_mm = h = 2.72 mm

giving

Distance = 513 mm

Note, that this distance is measured with respect to the lenses first principal point and not the sensor position or the lens front element position.

As you correct the barrel distortion, the reading should get more accurate. It's quite a lot for this camera. I have similar.

Hope this helps.

like image 168
mainactual Avatar answered Oct 04 '22 13:10

mainactual