首先放上代码,其中一些注释DL们可以忽略:
import cv2 as cv
import sys
import numpy as np
def compute_points(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
board_size = (9, 6)
_, points = cv.findChessboardCorners(gray, board_size)
_, points = cv.find4QuadCornerSubpix(gray, points, (5, 5))
# image = cv.drawChessboardCorners(img, board_size, points, True)
# cv.imshow("coner", image)
return points
if __name__ == '__main__':
obj_points = np.zeros((54, 3), np.float32)
obj_points[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)
obj_points = np.reshape(obj_points, (54, 1, 3))
# print(obj_points)
all_obj_points = []
all_points = []
for i in range(1, 6):
image = cv.imread("screen ({}).jpg" .format(i))
if image is None:
print("Failed to read 1")
sys.exit()
h, w = image.shape[:2]
all_obj_points.append(obj_points) # 三维坐标,世界坐标
all_points.append(compute_points(image))
_, cameraMatrix, distCoeffs, rvecs, tvecs = cv.calibrateCamera(all_obj_points, all_points, (w, h), None, None)
# print("内参矩阵:\n{}" .format(cameraMatirx))
# print("畸变系数:\n{}" .format(distCoeffs))
# print("旋转向量:\n{}" .format(rvecs))
# print("平移向量:\n{}" .format(tvecs))
for i in range(1, 6):
img = cv.imread("screen ({}).jpg" .format(i))
if img is None:
print("Failed to read")
sys.exit()
h, w = img.shape[:2]
# result = cv.undistort(img, cameraMatirx, distCoeffs, newCameraMatrix=None)
map1, map2 = cv.initUndistortRectifyMap(cameraMatrix, distCoeffs, None, None, (w, h), 5)
result = cv.remap(img, map1, map2, cv.INTER_LINEAR)
cv.imshow("origin_{}" .format(i), img)
cv.imshow("result_{}" .format(i), result)
# cv.imwrite('F:/images/result{}.jpg'.format(i),result)
k = cv.waitKey(0)
if k == 13:
cv.destroyAllWindows()
else:
sys.exit()
然后是结果图片:
这是第一张的原始图
这是对应矫正之后的图片
这是第二张
它的矫正图
第三张
第三张的矫正图
第四张
矫正的图
第五张
第五张的矫正图
它的结果都是反而变成了一个标准的桶形畸变图了。。
qwq,DL的帮助!