提问 文心一言:
OPENCV+PYTHON 棋盘格的函数
答案:
在 OpenCV 和 Python 中,棋盘格(Chessboard)常用于相机标定(Camera Calibration)中,因为它提供了一种已知图案,用于计算相机的内部参数和外部参数。棋盘格图案通常由交替的黑白方块组成。
以下是一些常用的与棋盘格相关的函数和步骤:
- 生成棋盘格图像:
虽然通常使用预打印的棋盘格图案,但你也可以使用 OpenCV 生成一个棋盘格图像。
import cv2 import numpy as npdef generate_chessboard(squares_per_row, squares_per_col, square_size):# 棋盘格的大小rows = squares_per_row + 1cols = squares_per_col + 1# 创建一个空白图像img = np.ones((rows * square_size, cols * square_size, 3), dtype=np.uint8) * 255for i in range(squares_per_row + 1):for j in range(squares_per_col + 1):if (i + j) % 2 == 0:# 填充黑色方块 cv2.rectangle(img, (j * square_size, i * square_size), ((j + 1) * square_size, (i + 1) * square_size), 0, -1)return img
# 生成一个8x11 棋盘格(棋盘格的大小:内部角点的数量),每个方块大小为 50 像素
# 即生成一个有9x12 方格 的棋盘格(棋盘格的大小:方块的数量),每个方块大小为 50 像素
chessboard_img = generate_chessboard(8, 11, 50)
cv2.waitKey(0) cv2.destroyAllWindows()
- 找到棋盘格角点:
使用cv2.findChessboardCorners
函数来检测棋盘格的角点。
import cv2# 棋盘格的大小 (内部角点的数量) chessboard_size = (8, 11)# 读取棋盘格图像 img = cv2.imread('chessboard.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 找到棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)# 如果找到角点,则绘制并显示它们 if ret:img = cv2.drawChessboardCorners(img, chessboard_size, corners, ret)cv2.imshow('Chessboard Corners', img)cv2.waitKey(0)cv2.destroyAllWindows() else:print("Chessboard corners not found")
- 相机标定:
使用cv2.calibrateCamera
函数进行相机标定。这需要使用多张从不同角度拍摄的棋盘格图像。
import cv2 import numpy as np import glob# 棋盘格的大小 (内部角点的数量) chessboard_size = (8, 6)# 准备对象点 (例如 (0,0,0), (1,0,0), (2,0,0), ....,(7,5,0)) objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)# 存储所有图像的对象点和图像点 objpoints = [] # 3d 点在真实世界空间 imgpoints = [] # 2d 点在图像平面# 读取所有棋盘格图像 images = glob.glob('chessboard_images/*.jpg')for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 找到棋盘格角点ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)# 如果找到角点,则添加对象点和图像点if ret:objpoints.append(objp)imgpoints.append(corners)# 标定相机 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)print("相机矩阵:\n", mtx) print("畸变系数:\n", dist)
以上代码展示了如何生成棋盘格图像、检测棋盘格角点以及进行相机标定。注意,相机标定通常需要多张从不同角度拍摄的棋盘格图像,因此请确保你有足够的图像来进行标定。
提问:如何校正原图像
import cv2 import numpy as np# 假设你已经通过cv2.calibrateCamera得到了mtx和dist # mtx是相机内参矩阵,dist是畸变系数 # img是你想要校正的原图像# 读取图像(这里以灰度图像为例,但也可以是彩色图像) img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE) # 如果是彩色图像,使用cv2.IMREAD_COLOR # img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_COLOR)# 使用cv2.undistort函数校正图像 # 注意:如果img是彩色图像,你需要将每个通道分别校正,但OpenCV通常会自动处理这一点 undistorted_img = cv2.undistort(img, mtx, dist)# 显示校正前后的图像 cv2.imshow('Original Image', img) cv2.imshow('Undistorted Image', undistorted_img) cv2.waitKey(0) cv2.destroyAllWindows()# 保存校正后的图像(可选) cv2.imwrite('undistorted_image.jpg', undistorted_img)