与对象网络摄像头C920HD的距离或使用OpenCV calibrate.py

zer*_*r02 8 webcam camera opencv image image-processing

我正在尝试确定物体的距离物体朝向相机的高度.是否可以或者我是否需要使用OpenCV calibrate.py来收集更多信息?我很困惑,因为罗技C920HD有3 MP并通过软件扩展到15 MP.

我有以下信息:

  • 分辨率(像素):1920x1080
  • 焦距(mm):3.67mm
  • 像素尺寸(μm):3.98
  • 传感器尺寸(英寸):1/2.88
  • 物体实际高度(mm):180
  • 物体图像高度(px):370

我检查了这个公式:距离

distance (mm) = 3.67(mm) * 180(mm) * 1080(px) / 511 (px) * (1/2.88)(inches)*2.54 (mm/inches)
Run Code Online (Sandbox Code Playgroud)

这给了我15.8厘米.它应该是约60厘米.

我究竟做错了什么?

感谢帮助!

mai*_*ual 3

您的公式看起来是正确的,但是,为了使其适用于整个图像平面,您应该首先纠正镜头畸变,例如,按照答案

相机标定,像素向方向的反向投影

在此过程中,OpenCV 镜头校准模块将估计您的真实焦距。

填写公式给出

Distance = 3.67 mm * 180 mm * 1080/511 / sensor_height_mm = 1396 mm^2 / sensor_height_mm
Run Code Online (Sandbox Code Playgroud)

留下sensor_height_mm不明。鉴于您的相机是 16:9 格式

w^2 + h^2 = D^2
(16x)^2+(9x)^2 = D^2
<=>
x = sqrt( D^2/337 )
<=>
h = 9x = 9*sqrt( D^2/337 )
Run Code Online (Sandbox Code Playgroud)

记住16 规则

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

最重要的是,1/2.88" 传感器的像圈直径为 16/2.88 mm,而不是 25.4/2.88 mm。有趣的是,真正的像圈直径是公制的。因此传感器直径为

D = 16 mm/ 2.88 = 5.556 mm
Run Code Online (Sandbox Code Playgroud)

sensor_height_mm = h = 2.72 mm
Run Code Online (Sandbox Code Playgroud)

给予

Distance = 513 mm
Run Code Online (Sandbox Code Playgroud)

请注意,该距离是相对于镜头第一主点而不是传感器位置或镜头前元件位置测量的。

当您纠正桶形失真时,读数应该会变得更加准确。对于这款相机来说,这是相当多的。我有类似的。

希望这可以帮助。