建设银行大连分行网站网站建设流程六个步骤
建设银行大连分行网站,网站建设流程六个步骤,php做网站需要后台吗,东莞网站建设是什么意思3.1.3 实战演练#xff1a;人形机器人的相机标定与畸变矫正请看下面的实例#xff0c;聚焦于人形机器人视觉系统核心应用#xff0c;完整演示了相机标定与畸变矫正的全流程。在实例中通过模拟生成居中棋盘格图像与精准内角点#xff0c;基于张正友标定法求解相机内参矩阵和…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 可视化图3.2 目标检测与分类