利用相机焦距进行物体尺寸测量

645 阅读2分钟

前言

  在上一篇视觉测量工件尺寸中发现在实际应用中存在些许测量不准的BUG,在此特向大家致歉!

  在本篇中提出一种利用相机焦距和相机距离目标的距离进行物体尺寸测量,这里我借鉴了下《视频检测+定位+测距+控制鼠标移动》中测量距离的方法进行调整这个里面的公式原理:

X轴方向: 物体的实体尺寸 = 相机距离物体的距离/焦距 * 图像像素

Y轴方向: 物体的实体尺寸 = 相机距离物体的距离/焦距 * 图像像素

实践

  例如我们筹备标定板进行标定,这里标定的过程可以参考初探单目相机测距——相机标定,我们使用图像进行标定,这里需要注意的事项是:标定图像的尺寸需要同后期使用测量物体尺寸时拍摄的尺寸保持一致。

        微信图片_20220925110557.jpg 微信图片_20220925110612.jpg

  这里我们通过标定过程可以得到相机的两个焦距的值以及目标距离相机的距离分别为:

FX, FY, D = , 3.2757(米)

  经过测量,可以得到标定板距离相机的距离,在后面中我们测量物体的尺寸应当选择厚度较小的,或者使用投影的方式,这样可以最大限度降低误差。

image.png image.png image.png

代码

  这里我们可以得到图像的像素尺寸,使用方法为点击线段的两个端点即可获取两端点的图像坐标,进一步可以计算出自己的K值。

b33c8b23991bac3ac4710c6f2a76b3a.jpg

import cv2

img = cv2.imread('test.jpg')
def mouse_click(event, x, y, flags, para):
    if event == cv2.EVENT_LBUTTONDOWN:  # 左边鼠标点击
        print('PIX:', x, y)

if __name__ == '__main__':
    cv2.namedWindow("img")
    cv2.setMouseCallback("img", mouse_click)
    while True:
        cv2.imshow('img', img)
        if cv2.waitKey() == ord('q'):
            break
    cv2.destroyAllWindows()

根据这个由勾股定理带入计算可以得到工件尺寸

import math

FX, FY = 16101.6621878712, 16105.9886831900  # 相机的焦距
D = 3.2757  # 物体距离相机的理论距离单位米

# 测量工件的两端坐标
x1, y1 = (2333, 1652)
x2, y2 = (3060, 1610)

# 计算物体分别在XY轴上的像素长度 
x = abs(x2 -x1)
y = abs(y2 - y1)

# 计算物体在XY轴上的实际长度 (得到值的单位是米)
DX = (x * D) / FX
Dy = (y * D) / FY

DL = math.sqrt(DX*DX + Dy*Dy)  # 勾股定理计算尺寸
print("物体的实际尺寸", DL)