初探单目相机测距——距离检测

简介: 初探单目相机测距——距离检测

前言


整体实验步骤:

image.png

横切向矫正图像


  构造函数CorrectImage 我们需要从单目相机参数中获取:内参矩阵、K\P值 如下代码段中所示。整体完成效果表示为:输入一张原始图像,输入一张矫正后的图像,这样可以减少测量距离误差。


def CorrectImage(Frame):
    cameraMatrix = np.array([[1321.395754, 13.90004046, 1254.996814],
                             [0, 1308.603399, 621.1465241],
                             [0, 0, 1]])
    # 相机畸变系数矩阵,5*1矩阵(k1,k2,p1,p2,k3)
    distCoeffs = np.array([0.080593716, -0.025207783, 0.007709644, 0.014762425, 0])
    h, w = Frame.shape[:2]
    newCameraMatrix, roi = cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, (w, h), 1, (w, h), 0)
    # 计算无畸变和修正转换关系
    mapx, mapy = cv2.initUndistortRectifyMap(cameraMatrix, distCoeffs, None, newCameraMatrix, (w, h),
                                             cv2.CV_16SC2)
    # 重映射 输入是矫正后的图像
    CorrectFrame = cv2.remap(Frame, mapx, mapy, cv2.INTER_LINEAR)
    return CorrectFrame
复制代码



获取目标物坐标框&根据坐标计算目标像素宽高


   这里我选用较为方便的圆检测,也可以替换为人脸检测,详情可以参考我的另外两篇博客,进行更改函数。


圆形检测:juejin.cn/post/708073…

人脸检测:juejin.cn/post/707483…


   这里分开介绍:一个是圆形检测的另一个是人脸检测,这两种检测的差异在于圆心检测返回值是三个(圆心坐标x,y;圆的半径r)人脸检测返回的坐标是四个(左上角起始点x,y 和 目标物的宽高w,h)


   对于圆形的高和宽为其直径(2xr),对于矩形框其宽高分别为(w,h)



根据比例计算目标距离


   在上面我们得到了矫正后的图像,也对矫正后的图像进行了目标检测得到了目标物的像素宽和高。我们可以根据单目相机的像素(FX,FY),根据相似原理计算出目标距离。


   这里仅以圆形为例子,给大家讲解如何利用比例进行测距,这里需要拿倒张氏标定得到的焦距FX和FY以及测量待测物的宽和高(在这里圆形的宽高相等为2r)。


FX对应了实体物体的宽

FY对应了实体物体的高


    通过公式:距离= (焦距(X,Y) * 实体物的宽或高)/ 像素宽或高


def FindCoin(CoinImg):
    # 将图像转换为灰度图像
    gray_img = cv2.cvtColor(CoinImg, cv2.COLOR_BGR2GRAY)
    # 高斯滤波降噪
    gaussian_img = cv2.GaussianBlur(gray_img, (7, 7), 0)
    # 利用Canny进行边缘检测
    edges_img = cv2.Canny(gaussian_img, 80, 180, apertureSize=3)
    # 自动检测圆
    circles1 = cv2.HoughCircles(edges_img, cv2.HOUGH_GRADIENT, 1, 1000, param1=300, param2=10, minRadius=5, maxRadius=30)
    if circles1 is None:
        pass
    else:
        circles = circles1[0, :, :]
        circles = np.uint16(np.around(circles))
        for i in circles[:]:
            cv2.circle(CoinImg, (i[0], i[1]), i[2], (0, 0, 255), 2)
            # print(i[0], i[1], i[2])
            r = 2 * i[2]
            FX = 1321.395754
            Coin_x = 0.054 # 实体圆的直径
            FY = 1308.603399
            Coin_y = 0.054 # 实体圆的直径
            Distensx = (FX * Face_x) / r
            Distensy = (FY * Face_y) / r
            print("宽度计算的距离", Distensx)
            print("高度计算的距离", Distensy)
复制代码


测试截图:


image.png


相关文章
|
20天前
|
计算机视觉 Python
Yolov5双目测距-双目相机计数及测距教程(附代码)
Yolov5双目测距-双目相机计数及测距教程(附代码)
305 1
|
编解码 前端开发 算法
基于OpenCV的双目摄像头测距(误差小)
首先进行双目摄像头定标,获取双目摄像头内部的参数后,进行测距;本文的双目视觉测距是基于BM算法。注意:双目定标的效果会影响测距的精准度,建议大家在做双目定标时,做好一些(尽量让误差小)。
9983 1
基于OpenCV的双目摄像头测距(误差小)
|
20天前
|
传感器 编解码 算法
LabVIEW计算相机图像传感器分辨率以及镜头焦距
LabVIEW计算相机图像传感器分辨率以及镜头焦距
18 0
|
11月前
|
传感器
使用校准相机测量平面物体
使用校准相机测量平面物体。
89 0
|
11月前
检测使用校准的立体摄像头拍摄的视频中的人物并确定其与摄像头的距离
检测使用校准的立体摄像头拍摄的视频中的人物,并确定他们与摄像头的距离。
105 0
|
11月前
|
数据可视化 机器人
使用AprilTag标记进行相机校准
AprilTags被广泛用作物体检测、定位应用的视觉标记,并作为相机校准的目标。AprilTags类似于QR码,但旨在编码更少的数据,因此可以更快地解码,这对于实时机器人应用程序非常有用。使用 AprilTags 作为校准模式的优点包括更好的特征点检测以及一致、可重复的检测。
671 0
|
机器学习/深度学习 传感器 算法
智慧交通day03-车道线检测实现02-2:张氏标定法+双目标定
该方法介于传统标定法和自标定法之间,既克服了传统标定法需要的高精度三维标定物的缺点,又解决了自标定法鲁棒性差的难题。标定过程不需要特殊的标定物,只需使用一张打印出来的棋盘格,并从不同方向拍摄几组图片即可,不仅实用灵活方便,而且精度很高,鲁棒性好。因此很快被全世界广泛采用,极大的促进了三维计算机视觉从实验室走向真实世界的进程。
245 0
|
算法 API 计算机视觉
智慧交通day03-车道线检测实现03:相机校正和图像校正的实现
标定的图片需要使用棋盘格数据在不同位置、不同角度、不同姿态下拍摄的图片,最少需要3张,当然多多益善,通常是10-20张。该项目中我们使用了20张图片
121 0
|
传感器 算法 智慧交通
智慧交通day03-车道线检测实现02-1:相机校正
我们所处的世界是三维的,而照片是二维的,我们可以把相机认为是一个函数,输入量是一个场景,输出量是一幅灰度图。这个从三维到二维的过程的函数是不可逆的。
116 0
|
自动驾驶 计算机视觉
单目测距(yolo目标检测+标定+测距代码)下
单目测距(yolo目标检测+标定+测距代码)
559 0

热门文章

最新文章