第一周周报


研一上学期周报

孙超

周报时间:2024.8.26-2024.9.1

一、当前任务

任务1:深度学习第一周培训,学习深度学习基础。
任务2:计算机视觉第一周培训,学习相机的透视成像模型,内外参,相机标定原理等。

二、本周工作

(1)任务1相关工作:

使⽤⾕歌的 Colab进行pytorch的学习,编写相关代码并且观察运行结果。

1.定义数据

一般定义数据使用torch.Tensor ,Tensor的意思是张量,是数字各种形式的总称。本节对Tensor可以表示的部分类型数据进行了演示,以下为程序运行截图:image-20240830112806788

2.定义操作

凡是用Tensor进行各种运算的,都是Function。最终还是需要用Tensor来进行计算的,计算包括基本运算,加减乘除,求幂求余布尔运算,大于小于,最大最小,线性运算,矩阵乘法,求模,求行列式等等。
本节对Tensor支持的运算操作进行了演示,以下为程序运行截图:
在这里插入图片描述

在这里插入图片描述 通过在⾕歌的 Colab上练习,学习了张量的定义和基本操作。其中值得注意的是,使用张量进行矩阵乘法时(运算符为@),两个张量中的元素的dtype需要相同,否则会报错。
3.螺旋数据分类

本节主要学习了如何用神经网络实现数据分类。
下面代码初始化了重要参数,实现了对3000个样本的特征初始化。
在这里插入图片描述

在这里插入图片描述 在使用Colab首次运行上述代码时,可能会遇到“[Errno 2] No such file or directory: 'res/ziegler.png" 的错误。此时我们需要在目录中创建res文件夹并在里面上传ziegler.png文件,可以是任何的png文件,经过测试并不会影响实验结果。
3.1构建线性模型分类
在这里插入图片描述 在这里插入图片描述 上面使用 print(model) 把模型输出,可以看到有两层: 第一层输入为 2(因为特征维度为主2),输出为 100; 第二层输入为 100 (上一层的输出),输出为 3(类别数) 从上面图示可以看出,线性模型的准确率最高只能达到 50% 左右,对于这样复杂的一个数据分布,线性模型难以实现准确分类。
3.2构建两层神经网络分类
在这里插入图片描述 在这里插入图片描述 在两层神经网络里加入 ReLU 激活函数以后,分类的准确率得到了显著提高。

(2)任务2相关工作:

对张正友论文进行了阅读,参考相关视频理解了相机标定的基本原理,分别使用Matlab、Opencv实现对自己手机的内外参标定,并矫正所拍摄图片;将棋盘格标定板当作平面Marker,使用Opencv确定了相机的位姿。

1.手机内外参标定以及矫正
1.1Matlab

用自己的手机对标定板(所用棋盘格的内角点分布为11*8,棋盘格每个方格的实际大小为3cm)拍摄了15张不同角度的图片,上传至Matlab使用自带的Camera Calibrator进行相机标定,有2张图片未识别,最后使用13张图片进行标定。
在这里插入图片描述
选择径向畸变的参数为3个,并计算切向畸变。配置界面如下:
在这里插入图片描述
相机标定结果如下图所示,从右上方柱状图可以看出重投影误差均小于0.35个像素,说明此次标定的质量较好。点击Show Undistorted按钮可以查看畸变矫正后的图像。
在这里插入图片描述
在这里插入图片描述
点击Export Camera Parameters按钮可以查看相机标定的参数,一些比较重要的参数在下图中进行了标注
请添加图片描述
在这里插入图片描述
根据内参矩阵K可以得到该手机相机的焦距fx、fy 与主点u0、v0,径向畸变可以得到k1、k2、k3,切向畸变可以得到p1、p2,通过PatternExtrinsics可以得到每张图片的外参,至此就完成该手机相机的内外参标定。
在这里插入图片描述

1.2Opencv

首先在Python中导入opencv库,使用 cv2.calibrateCamera可以求解出相机的内参、畸变系数以及每张图像的外参,使用cv2.undistort可以校正畸变图像。使用Opencv得到的内参矩阵和畸变系数,以及每一张图片的外参(转化为旋转矩阵)如下图所示:
在这里插入图片描述
在这里插入图片描述

同一张图片的标定效果和矫正效果如下图所示:
在这里插入图片描述
在这里插入图片描述

2.使用Opencv确定相机的位姿

完成相机标定后,可以通过检测标定板在图像中的位置来计算标定板在相机坐标系下的位姿(外参)。

cv2.solvePnP 是 OpenCV 中用于估计对象姿态的函数。它计算从 3D 点到 2D 图像点的变换,包括旋转和位移。

将上面得到的手机相机标定参数导入,通过cv2.solvePnP可以求出标定板在相机坐标系下的位姿矩阵,具体实现代码如下:

import cv2
import numpy as np
import glob
# 加载相机标定参数
with np.load('camera_calibration.npz') as data:
    mtx = data['mtx']
    dist = data['dist']
# 设置棋盘格参数
chessboard_size = (11, 8)  # 棋盘格的内角点个数
square_size = 3.0  # 棋盘格每个方格的实际大小
# 准备棋盘格的世界坐标系坐标(假设z=0)
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
objp *= square_size
# 用于存储每张图像的位姿矩阵
pose_matrices = []
# 获取所有棋盘格图像的路径
images = glob.glob('C:\\Users\\oucVLer\\Desktop\\chessboard\\*.jpg')
for image_path in images:
    # 读取图像
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 检测棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
    if ret:
        # 优化角点位置到亚像素级精度
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
        corners = cv2.cornerSubPix(gray, corners, (11, 8), (-1, -1), criteria)
        # 计算标定板在相机坐标系下的位姿(标定板在相机坐标系下的位姿)
        ret, rvec, tvec = cv2.solvePnP(objp, corners, mtx, dist)
        # 将旋转向量转换为旋转矩阵
        rmat, _ = cv2.Rodrigues(rvec)
        # 组合旋转矩阵和平移向量为位姿矩阵
        pose_matrix = np.hstack((rmat, tvec))
        pose_matrices.append(pose_matrix)
        # 在图像上绘制坐标轴用于可视化
        axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3)
        imgpts, _ = cv2.projectPoints(axis, rvec, tvec, mtx, dist)
        img = cv2.drawChessboardCorners(img, chessboard_size, corners, ret)
        corner = tuple(corners[0].ravel().astype(int))
        # 确保坐标点是以正确的格式传递给 cv2.line 函数
        img = cv2.line(img, corner, tuple(imgpts[0].ravel().astype(int)), (0, 0, 255), 5)
        img = cv2.line(img, corner, tuple(imgpts[1].ravel().astype(int)), (0, 255, 0), 5)
        img = cv2.line(img, corner, tuple(imgpts[2].ravel().astype(int)), (255, 0, 0), 5)
        cv2.imshow('Pose Estimation', img)
        cv2.waitKey(0)
cv2.destroyAllWindows()
for i, pose_matrix in enumerate(pose_matrices):
    print(f"Pose matrix for image {i + 1}:\n", pose_matrix)

标定板到相机的位姿矩阵如下图所示:
在这里插入图片描述

样图标定板位姿如下图所示:
在这里插入图片描述

(3)其他工作

通过师兄给的资料开始学习usbl的原理以及工具的使用,阅读水下多源融合定位与导航技术这本书。

三、下周计划

1.学习双目,三角定位,极限约束,匹配视差,双目重建,完成计算机视觉课程第二周作业。
2.学习卷积神经网络,完成深度学习课程作业。
3.继续学习usbl的原理以及工具的使用。

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值