RGB相机棋盘格角点检测

测试环境

相机 D435
python 3.9
win11

代码

点击查看代码
import pyrealsense2 as rs
import numpy as np
import cv2

# ==================== 配置参数 ====================
# 棋盘格规格
CHECKERBOARD = (11, 8)  # 内角点数量:(列数, 行数)

# RealSense 配置
WIDTH, HEIGHT = 1280, 720
FPS = 30

# 角点优化参数
SUBPIX_WINDOW = (11, 11)
SUBPIX_ZERO_ZONE = (-1, -1)
MAX_ITER = 30
EPSILON = 0.001


# ===============================================

def main():
    # 初始化 RealSense 管道
    pipeline = rs.pipeline()
    config = rs.config()
    config.enable_stream(rs.stream.color, WIDTH, HEIGHT, rs.format.bgr8, FPS)

    try:
        # 启动相机
        pipeline.start(config)
        print("按 'ESC' 或 'q' 退出")

        # 亚像素优化终止条件
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, MAX_ITER, EPSILON)

        while True:
            # 获取一帧
            frames = pipeline.wait_for_frames()
            color_frame = frames.get_color_frame()

            if not color_frame:
                continue

            # 转换为 numpy 数组
            frame = np.asanyarray(color_frame.get_data())
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

            # 尝试检测棋盘格
            ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)

            if ret:
                # 亚像素级角点优化
                corners_sub = cv2.cornerSubPix(gray, corners, SUBPIX_WINDOW, SUBPIX_ZERO_ZONE, criteria)

                # 绘制角点(绿色)
                cv2.drawChessboardCorners(frame, CHECKERBOARD, corners_sub, ret)

                # 可选:在角点处绘制编号(调试用)
                # for i, corner in enumerate(corners_sub):
                #     x, y = int(corner[0][0]), int(corner[0][1])
                #     cv2.putText(frame, str(i), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 0, 0), 1)

                # 添加状态提示
                cv2.putText(frame, "Chessboard Detected!", (10, 30),
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
            else:
                cv2.putText(frame, "No Chessboard", (10, 30),
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

            # 显示结果
            cv2.imshow('D435 Chessboard Detection', frame)

            # 退出条件
            key = cv2.waitKey(1) & 0xFF
            if key == 27 or key == ord('q'):  # ESC 或 q
                break

    finally:
        # 清理资源
        pipeline.stop()
        cv2.destroyAllWindows()
        print("程序已退出")


if __name__ == "__main__":
    main()

测试效果

c3e8ede8-30df-4edd-9996-9d992ca19172

posted on 2026-05-19 21:15  fmix  阅读(7)  评论(0)    收藏  举报

导航