相机标定、单目视觉测距原理

相机标定

刚接触opencv,学习一下单目测距。
单目相机通过图像计算出距离。
单目测距原理
OpenCV学习笔记(二十一)——简单的单目视觉测距尝试

首先要计算出焦距。然后再通过焦距计算出距离。
两个公式
在这里插入图片描述
F是焦距,P是要测试的物体像素宽度,(我是拍完照片后,用微信截图工具截取要测量的部分的像素大小),D是要测量物体距离相机的距离。W是要测量物体的实际大小。
例如我测试了A4纸,
F = (550 * 19.6)/ 11.69
D和W单位是英尺,P单位是像素,
通过已知计算出F焦距之后,根据公式可计算D。
在这里插入图片描述
有了F我问就可以计算其他照片的距离D了。
相机标定、单目视觉测距原理_第1张图片
简单代码实现


import cv2 as cv
import pyautogui #控制鼠标键盘
from pynput.mouse import Button,Controller
import mediapipe

def face_detect_demo(img):
    # 将图片灰度
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 加载数据特征
    face_detect = cv.CascadeClassifier(
        '/Users/limengzhou/opt/anaconda3/lib/python3.8/site-packages/cv2/data/haarcascade_frontalface_default.xml')
    faces = face_detect.detectMultiScale(gray)
    # faces = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(70, 70), maxSize=(200, 200))
    w,h = 0.1,0.1
    for x, y, w, h in faces:
        # print(x,y,w,h)

        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        # mouse = Controller()
        # print(pyautogui.locateOnScreen('jingse.jpg'))
        # pyautogui.moveTo(x, y, duration=0.5)
    distens = GetDistens(w,h)
    #计算距离
    return img,distens


def GetDistens(w, h):
    # FX = 1321.395754
    FX = 849.7946369 # 摄像头焦距
    # FY = 1308.603399
    FY = 843.0381357 # 摄像头焦距
    Face_x = 0.15  #要测实物宽度 
    Face_y = 0.22 #要测事物长度
    # w是图像中像素的大小
    # h是图像中像素的高度
    Distensx = (FX * Face_x) / w
    Distensy = (FY * Face_y) / h
    Distens = (Distensx + Distensy) / 2
    return Distens
#读取视频
# cap = cv.VideoCapture('视频.mp4')

cap = cv.VideoCapture(0)
#获取帧
# fps = cap.get(propId = cv.CAP_PROP_FPS)
width = cap.get(propId=cv.CAP_PROP_FRAME_WIDTH)
height = cap.get(propId=cv.CAP_PROP_FRAME_HEIGHT)
# count = cap.get(propId = cv.CAP_PROP_FRAME_COUNT)
# print(width)
# print(height)
# print(count)
while True:
    flag,frame = cap.read()
    fps = cap.get(propId=cv.CAP_PROP_FPS)
    # print(fps)
    # print(flag)
    if not flag:
        break
    img,distens = face_detect_demo(frame)
    if ord('q') == cv.waitKey(1):
        break

    cv.putText(img, "FPS= %.2f" % (fps), (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1)
    cv.putText(img, "Distens= %.2f" % (distens), (10, 700), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1)
    cv.imshow('result', img)

# face_detect_demo()
# cv.waitKey(0)
cv.destroyAllWindows()

你可能感兴趣的:(opencv,opencv,计算机视觉,人工智能)