基于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推理部分代码

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

相关推荐
懒惰才能让科技进步34 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara1 小时前
函数对象笔记
c++·算法
泉崎1 小时前
11.7比赛总结
数据结构·算法
你好helloworld1 小时前
滑动窗口最大值
数据结构·算法·leetcode
AI街潜水的八角2 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple2 小时前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少2 小时前
数据结构——线性表与链表
数据结构·c++·算法
此生只爱蛋3 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
咕咕吖4 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎4 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode