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()
测试效果

浙公网安备 33010602011771号