繁体   English   中英

使用Python进行OpenCV摄像机校准而不使用cv2.findChessboardCorners

[英]OpenCV camera calibration in Python without using cv2.findChessboardCorners

我正在尝试使用openCV进行相机校准。 我没有问题,只要我使用cv2.findChessBoardCorners在图像中找到我的校准目标,但如果我使用自己的函数来查找点并使用点构建数组,我在尝试时遇到错误估计相机参数。 这是一个会抛出相同错误的示例。

import numpy as np
import cv2


pattern_size         = (4, 3)
pattern_points       = np.zeros( (np.prod(pattern_size), 3), np.float32 )
pattern_points[:,:2] = np.indices(pattern_size).T.reshape(-1, 2)
pattern_points      *= 20

obj_points = []
img_points = []

for fn in range(5):
    corners = np.asarray(pattern_points[:,1:], dtype=np.float32)

    img_points.append(corners.reshape(-1, 2))
    obj_points.append(pattern_points)


ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points,
                                                   img_points,
                                                   (1088, 2048),
                                                   None,
                                                   None)

如果我用通常的方式制作角阵列

ret, corners = cv2.findChessboardCorners(gray, (4,3))

它工作正常。 在两种情况下,角的类型都是ndarray大小(12,2),元素是float32。

为什么我会收到此错误:

OpenCV Error: Unsupported format or combination of formats (imagePoints1 should contain vector of vectors of points of type Point2f) in cv::collectCalibrationData, file C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\calib3d\src\calibration.cpp, line 2982

当我尝试从头开始构造img_points数组而不是使用cv2.findChessboardCorners时?

我一直有同样的问题。 我通过使用矢量向量解决了它,如记录的那样; obPts = [ [qx0, qy0],..., [qxn, qyn] ] , then do: imPts.astype('float32') and obPts.astype('float32') , when using them inside the function. 对于每个帧, imPts = [ [px0, py0, pz0],..., [pxn, pyn, pzn] ] obPts = [ [qx0, qy0],..., [qxn, qyn] ] ,然后执行: imPts.astype('float32')obPts.astype('float32') ,在函数内部使用它们。 如果使用多个帧,则对每个帧执行此操作。 这就是诀窍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM