Python 如何获取用于校准摄像机的摄像机矩阵
我使用的是acA4112-30uc-Basler ace相机。我试图消除失真,但为了做到这一点,我必须获得“mtx”参数,我不知道如何获得该参数。使用OPENCV进行相机校准的理论如下: 首先你需要修理照相机。然后打印棋盘 A部分:拍摄图像并进行计算 印刷后,把它放在一本书上。然后使用以下代码通过相机拍摄一些图像:Python 如何获取用于校准摄像机的摄像机矩阵,python,opencv,Python,Opencv,我使用的是acA4112-30uc-Basler ace相机。我试图消除失真,但为了做到这一点,我必须获得“mtx”参数,我不知道如何获得该参数。使用OPENCV进行相机校准的理论如下: 首先你需要修理照相机。然后打印棋盘 A部分:拍摄图像并进行计算 印刷后,把它放在一本书上。然后使用以下代码通过相机拍摄一些图像: import numpy as np import cv2 objp = np.zeros((6 * 7, 3), np.float32) objp[ : , : 2] = np.
import numpy as np
import cv2
objp = np.zeros((6 * 7, 3), np.float32)
objp[ : , : 2] = np.mgrid[0 : 7, 0 : 6].T.reshape(-1, 2)
objpoints = []
imgpoints = []
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
cam = cv2.VideoCapture(0)
(w, h) = (int(cam.get(4)), int(cam.get(3)))
while(True):
_ , frame = cam.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (7, 6), None)
if ret == True:
objpoints.append(objp)
corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
imgpoints.append(corners)
cv2.drawChessboardCorners(frame, (7, 6), corners, ret)
cv2.imshow('Find Chessboard', frame)
cv2.waitKey(0)
cv2.imshow('Find Chessboard', frame)
print "Number of chess boards find:", len(imgpoints)
if cv2.waitKey(1) == 27:
break
ret, oldMtx, coef, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints,
gray.shape[: : -1], None, None)
newMtx, roi = cv2.getOptimalNewCameraMatrix(oldMtx, coef, (w, h), 1, (w, h))
print "Original Camera Matrix:\n", oldMtx
print "Optimal Camera Matrix:\n", newMtx
np.save("Original camera matrix", oldMtx)
np.save("Distortion coefficients", coef)
np.save("Optimal camera matrix", newMtx)
cam.release()
cv2.destroyAllWindows()
在这段代码中,您打开相机并将打印的棋盘放在多个位置,对用于矩阵计算的棋盘进行编码检测。每次代码检测棋盘显示图像并打印检测到的图像数。在一些图像之后,可以按Esc键完成计算
第B部分:使用矩阵校正摄像机输出
您可以将此代码用于测试:
import numpy as np
import cv2
oldMtx = np.load("Original camera matrix.npy")
coef = np.load("Distortion coefficients.npy")
newMtx = np.load("Optimal camera matrix.npy")
cam = cv2.VideoCapture(0)
(w, h) = (int(cam.get(4)), int(cam.get(3)))
while(True):
_ , frame = cam.read()
undis = cv2.undistort(frame, oldMtx, coef, newMtx)
cv2.imshow("Original vs Undistortion", np.hstack([frame, undis]))
key = cv2.waitKey(1)
if key == 27:
break
cam.release()
cv2.destroyAllWindows()
祝你好运