基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)

1.简介

1.1 2D测量技术

基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。

工业制造:在工业制造过程中,精确测量是确保产品质量和一致性的关键。基于单目相机的2D测量技术可以用于检测和测量零件尺寸、位置、形状等参数,进而实现自动化生产和质量控制。通过实时监测并反馈测量结果,可以快速发现和纠正生产中的偏差,提高产品的一致性和合格率。

计算机视觉:单目相机作为计算机视觉的传感器之一,能够捕捉并记录场景中的图像信息。基于单目相机的2D测量技术可以通过对图像进行处理和分析来提取目标物体的特征和参数。这种技术在目标检测、物体跟踪、姿态估计等计算机视觉任务中起着至关重要的作用。

地理测绘和导航:基于单目相机的2D测量技术可以应用于地理测绘和导航领域。通过获取地面或航空图像,并利用图像处理和计算机视觉算法,可以实现地表特征的提取、地形建模、数字地图的生成等工作。这对于城市规划、农业管理、导航系统等方面具有重要的应用价值。

医学影像:在医学领域,基于单目相机的2D测量技术可以用于医学影像的分析和测量。通过对医学图像进行处理和分析,可以提取器官、病灶的形状、大小、位置等信息,辅助医生进行诊断和治疗决策。这种技术在影像学、放射学、眼科等医学专业中得到广泛应用。

综上所述,基于单目相机的2D测量技术在工业制造、计算机视觉、地理测绘和导航、医学影像等领域都有着重要的背景和意义。它可以提高生产效率、产品质量,推动科学研究和医学进步,为各个领域带来更多的机遇和挑战。

1.2 yolo算法

YOLO(You Only Look Once)是一种实时目标检测算法,它的主要思想是将目标检测问题转化为一个回归问题。相较于传统的目标检测算法,YOLO具有更快的处理速度和较高的准确性。

YOLO算法的基本原理如下:

  1. 将输入图像划分为一个固定大小的网格。每个网格负责预测该网格中是否包含目标以及目标的边界框。

  2. 每个网格预测多个边界框(一般为5个)以适应不同形状的目标。

  3. 每个边界框预测目标类别的概率。

  4. 对每个边界框的位置和类别进行综合预测。

  5. 使用非极大值抑制(NMS)处理重叠的边界框,以获取最终的目标检测结果。

YOLO算法相较于其他目标检测算法的优势在于其端到端的设计,能够实现实时目标检测,并且减少了检测过程中的多次重复计算。然而,由于YOLO将图像划分为网格,对于小尺寸目标和密集目标的检测效果可能会稍差。

此外,YOLO还有不同版本的改进,如YOLOv2、YOLOv3和YOLOv4等,这些改进版本在准确性和速度方面有所提升,同时也引入了一些新的技术和网络结构,如多尺度预测、锚框、Darknet-19等。


 

 

2.功能实现 

2.1构思:

上一章,我们实现了opencv对手机,卡片等轮廓清晰物体的尺寸测量,但是在过程中,我们发现复杂物体的轮廓很难有效提取,干扰太多,不准确。所以我思考用深度学习的方法来寻找这个包围物体的框,于是想到了yolo算法。(当然这个想法比较简单,欢迎大佬评论区指正)

这是我导的一个项目,用于未来试智能立体停车场的视觉部分,要求只能单目相机(单目便宜,真实服啦),最后实时帧率只能到6帧左右,当然用gpu加速可以30帧以上。但是runtimeonnx用过的都懂,对环境要求较高,不太适合普及。

2.2 代码思路

主函数

import cv2
import utlis
from ours import *
# from utlis import *
import time
 
###################################
webcam = True
path = 'img.png'
# cap = cv2.VideoCapture(r'D:\Opencv-project-main\CVZone\09 Object Size Measurement\5.mp4')
cap = cv2.VideoCapture(0)
cap.set(10,160)
cap.set(3,1920)
cap.set(4,1080)
scale = 3
wP = 210 *scale
hP= 297 *scale
###################################

