Python+;OpenCV+;网络摄像头校准:不';无法检测完整模式

Python+;OpenCV+;网络摄像头校准:不';无法检测完整模式,python,opencv,camera-calibration,Python,Opencv,Camera Calibration,我正在尝试对笔记本电脑屏幕的照片进行不失真处理,以了解opencv+python的相机校准和不失真处理是如何工作的 基于我从一张屏幕上有受控内容的照片中获得的相机矩阵,我希望不干扰后续图像。 相机和显示器都不会移动,所以我想我只需要一张图像进行校准(或者这个假设已经完全错误了?) 我的第一张有受控内容的图片是这个24x13棋盘。相机的失真在照片的各个角落都清晰可见: 这是我用于校准和不失真的脚本: import numpy as np import cv2 img = cv2.imread(

我正在尝试对笔记本电脑屏幕的照片进行不失真处理,以了解opencv+python的相机校准和不失真处理是如何工作的

基于我从一张屏幕上有受控内容的照片中获得的相机矩阵,我希望不干扰后续图像。 相机和显示器都不会移动,所以我想我只需要一张图像进行校准(或者这个假设已经完全错误了?)

我的第一张有受控内容的图片是这个24x13棋盘。相机的失真在照片的各个角落都清晰可见:

这是我用于校准和不失真的脚本:

import numpy as np
import cv2

img = cv2.imread("img.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

def chessboard_objectpoints(boxes_x, boxes_y):
    objp = np.zeros(((boxes_x - 1) * (boxes_y - 1), 3), np.float32)
    objp[:, :2] = np.mgrid[0:boxes_x-1, 0:boxes_y-1].T.reshape(-1, 2)
    return objp

def chessboard_imagepoints(img_gray, boxes_x, boxes_y, out_img=None):
    boxdim = (boxes_x - 1, boxes_y - 1)
    ret, corners = cv2.findChessboardCorners(img_gray, boxdim, None)
    assert ret

    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    corners2 = cv2.cornerSubPix(img_gray, corners, (11, 11), (-1, -1), criteria)
    if out_img is not None:
        out_img = cv2.drawChessboardCorners(out_img, boxdim, corners2, ret)
    return corners2

BOXES_X = 23 # should be 24
BOXES_Y = 12 # should be 13

obj_points = chessboard_objectpoints(BOXES_X, BOXES_Y)
img_points = chessboard_imagepoints(img_gray, BOXES_X, BOXES_Y, img)

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
  [obj_points], [img_points], img_gray.shape[::-1], None, None
)

h, w = img.shape[:2]
dimension = w, h

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, dimension, 0)
dst = cv2.undistort(img, mtx, dist)

x, y, w, h = roi
dst = dst[y : y + h, x : x + w]

cv2.imshow("img", dst)
cv2.waitKey()
该脚本的最终图像如下所示,并且它确实比原始图像失真更小:

现在我有两个问题:

  • 为什么
    cv2.findChessboardCorners
    只能找到角点的子集,请参见图片和源代码?我希望它能够找到一个23x12角的模式,但这行不通
  • 棋盘的子集越小,剩余的失真就越多,见图。那么,完整的模式看起来也没有什么帮助。我怎样才能完全消除这种图像的失真