写一个基于python的棋盘格标定板角点的提取代码,不使用opencv的棋盘格角点提取函数
时间: 2023-02-18 22:48:32 浏览: 71
:
import numpy as np
def get_corners(img):
# Get image height and width
h, w = img.shape[:2]
# Create an empty array to store the corners
corners = np.zeros((4,2), dtype=np.float32)
# Find the four corners by searching the image
for i in range(0, 4):
for j in range(0, w):
for k in range(0, h):
if img[k, j] == i:
corners[i] = (j, k)
break
return corners
相关问题
python实现相机标定后输出中间棋盘格的4个角点坐标
好的,您可以使用OpenCV中的函数来进行相机标定和棋盘格角点检测,并输出中间棋盘格的4个角点坐标。以下是一个示例代码:
```python
import cv2
import numpy as np
# 读取棋盘格图片
img = cv2.imread('chessboard.jpg')
# 定义棋盘格尺寸
pattern_size = (5, 7)
# 寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(img, pattern_size)
if ret:
# 绘制棋盘格角点
cv2.drawChessboardCorners(img, pattern_size, corners, ret)
# 进行相机标定
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
objpoints = []
imgpoints = []
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, pattern_size)
if ret:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
imgpoints.append(corners2)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 输出中间棋盘格的4个角点坐标
if ret:
x, y, w, h = cv2.boundingRect(corners2)
mid_x = int(x + w / 2)
mid_y = int(y + h / 2)
corners_2d = np.array([[mid_x - 20, mid_y - 20],
[mid_x - 20, mid_y + 20],
[mid_x + 20, mid_y - 20],
[mid_x + 20, mid_y + 20]], dtype=np.float32)
corners_2d = cv2.undistortPoints(corners_2d, mtx, dist)
print(corners_2d)
# 显示图片
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
else:
print('未找到棋盘格角点')
```
在代码中,我们首先使用`cv2.findChessboardCorners()`函数来寻找棋盘格角点,并使用`cv2.drawChessboardCorners()`函数在原图上绘制角点。然后使用`cv2.calibrateCamera()`函数进行相机标定,并输出中间棋盘格的4个角点坐标。最后使用`cv2.imshow()`函数显示图片,并使用`cv2.waitKey()`和`cv2.destroyAllWindows()`函数等待按键关闭窗口。
python进行相机标定后输出中间棋盘格四角点坐标
进行相机标定后,我们可以使用OpenCV库中的cv2.calibrateCamera()函数得到相机内部参数矩阵和畸变系数,以及每张图片中棋盘格四角点的坐标。以下是一个简单的Python代码示例:
```python
import cv2
import numpy as np
# 定义棋盘格大小
pattern_size = (9, 6)
# 定义每个棋盘格的边长
square_size = 2.5
# 读入棋盘格图片
img = cv2.imread('chessboard.jpg')
# 将图片转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 找到棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size)
# 计算相机内部参数矩阵和畸变系数
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera([corners], [np.zeros_like(corners)], gray.shape[::-1], None, None)
# 输出相机内部参数矩阵和畸变系数
print("Camera Matrix:")
print(mtx)
print("Distortion Coefficients:")
print(dist)
# 输出每张图片中棋盘格四角点的坐标
print("Corners of Chessboard:")
print(corners)
```
在这个例子中,我们首先定义了棋盘格的大小和每个棋盘格的边长。然后,我们读入一张棋盘格图片,将其转为灰度图,使用cv2.findChessboardCorners()函数找到棋盘格角点,并使用cv2.calibrateCamera()函数计算相机内部参数矩阵和畸变系数。最后,我们输出相机内部参数矩阵和畸变系数,以及每张图片中棋盘格四角点的坐标。
注意,corners的格式是一个Nx1x2的数组,其中N是角点的个数,每个角点由一个2维坐标表示。如果想要输出每个角点的坐标,可以使用以下代码:
```python
for corner in corners:
print(corner[0])
```
这样就可以输出每个角点的x和y坐标了。