机器视觉抓取基础YOLO 目标检测 手眼标定完整流程机械臂想抓东西光有手不行还得有眼和脑子——这篇帮你打通从像素到抓取的整条链路。一、机械臂抓取的视觉需求抓什么在哪里让机械臂完成一次抓取任务核心要回答两个问题抓什么——桌上是苹果还是螺丝红色杯子还是蓝色盒子这需要目标检测。在哪里——物体在图像中的像素坐标u, v如何映射到机械臂工作空间中的物理坐标x, y, z这需要坐标标定。没有检测机械臂不知道目标没有标定机械臂不知道往哪伸手。两者缺一不可。二、YOLO 目标检测在机械臂中的作用YOLOYou Only Look Once是目标检测领域的经典算法它的核心输出是类别标签class告诉你是杯子“苹果”“扳手”边界框bounding box给出物体在图像中的矩形区域 (x_center, y_center, width, height)对机械臂来说边界框的中心点就是物体的像素级粗定位再配合深度相机或标定转换就能得到三维物理坐标——这就是看见→定位→抓取的第一步。三、YOLO 原理速览单阶段检测、网格划分、Anchor Box面向小白用最通俗的方式理解 YOLO 的工作方式3.1 单阶段检测 vs 两阶段检测传统两阶段方法如 Faster R-CNN先找候选区域再分类判别慢但精准。YOLO 是单阶段——一张图进去直接输出所有检测结果一步到位速度飞快。对机械臂这种需要实时响应的场景YOLO 是首选。3.2 网格划分YOLO 把输入图像划分成 S×S 的网格比如 13×13。如果某个物体的中心落在某个网格单元内该网格就负责检测这个物体。每个网格预测若干个边界框及其置信度。3.3 Anchor Box不同物体形状各异——杯子瘦高盒子扁平。Anchor Box 是预设的一组参考框代表常见形状比例。每个网格基于 Anchor Box 做偏移预测从而适应各种形状的目标不用从头瞎猜。四、YOLO 版本选择嵌入式端部署对比特性YOLOv5YOLOv8检测精度优秀更优anchor-free设计推理速度快更快模型结构优化模型大小小nano版~4MB小nano版~6MB训练门槛低生态成熟低ultralytics统一API嵌入式部署生态完善教程多新一代首选后处理更简洁推荐新项目直接用YOLOv8ultralytics 库一行代码即可推理后处理不需要手动解析anchor部署更省心。老项目维护用 YOLOv5 也完全够用。五、RK3588 NPU 加速推理模型转换→rknn→NPU执行RK3588 内置 6TOPS NPU推理 YOLO 模型的流程YOLOv8 训练 (.pt) ↓ 导出 ONNX ONNX 模型 (.onnx) ↓ rknn-toolkit2 转换 RKNN 模型 (.rknn) ↓ NPU 推理 检测结果输出关键步骤导出 ONNXyolo export modelyolov8n.pt formatonnx转换 RKNN用rknn-toolkit2配置量化精度INT8/FP16生成.rknn文件NPU 推理通过 RKNN Runtime C API 或 Python API 加载模型输入图像输出检测框注意NPU 对算子支持有限部分 YOLOv8 后处理算子如 NMS可能需要在 CPU 上补齐需手动拆分模型。六、像素坐标到物理坐标的转换为什么需要标定图像上的像素坐标 (u, v) 是屏幕坐标机械臂需要的是世界坐标 (x, y, z) mm。中间的桥梁就是相机标定——建立像素→物理的映射关系。没有标定像素坐标就是一组没有物理意义的数字。七、相机内参标定焦距与畸变系数7.1 内参是什么相机内参描述的是镜头本身的几何特性焦距(fx, fy)像素/毫米比例决定成像缩放畸变系数(k1, k2, p1, p2…)镜头不是理想透镜图像会有桶形/枕形畸变7.2 棋盘格标定法最经典的标定方法打印一张棋盘格标定板如 9×6格子 25mm从不同角度拍 15~30 张标定板照片OpenCVcalibrateCamera()自动提取角点计算内参畸变系数之后用undistort()校正所有图像消除畸变importcv2importnumpyasnpimportglob# 棋盘格参数CHESS_ROWS9CHESS_COLS6SQUARE_SIZE25# mmobj_points[]# 3D 世界坐标img_points[]# 2D 图像坐标objpnp.zeros((CHESS_ROWS*CHESS_COLS,3),np.float32)objp[:,:2]np.mgrid[0:CHESS_ROWS,0:CHESS_COLS].T.reshape(-1,2)*SQUARE_SIZE imagesglob.glob(calib_images/*.jpg)forfnameinimages:imgcv2.imread(fname)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret,cornerscv2.findChessboardCorners(gray,(CHESS_ROWS,CHESS_COLS),None)ifret:obj_points.append(objp)corners2cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPScv2.TERM_CRITERIA_MAX_ITER,30,0.001))img_points.append(corners2)# 标定ret,mtx,dist,rvecs,tvecscv2.calibrateCamera(obj_points,img_points,gray.shape[::-1],None,None)print(内参矩阵:\n,mtx)print(畸变系数:\n,dist)八、手眼标定概念相机与机械臂坐标系的关系手眼标定的目标是求解相机坐标系与机械臂基座坐标系之间的变换矩阵。有了这个矩阵就能把相机检测到的像素坐标→转换到相机3D坐标→再转换到机械臂坐标系→机械臂就知道往哪动了。具体方案分两种下一篇详细实战眼在手上、眼在手外。这里先理解概念——手眼标定就是在解一个坐标系之间的翻译字典。九、完整视觉抓取流程图摄像头采集图像 ↓ 去畸变处理内参校正 ↓ YOLO 目标检测 → 类别 像素边界框 ↓ 提取物体中心像素坐标 (u, v) ↓ 深度相机获取距离 z或用内参已知物体尺寸反算 ↓ 像素→相机3D坐标内参反投影 ↓ 相机3D→机械臂坐标手眼标定矩阵 ↓ 逆运动学求解 → 6个关节角度 ↓ 机械臂运动执行抓取十、代码示例YOLOv8 检测 输出物体中心坐标fromultralyticsimportYOLOimportcv2# 加载模型modelYOLO(yolov8n.pt)# 采集图像capcv2.VideoCapture(0)ret,framecap.read()# YOLO 检测resultsmodel(frame)# 提取检测结果forresultinresults:boxesresult.boxesforboxinboxes:cls_idint(box.cls[0])cls_namemodel.names[cls_id]# 边界框 [x_center, y_center, width, height]像素坐标x_c,y_c,w,hbox.xywh[0].tolist()print(f检测到:{cls_name}, 中心像素坐标: ({x_c:.1f},{y_c:.1f}))# 显示结果annotatedresults[0].plot()cv2.imshow(YOLO Detection,annotated)cv2.waitKey(0)cap.release()十一、嵌入式部署性能数据参考平台模型量化推理耗时FPSRK3588 NPUYOLOv5sINT8~20ms~50RK3588 NPUYOLOv8nINT8~15ms~65RK3588 CPUYOLOv8nFP32~200ms~5Jetson NanoYOLOv5sFP16~60ms~16x86 GPU (1060)YOLOv8sFP32~8ms~125可以看出NPU INT8 量化后推理速度飙升 10 倍以上这是嵌入式端能跑实时检测的关键。本篇梳理了从 YOLO 检测到手眼标定的完整理论基础。下一篇直接上手实战——眼在手上和眼在手外两种标定方案的代码实现。