基于openCV实现的单目相机行人和减速带检测

概述

在计算机视觉项目中,相机标定是一项至关重要的任务,因为它可以校正相机内部参数,消除因镜头畸变等因素导致的图像失真,从而提高后续图像处理和分析的精度。在这个项目中,相机标定的核心功能集成在名为`calibration.py`的Python脚本中,涵盖了从采集原始图像、进行相机标定计算到应用畸变矫正算法的全过程。特别地,针对鱼眼相机的畸变校正遇到了一些挑战,而其他类型的相机则能够顺利完成标定流程。

在这里插入图片描述

使用方法

用户在运行calibration.py时,会遵循清晰的操作指南逐步完成整个标定过程。首先,程序会在用户的指示下自动或选择性地清空标定板图片文件夹,以便收集新的图像数据。接下来,用户可以通过capture阶段预设拍照数量,确保获取足够丰富的标定样本。这些样本将用于后续的calibrate阶段,其中程序会根据拍摄的标定板图像精确估计相机的内参和畸变系数,并将不同类型的相机标定结果分别写入各自的配置文件中。最后,undistort阶段允许用户将原始图像应用所获得的标定参数进行去畸变处理。

关于标定板的选择和使用,作者在个人博客“雨白的博客小屋”中有详细介绍,并指明了本项目采用的是具有11列和8行黑白棋盘格图案的标定板,每格宽度为1cm。使用者需确保在程序中正确设置标定板参数,例如在calibration.py中声明为board = Board(11,8,10),若使用不同规格的标定板,则务必相应修改这些参数。

随着时间的推进,项目在2023年5月14日进行了重要更新,将部分标定相关的辅助函数拆分并整合到utils/calibrate模块中,以方便其他程序调用。同时,虽然提到了新增了生成鸟瞰图的功能并通过birdeye.py实现,但这一功能在后期已被移除。值得注意的是,鸟瞰图转化过程中,采用了以标定板左上角为基础,并向左上方向平移200mm的方式来定义标定板平面坐标系的原点。

另一方面,项目还包含了单应矩阵标定的内容。为了实现空间坐标与图像坐标的映射关系,作者巧妙地利用宿舍内的瓷砖作为特征点进行标定。通过OpenCV中的findHomography函数,可以从多个匹配点对中计算出单应矩阵H。然而,此处作者强调了一个易忽视的细节:findHomography得到的H矩阵实际上只满足了一个近似的线性变换关系,它并未直接给出标准齐次坐标形式的转换,因此在实际应用中需要额外处理,将其转换为符合齐次坐标的表示形式。用户通过运行getHomography.py脚本来拍照、标记像素点并进行标定,进而利用得到的H矩阵,配合getDistance.py进行基于像素点的测距实验。

结果

在这里插入图片描述

在目标检测方面,随着项目的深入,于2023年5月29日开始尝试使用YOLOv7框架训练自定义数据集。作者精心组织了数据集的构建流程,其中包括将待标注的图片放置于"data/images"文件夹,使用labelimg工具进行精细标注,将标注结果存放在"data/labels"文件夹。随后,依据具体指导文档,在YOLOv7项目目录下运行data_process.py脚本,将原始数据划分为训练集、验证集等,并生成相应的路径文件。

更新

在此过程中,作者列举了一系列训练过程中踩过的“坑”,为后续开发者提供了宝贵的经验教训:

  1. 对于train.py中的config文件,当尝试使用预训练模型时,曾出现"assets"的KeyError,这通常指向预训练模型路径的错误,提醒用户仔细检查配置文件中的路径设置。
  2. 在train.txt等文件中记录的路径建议使用绝对路径,可以通过Python内置的os模块获取当前工作目录并结合os.join()函数拼接路径,确保程序运行时能找到正确的文件位置。
  3. 若计划使用CPU而非GPU进行训练,需在utils/loss.py文件中将涉及设备分配的部分从"gpu: 0"改为"cpu: 0"。
  4. 当利用预训练权重初始化模型训练新类别时,必须在cfg/training/yolov7.yaml文件中将nc参数修改为对应的类别数量。
  5. 强烈建议在yaml配置文件中避免使用中文字符,以免引发编码错误。

代码

"""
This .py is to compute H between two planes:image plane and ground plane
(本程序实现:求解成像平面和大地平面的单应矩阵)
"""

import cv2
import numpy as np
from utils.calibrate import *
from utils.capture import Capture
from utils.opFile import writeHomographyToFile
from configs.Intrinsic_normal import cameraMatrix,distCoeff
from utils.measureDistance import getDistance

# mouse callback function
def click_corner(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        xy = "%d,%d" % (x, y)
        cv2.circle(img, (x, y), 1, (255, 0, 0), thickness = -1)
        cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
                    1.0, (0,0,0), thickness = 1)
        print(x,y)
        dist = round(getDistance(x,y),5)
        print("dist=",dist,"m")

        
if __name__ == '__main__':

    img = cv2.imread("./groundImg/61.png")
    cv2.destroyAllWindows()

    # click the corner
    cv2.namedWindow("groundBoard")
    cv2.setMouseCallback("groundBoard",click_corner)
    
    while(1):
        cv2.imshow("groundBoard", img)
        key = cv2.waitKey(1) & 0xff
        if key == ord('q') or key == ord('Q'):
            break

    

此外,项目还进行了技术创新和优化,比如加入了CBAM(Convolutional Block Attention Module)注意力机制,增强了网络对目标特征的学习能力;并且尝试了二值化处理等图像预处理手段,旨在提升模型性能。

然而,在最终的试验结果展示中,尽管已经付出了诸多努力,但目标检测在视频截图中的远程表现并不理想。作者推测这可能是由于相机本身的分辨率限制,导致在较远距离处捕捉到的物体特征模糊不清,从而影响了模型的训练效果和预测精度。这也提示我们在实际应用场景中,除了算法设计和训练策略之外,硬件设备的选择同样至关重要。

最后,计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,远程协助,代码定制,私聊会回复!

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿利同学

一角两角不嫌少

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

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

打赏作者

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

抵扣说明:

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

余额充值