pTime = 0
while True:
    if webcam:success,img = cap.read()
    else: img = cv2.imread(path)
    img1=img.copy()
 
    imgContours , conts = utlis.getContours(img,minArea=50000,filter=4)
    if len(conts) != 0:
        biggest = conts[0][2]
        #print(biggest)
        imgWarp = utlis.warpImg(img, biggest, wP,hP)
        img=imgWarp.copy()

        onnx_path = r'D:\Opencv-project-main\CVZone\09 Object Size Measurement\yolov5s.onnx'
        model = Yolov5ONNX(onnx_path)
        or_img,box_coords = model.detect(imgWarp)

        img = utlis.dectshow(img,box_coords)
        cTime = time.time()

        fps = 1 / (cTime - pTime)
        pTime = cTime
        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 255), 3)
        # 图像预处理及边缘检测
        # edges = utlis.preprocess(img)
        #
        # # 获取物体轮廓并进行多边形逼近
        # approx = utlis.get_object_contour(edges, img)
        cv2.imshow('Object Detection', img)




        # cv2.polylines(imgContours2,[obj[2]],True,(0,255,0),2)
        # nPoints = utlis.reorder(obj[2])

        # nW = round((utlis.findDis(nPoints[0][0]//scale,nPoints[1][0]//scale)/10),1)
        # nH = round((utlis.findDis(nPoints[0][0]//scale,nPoints[2][0]//scale)/10),1)
        #
        #
        # cv2.arrowedLine(imgContours2, (nPoints[0][0][0], nPoints[0][0][1]), (nPoints[1][0][0], nPoints[1][0][1]),
        #                 (255, 0, 255), 3, 8, 0, 0.05)
        # cv2.arrowedLine(imgContours2, (nPoints[0][0][0], nPoints[0][0][1]), (nPoints[2][0][0], nPoints[2][0][1]),
        #                 (255, 0, 255), 3, 8, 0, 0.05)
        # x, y, w, h = obj[3]
        # cv2.putText(imgContours2, '{}cm'.format(nW), (x + 30, y - 10), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.5,
        #             (255, 0, 255), 2)
        # cv2.putText(imgContours2, '{}cm'.format(nH), (x - 70, y + h // 2), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1.5,
        #             (255, 0, 255), 2)
        cv2.imshow('A4', img1)
 
    img = cv2.resize(img,(0,0),None,0.5,0.5)

    cv2.waitKey(1)

 图像处理及仿射变换部分代码

 yolo推理部分代码

 有需要的朋友,欢迎私聊博主

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
Yolo单目相机测距是一种利用深度学习算法进行距离估计的方法。Yolo(You Only Look Once)是一种目标检测算法,通过识别图像中的物体来实现距离测量Yolo单目相机测距的基本原理是利用相机获取场景图像,然后通过深度学习算法对图像中的目标进行识别。由于每个目标的尺寸在图像中是已知的,我们可以通过目标在图像中的大小估计目标与相机之间的距离。 实际操作中,我们需要通过预先标定相机的内外参数,来建立相机的坐标系。然后,通过获取目标在图像中的像素尺寸,结合相机的参数,可以计算出目标与相机之间的距离。 Yolo单目相机测距方法有一定的优势。首先,它只需要使用一台相机就可以实现距离测量,无需使用多个相机或其他传感器。其次,利用深度学习算法,可以实现实时的目标检测和距离测量。此外,Yolo算法具有较好的准确性和鲁棒性,能够适应不同场景的测距需求。 然而,Yolo单目相机测距方法也存在一些局限性。首先,测距误差会受到图像分辨率、目标姿态以及相机标定精度等因素的影响。其次,对于特别远距离或特别小目标的测距,可能会比较困难。此外,由于目标尺寸在图像中的变化可能较大,因此在不同距离下的目标识别和距离测量会存在一定的挑战。 总的来说,Yolo单目相机测距方法在一般场景下具有较好的表现,可以实现实时的距离测量。但在特殊场景和特殊要求下,可能需要采用其他更精确的测距方法。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈子迩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值