山东省建设厅网站首页,这几年做哪些网站致富,网站做伪原创收录,数据集网站本章系统介绍了视觉感知从底层像素到高层语义理解的知识。首先介绍了相机模型、标定与畸变矫正等图像处理基础知识#xff0c;为准确成像与空间测量奠定基础#xff1b;随后深入目标检测与分类应用#xff0c;分别介绍了CNN与Transformer的核心思想#xff0c;并讲解了小目…本章系统介绍了视觉感知从底层像素到高层语义理解的知识。首先介绍了相机模型、标定与畸变矫正等图像处理基础知识为准确成像与空间测量奠定基础随后深入目标检测与分类应用分别介绍了CNN与Transformer的核心思想并讲解了小目标与遮挡场景下的感知难题接着讲解了实例分割、语义分割以及2D/3D重建与融合方法最后聚焦于姿态估计与人体识别讲解了骨架建模、行为识别与动作理解知识展示了视觉感知在智能系统中的综合应用能力。3.1 图像处理基础图像处理是视觉感知系统的底层支撑主要解决“如何获得可信、可计算的视觉数据”这一核心问题。本节从成像原理出发介绍数字图像的表示方式与基本处理流程重点围绕相机模型、成像几何以及标定与校正等关键技术展开为后续的目标检测、分割与三维理解建立统一、精确的视觉坐标基础是从像素走向高层语义的第一步。3.1.1 相机模型与标定相机模型用于描述三维世界中的点如何通过光学成像过程投影到二维图像平面是计算机视觉中最基础、也是最核心的几何模型之一。准确的相机模型不仅决定了图像与真实世界之间的空间映射关系还直接影响目标定位、三维重建、SLAM 与机器人视觉等任务的精度。1. 相机成像模型在实际应用中最常用的是针孔相机模型Pinhole Camera Model。该模型假设光线通过一个理想的小孔投影到成像平面其核心思想是透视投影关系。三维空间点在世界坐标系下经过一系列坐标变换最终映射为图像中的二维像素点。1成像过程相机成像模型的成像过程通常经历以下坐标系转换世界坐标系→相机坐标系→成像平面坐标系→像素坐标系。其中世界坐标系描述物体在真实环境中的位置相机坐标系以相机光心为原点成像平面坐标系反映理想投影位置像素坐标系则与图像分辨率和像素排列方式相关。2针孔相机模型的数学表达具象化数学模型在理想情况下相机成像可抽象为针孔相机模型。三维空间点Pw(Xw,Yw,Zw,1)T在世界坐标系中经由相机外参变换到相机坐标系PcRt01Pw其中R∈R3×3旋转矩阵t∈R3×1平移向量随后三维点通过透视投影映射到像素平面其齐次坐标形式为suv1KRtXwYwZw1其中s为尺度因子uv为像素坐标。2. 相机内参与外参相机模型中的参数通常分为内参Intrinsic Parameters和外参Extrinsic Parameters两类。1内参描述相机自身的成像特性包括焦距、主点位置以及像素尺度因子等决定了三维点如何投影到图像平面。内参矩阵反映的是相机“怎么看世界”。内参决定了相机如何看世界在数学中通过内参矩阵描述相机自身的成像属性其标准形式为Kfdx0u00fdyv0001其中f相机焦距dx,dy像素在x/y方向上的物理尺寸u0v0主点坐标光轴与像素平面的交点。2外参描述相机在世界坐标系中的位置与姿态通常由旋转矩阵和平移向量组成用于刻画相机“站在世界的哪里、朝向哪里”。R相机姿态朝向t相机位置。外参决定了“相机站在世界的哪里、朝向哪里”。总之内参和外参共同构成完整的投影模型使得三维空间点可以被精确映射到二维图像中。3. 相机标定的意义在实际系统中相机的内参与外参往往未知或存在偏差因此需要通过相机标定Camera Calibration进行估计。相机标定的目标是利用已知几何结构的标定物如棋盘格、圆点阵列通过多幅图像反向求解相机参数从而建立准确的成像模型。高质量的标定结果是畸变矫正、三维测量、视觉定位等任务的前提一旦标定不准后续算法即使再复杂也难以获得可靠结果。4. 面向人形机器人的外参动态性问题在传统静态视觉系统中相机外参通常被视为固定参数而在人形机器人场景中外参具有显著的动态性1头部转动与行走扰动相机通常安装在机器人头部随颈部关节转动行走过程中还会受到振动与姿态变化影响。2IMU融合更新外参实际系统中外参需结合IMU、关节编码器数据实时更新RcamworldRimuworld⋅Rcamimu3对感知任务的影响外参更新不及时会直接导致下面的问题地面高度估计偏差障碍物距离判断错误抓取目标空间定位失准。5. 标定基本流程典型的相机标定流程包括1采集多角度、多位置的标定板图像2提取稳定、精确的特征点如棋盘格角点3建立二维像素点与三维世界点之间的对应关系4通过优化方法求解相机内参和外参5评估重投影误差验证标定精度。这一过程本质上是一个非线性优化问题目标是最小化理论投影点与实际观测点之间的误差。6. 工程实践中的注意事项在真实应用中相机标定应尽量覆盖相机视场的不同区域避免只在局部区域采样同时需要保证标定板的平整性与特征点检测精度。对于多相机系统还需进行外参一致性标定以保证各相机之间的空间关系准确可靠。总之通过建立精确的相机模型与标定结果视觉系统才能实现从二维像素到三维空间、再到高层语义理解的可靠映射。3.1.2 畸变矫正在理想针孔相机模型中空间直线在图像中仍应保持为直线但在真实相机系统中由于镜头结构、制造工艺及装配误差等因素成像往往会产生不同程度的几何畸变。畸变若不加以处理将直接破坏相机模型的准确性使前一节建立的投影关系失效。因此畸变矫正是相机标定之后、所有高层视觉算法之前必须完成的关键步骤在人形机器人视觉系统中尤为重要。1. 畸变的类型与成因实际工程中最常见的畸变主要包括以下两类。1径向畸变Radial Distortion径向畸变由镜头曲率引起随着像素点到主点距离的增大而加剧表现为图像“鼓起”或“内缩”常见形式包括桶形畸变图像向外膨胀广角镜头中较为常见枕形畸变图像向内收缩多见于长焦镜头。2切向畸变Tangential Distortion切向畸变主要由镜头与成像平面不完全平行、光轴偏移等装配误差造成表现为图像局部拉伸或倾斜常出现在低成本或长期使用的相机系统中。2. 畸变的数学模型具象化表达在畸变建模中通常先将像素坐标归一化到相机坐标系下xXZ,yYZ令r2x2y21径向畸变模型径向畸变常用多项式模型表示xradx1k1r2k2r4k3r6yrady1k1r2k2r4k3r6其中k1,k2,k3为径向畸变系数。2切向畸变模型xtan2p1xyp2(r22x2)ytanp1(r22y2)2p2xy其中p1,p2为切向畸变系数。3完整畸变模型xdxradxtanydyradytan该模型将理想点映射为畸变后的观测点。3. 畸变参数的获取方式畸变参数通常在相机标定过程中与内参、外参同时求解。以张正友标定法为例通过多幅棋盘格图像利用非线性优化方法使投影点与实际观测点的重投影误差最小从而联合估计KRtk1k2k3p1p2在工程实践中常用的畸变参数配置包括普通镜头k1,k2,p1,p2广角或鱼眼镜头增加k3或采用专用鱼眼模型。4. 畸变矫正的基本流程畸变矫正的核心思想是根据畸变模型将畸变图像中的像素点反向映射到理想成像平面。其典型流程如下1使用标定结果获取内参矩阵与畸变系数2将像素坐标转换为归一化相机坐标3根据畸变模型进行反向映射计算4通过插值方法生成矫正后的图像。在具体实现层面通常采用查找表LUT或映射矩阵以满足实时性要求。5. 人形机器人场景下的畸变矫正要点1对距离估计的影响畸变未矫正会导致边缘区域目标位置明显偏移使机器人在抓取或避障时出现距离误判。2对多传感器融合的影响在“视觉–IMU”或“视觉–激光雷达”融合中畸变会破坏不同传感器之间的几何一致性。3实时性与计算代价人形机器人需在嵌入式算力平台上运行通常在系统初始化阶段预计算畸变映射表以降低在线计算开销。4长期运行稳定性镜头老化或结构微变可能引起畸变参数漂移必要时需重新标定或在线微调。6. 工程实践建议标定时应尽量覆盖图像边缘区域以准确估计径向畸变对广角与鱼眼相机优先采用专用畸变模型对关键任务抓取、行走、操作应在矫正后的图像坐标系中完成几何计算定期评估畸变矫正前后的重投影误差变化作为系统健康度指标。总之畸变矫正是连接理想数学模型与真实成像系统的“校准桥梁”。只有在消除镜头畸变影响后视觉系统才能保证几何一致性和空间精度为人形机器人后续的目标检测、三维感知与动作执行提供可靠输入。3.1.3 实战演练人形机器人的相机标定与畸变矫正请看下面的实例聚焦于人形机器人视觉系统核心应用完整演示了相机标定与畸变矫正的全流程。在实例中通过模拟生成居中棋盘格图像与精准内角点基于张正友标定法求解相机内参矩阵和畸变系数规避了真实场景下角点检测失败问题模拟了真实相机镜头畸变效果对比展示了抓取目标水杯畸变前、矫正后的视觉差异同时实现了3D世界坐标到2 图像平面的投影标记了机器人抓取目标的空间位置。实例3-1人形机器人的相机标定与畸变矫正源码路径codes\3\Tu.py实例文件Tu.py的主要实现流程如下所示。1下面代码的功能是设置Matplotlib中文显示环境。它首先强制使用TkAgg后端然后根据操作系统选择对应的中文字体路径Windows用微软雅黑、macOS用苹方、Linux用文泉驿微米黑尝试加载字体并配置为全局字体同时保证负号可以正常显示。如果字体加载失败会自动回退到默认无衬线字体。# 1. 中文字体配置 matplotlib.use(TkAgg, forceTrue) plt.rcParams[axes.unicode_minus] False # 保证负号显示正常 system platform.system() # 分系统指定字体路径兜底逻辑 if system Windows: font_path rC:\Windows\Fonts\msyh.ttc # 微软雅黑 elif system Darwin: font_path /System/Library/Fonts/PingFang.ttc # 苹方 else: # Linux font_path /usr/share/fonts/truetype/wqy/wqy-microhei.ttc # 文泉驿 try: prop fm.FontProperties(fnamefont_path) plt.rcParams[font.family] prop.get_name() except Exception as e: print(f字体加载失败{e}使用默认字体) plt.rcParams[font.family] [sans-serif]2下面代码的功能是定义相机标定所需核心参数。包括棋盘格内角点数量、每格物理尺寸、相机分辨率以及手动初始化一个合理的内参矩阵 DEFAULT_K用来在模拟标定中避免内参数值爆炸和重投影误差异常。# 2. 核心参数贴合真实相机 CHESSBOARD_CORNERS (7, 5) # 内角点数量 (列,行) SQUARE_SIZE_M 0.02 # 每格实际尺寸米 IMAGE_SIZE (640, 480) # 相机分辨率 # 手动初始化合理的内参避免数值爆炸 DEFAULT_K np.array([[360, 0, 320], [0, 360, 240], [0, 0, 1]], dtypenp.float32)3下面代码的功能是生成居中棋盘图像并模拟内角点坐标。函数 generate_chessboard_image 会在白色背景上绘制黑白交替的棋盘格同时手动计算每个格子中心作为角点并标记红点保证后续标定或投影过程不会出现角点检测失败。# 3. 生成模拟棋盘图像 模拟角点居中可控 def generate_chessboard_image(img_size(640,480), cornersCHESSBOARD_CORNERS, grid_px60): 生成居中的棋盘图像模拟角点避免角点检测失败 :param img_size: 图像分辨率 :param corners: 内角点数量 (列,行) :param grid_px: 每个格子的像素尺寸 :return: 棋盘图像, 2D角点坐标 grid_rows corners[1] 1 # 格子行数 内角点行数 1 grid_cols corners[0] 1 # 格子列数 内角点列数 1 # 创建纯白背景 img np.ones((img_size[1], img_size[0], 3), np.uint8) * 255 # 计算居中起始坐标避免棋盘超出图像 start_x (img_size[0] - grid_cols * grid_px) // 2 start_y (img_size[1] - grid_rows * grid_px) // 2 # 绘制黑白交替棋盘格 for r in range(grid_rows): for c in range(grid_cols): if (r c) % 2 0: x1 start_x c * grid_px y1 start_y r * grid_px x2 x1 grid_px y2 y1 grid_px cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 0), -1) # 手动生成内角点格子中心模拟真实角点 imgpoints [] for r in range(corners[1]): for c in range(corners[0]): px start_x (c 0.5) * grid_px # 格子中心X py start_y (r 0.5) * grid_px # 格子中心Y imgpoints.append([px, py]) cv2.circle(img, (int(px), int(py)), 4, (0, 0, 255), -1) # 标记角点 imgpoints np.array(imgpoints, dtypenp.float32).reshape(-1, 1, 2) return img, imgpoints4下面代码的功能是生成3D世界坐标点和收集模拟标定数据。使用张正友标定法将棋盘内角点在世界坐标系中的位置初始化在平面 Z0然后生成三张不同角度的模拟棋盘图将对应的 3D 点和 2D 图像角点加入列表为相机标定做准备同时保留一张棋盘演示图用于可视化。# 4. 构造3D世界点张正友标定法Z0 objpoints [] # 3D世界点列表 imgpoints [] # 2D图像角点列表 chessboard_demo_img None # 生成3D基准点 objp np.zeros((np.prod(CHESSBOARD_CORNERS), 3), np.float32) objp[:, :2] np.mgrid[0:CHESSBOARD_CORNERS[0], 0:CHESSBOARD_CORNERS[1]].T.reshape(-1, 2) * SQUARE_SIZE_M # 生成3张模拟棋盘模拟机器人多角度拍摄 for i in range(3): img, imgp generate_chessboard_image(IMAGE_SIZE) objpoints.append(objp) imgpoints.append(imgp) if chessboard_demo_img is None: chessboard_demo_img img.copy() print(f第{i1}张模拟棋盘生成 ✅)5下面代码的功能是对模拟角点执行相机标定。调用 cv2.calibrateCamera传入手动初始化的内参 DEFAULT_K 和生成的 2D/3D点得到相机内参矩阵 K、畸变系数以及旋转和平移向量。随后计算平均重投影误差用于评估标定精度并输出标定结果用于演示。# 5. 相机标定优化内参避免数值异常 # 手动初始化内参提升标定合理性 ret, K, dist, rvecs, tvecs cv2.calibrateCamera( objpoints, imgpoints, IMAGE_SIZE, DEFAULT_K, None # 传入初始内参 ) # 计算重投影误差评估标定精度 total_error 0 for i in range(len(objpoints)): proj_points, _ cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], K, dist) error cv2.norm(imgpoints[i], proj_points, cv2.NORM_L2) / len(proj_points) total_error error mean_error total_error / len(objpoints) # 输出标定结果 print(\n 人形机器人相机标定结果 ) print(f有效标定图像数{len(objpoints)}) print(f内参矩阵 K\n{np.round(K, 2)}) print(f畸变系数 [k1,k2,p1,p2,k3]\n{np.round(dist[0], 4) if dist is not None else 无}) print(f平均重投影误差{mean_error:.4f} 像素理想0.5像素)6下面代码的功能是生成测试图像并模拟镜头畸变与矫正。创建白色背景的机器人抓取目标图例如水杯通过 PIL 绘制中文文字避免 OpenCV 中文乱码然后利用 cv2.undistort 反向处理模拟畸变生成带畸变图像再通过正向 undistort 得到矫正后的图像用于展示畸变矫正效果。# 6. 畸变模拟 矫正核心演示环节 # 生成测试图像机器人抓取目标水杯 test_img np.ones((IMAGE_SIZE[1], IMAGE_SIZE[0], 3), np.uint8) * 255 # 用PIL绘制中文解决OpenCV中文乱码 try: pil_img Image.fromarray(test_img) draw ImageDraw.Draw(pil_img) font ImageFont.truetype(font_path, 20) draw.text((220, 250), 抓取目标水杯, fontfont, fill(0, 255, 0)) test_img np.array(pil_img) except Exception as e: print(f中文绘制失败{e}使用英文) cv2.putText(test_img, Grasp Target (Cup), (220, 250), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) # 模拟镜头畸变反向调用undistort生成带畸变的图像 def add_distortion(img, K, dist): 模拟相机畸变演示用 return cv2.undistort(img, K, -dist) # 负畸变系数 添加畸变 distorted_img add_distortion(test_img, K, dist) # 带畸变的图像 corrected_img cv2.undistort(distorted_img, K, dist) # 矫正后的图像7下面代码的功能是将3D世界坐标投影到2D图像平面。给定目标的 3D 坐标如抓取物体在机器人坐标系中的位置使用标定得到的旋转、平移和内参矩阵进行投影得到图像上的像素位置。随后在矫正后的图像上标记投影点并用 PIL 绘制中文标签“3D目标投影点”展示3D→2D投影效果。# 7. 3D→2D投影相机模型核心 # 模拟抓取目标的3D世界坐标x0.2m, y0.1m, z0.6m target_3d np.array([[0.2, 0.1, 0.6]], dtypenp.float32) # 3D坐标投影到2D图像平面 target_2d, _ cv2.projectPoints(target_3d, rvecs[0], tvecs[0], K, dist) target_2d target_2d.squeeze().astype(int) # 在矫正图上标记投影点 cv2.circle(corrected_img, (target_2d[0], target_2d[1]), 8, (0, 0, 255), -1) try: pil_corrected Image.fromarray(corrected_img) draw2 ImageDraw.Draw(pil_corrected) font2 ImageFont.truetype(font_path, 15) draw2.text((target_2d[0]10, target_2d[1]), 3D目标投影点, fontfont2, fill(0, 0, 255)) corrected_img np.array(pil_corrected) except: cv2.putText(corrected_img, 3D Target Proj, (target_2d[0]10, target_2d[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 1)8下面代码的功能是将标定与投影结果可视化。创建2´2子图布局左上显示棋盘格和角点标记右上显示带畸变的抓取目标左下显示矫正后图像及3D投影点右下展示内参矩阵、畸变系数和平均重投影误差。所有文字均使用中文字体配置保证可读性最终形成完整标定与投影演示界面。# 8. 可视化展示4个子图对比清晰 fig, axes plt.subplots(2, 2, figsize(14, 10)) title_font {family: plt.rcParams[font.family], size: 12, weight: bold} text_font {family: plt.rcParams[font.family], size: 10} # 总标题 fig.suptitle( 人形机器人视觉系统 - 相机标定与畸变矫正, **title_font) # 子图1棋盘格角点 axes[0,0].imshow(cv2.cvtColor(chessboard_demo_img, cv2.COLOR_BGR2RGB)) axes[0,0].set_title(1. 标定棋盘 内角点标记, **title_font) axes[0,0].axis(off) # 子图2带畸变的测试目标 axes[0,1].imshow(cv2.cvtColor(distorted_img, cv2.COLOR_BGR2RGB)) axes[0,1].set_title(2. 带畸变的抓取目标模拟真实相机, **title_font) axes[0,1].axis(off) # 子图3矫正后3D投影点 axes[1,0].imshow(cv2.cvtColor(corrected_img, cv2.COLOR_BGR2RGB)) axes[1,0].set_title(3. 畸变矫正后 3D目标投影点, **title_font) axes[1,0].axis(off) # 子图4标定参数展示 axes[1,1].axis(off) axes[1,1].set_title(4. 标定参数与精度, **title_font) K_str \n.join([ .join([f{num:.2f} for num in row]) for row in K]) dist_str , .join([f{d:.4f} for d in dist[0]]) if dist is not None else 无 axes[1,1].text(0.05, 0.95, 核心标定结果, **title_font) axes[1,1].text(0.05, 0.80, f内参矩阵 K\n{K_str}, **text_font) axes[1,1].text(0.05, 0.45, f畸变系数\n[{dist_str}], **text_font) axes[1,1].text(0.05, 0.25, f平均重投影误差{mean_error:.4f} 像素, **text_font) plt.tight_layout() plt.show()执行后通过4张子图可视化呈现棋盘标定、畸变效果、矫正结果及核心参数如图3-1所示直观展现了人形机器人视觉感知中相机模型的应用逻辑鲁棒性强且易理解。图3-1 可视化图