ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera([objp],[corners1],[gray1.shape[::-1]],None,None)含义
时间: 2024-06-02 20:13:49 浏览: 146
该代码行使用cv2.calibrateCamera函数进行相机标定。其中:
- objp:是3D空间中的对象点,是一个numpy数组,每个对象点都是一个[x, y, z]的坐标。
- corners1:是图像中的角点,是一个numpy数组,每个角点都是一个[x, y]的坐标。
- gray1.shape[::-1]:是图像的大小(宽度和高度),用一个元组表示,这里使用[::-1]可以将其倒转,使其符合cv2.calibrateCamera函数的要求。
- None:表示没有使用任何标定参数。
- None:表示没有使用任何标定标志。
函数的返回值为ret、mtx、dist、rvecs、tvecs。
- ret:表示标定的误差(重投影误差)。
- mtx:表示相机的内部参数矩阵。
- dist:表示相机的畸变系数。
- rvecs:表示每个图像的旋转向量。
- tvecs:表示每个图像的平移向量。
相关问题
import cv2 import numpy as np chessboard_size = (9,6) # 棋盘格行列数 objp = np.zeros((np.prod(chessboard_size), 3), np.float32) # 内部点的坐标 objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) img = cv2.imread('C:/yingxiang/biaoding.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None) if ret == True: cv2.drawChessboardCorners(img, chessboard_size, corners, ret) ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera([objp], [corners], gray.shape[::-1], None, None) # 打印相机内部参数和畸变系数 print("相机内部参数:") print(mtx) print("畸变系数:") print(dist) # 打印外部参数 print("旋转向量:") print(rvecs) print("平移向量:") print(tvecs)这段代码怎么改可以打印成正常数字形式
可以使用NumPy的set_printoptions()函数来设置打印选项,将结果打印成正常数字形式。可以将代码修改如下:
```python
import cv2
import numpy as np
chessboard_size = (9, 6) # 棋盘格行列数
objp = np.zeros((np.prod(chessboard_size), 3), np.float32) # 内部点的坐标
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
img = cv2.imread('C:/yingxiang/biaoding.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
if ret == True:
cv2.drawChessboardCorners(img, chessboard_size, corners, ret)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera([objp], [corners], gray.shape[::-1], None, None)
# 打印相机内部参数和畸变系数
print("相机内部参数:")
np.set_printoptions(precision=4, suppress=True)
print(mtx)
print("畸变系数:")
np.set_printoptions(precision=4, suppress=True)
print(dist)
# 打印外部参数
print("旋转向量:")
np.set_printoptions(precision=4, suppress=True)
print(rvecs)
print("平移向量:")
np.set_printoptions(precision=4, suppress=True)
print(tvecs)
```
这里使用了np.set_printoptions()函数来设置打印选项,将精度设置为4位小数,并将科学计数法关闭。这样打印出来的结果就会是正常数字形式。
images= glob.glob('./image/*.jpg') # print(images) for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Find the chess board corners # If desired number of corners are found in the image then ret = true ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE) """ If desired number of corner are detected, we refine the pixel coordinates and display them on the images of checker board """ if ret == True: objpoints.append(objp) # refining pixel coordinates for given 2d points. corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) imgpoints.append(corners2) # Draw and display the corners img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret) # cv2.imshow('img',img) # cv2.waitKey(0) cv2.destroyAllWindows() # h, w = np.array(img).shape[:2] h, w = img.shape[:2] """ Performing camera calibration by passing the value of known 3D points (objpoints) and corresponding pixel coordinates of the detected corners (imgpoints) """ ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) print("Camera matrix : \n") print(mtx) print("dist : \n") print(dist) print("rvecs : \n") print(rvecs) print("tvecs : \n") print(tvecs)这段代码有错误,请帮我找出来
这段代码存在一些错误,可能会导致出现你之前提到的错误。我列出了一些可能的问题:
1. 代码中没有定义CHECKERBOARD变量,需要在代码中加入如下语句定义CHECKERBOARD:
CHECKERBOARD = (6, 9)
2. 代码中没有定义objp变量,需要在代码中加入如下语句定义objp:
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
3. 可能存在一些图像无法找到所有的角点,导致ret为False。可以在代码中加入如下语句,跳过这些无法找到所有角点的图像:
if ret == False:
continue
4. 在调用calibrateCamera函数时,输入的第三个参数应该是图像的大小,而不是灰度图像的大小。可以将代码中的gray.shape[::-1]修改为img.shape[:2]。
修改后的代码如下所示:
```python
import numpy as np
import cv2
import glob
CHECKERBOARD = (6, 9)
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
objpoints = []
imgpoints = []
images = glob.glob('./image/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH +
cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
imgpoints.append(corners2)
img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
h, w = img.shape[:2]
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (w, h), None, None)
print("Camera matrix : \n")
print(mtx)
print("dist : \n")
print(dist)
print("rvecs : \n")
print(rvecs)
print("tvecs : \n")
print(tvecs)
```
希望以上修改可以帮到你,如果还有其他问题,可以随时问我。
阅读全文