如何提升MP4视频中ArUco标记跟踪效果,补全运动时丢失的坐标数据
问题解答
放慢视频播放速度或降低OpenCV处理速度无法找回丢失的点位。你录制的视频已经是固定40FPS的序列,所有帧的图像信息在录制完成时就已经确定,处理速度的快慢不会改变单帧的图像内容,丢点的本质是对应帧中的末端ArUco标记无法被算法检测,和处理速度没有关联。
可落地的优化方案
1. 调整图像预处理逻辑
你当前代码中对输入图像直接执行了5x5核的膨胀操作,对于运动模糊的ArUco标记而言,膨胀会破坏标记的黑白边界特征,反而降低检出率。可以做如下调整:
- 先移除膨胀操作测试检出率是否提升
- 替换为锐化预处理,降低运动模糊的影响,示例预处理代码:
# 拉普拉斯锐化示例 kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) im = cv.filter2D(im, -1, kernel)
2. 优化ArUco检测参数
你可以调整检测参数PARAM的阈值,降低检测要求,同时利用返回的rejectedCandidates候选列表做二次校验,很多未被正式检出的标记都会存在于该列表中:
- 调低
adaptiveThreshConstant自适应阈值的常量偏移 - 降低
polygonalApproxAccuracyRate多边形拟合的精度要求 - 调低
minMarkerPerimeterRate最小标记周长比例,适配运动中边缘变形的标记
3. 丢失点位补全
因为你的机器人运动轨迹是平滑弧形,就算存在少量丢点,也可以通过插值方式补全,推荐使用三次样条插值分别对x、y、z三个维度做拟合,插值后的坐标误差远小于ArUco本身的检测误差。
4. 源头优化(如果可重新录制实验)
如果可以重新做实验录制视频,可以提高相机的快门速度,减少单帧曝光时间,从源头降低运动模糊的出现概率,大幅提升标记检出率。
参考动图

位姿检测参考代码
kernel = np.ones((5,5), np.uint8) def get_aruco_pose(im): global rvec, tvec im = cv.dilate(im, kernel, iterations=1) corners, ids, rejectedCandidates = cv.aruco.detectMarkers(im, DICT, parameters=PARAM) transf = None if len(corners) > 0: # 展平ArUco ID列表 ids = ids.flatten() # 遍历检测到的ArUco角点 for (markerCorner, markerID) in zip(corners, ids): rvec, tvec, _ = cv.aruco.estimatePoseSingleMarkers(markerCorner, ARUCO_LENGTH_MM, CAMERA_MATRIX, DIST_COEFF) # 绘制ArUco标记 show_aruco(im, markerCorner, markerID) # 取消注释可在视频中显示标记 rmat, _ = cv.Rodrigues(rvec) tvec = tvec.reshape(3, 1) transf = np.concatenate((rmat, tvec), axis = 1) if markerID == 3: tvec_bs.append(tvec) if markerID == 4: tvec_fs.append(tvec) return tvec
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

