Python 过滤校准图像的有效方法是什么?

Python 过滤校准图像的有效方法是什么?,python,opencv,image-processing,computer-vision,camera-calibration,Python,Opencv,Image Processing,Computer Vision,Camera Calibration,我正在执行教程中显示的校准 我希望我的校准例行程序决定图像是否适合校准,而不是手动可视化来决定,因为有一些图像检测到的棋盘图案是弯曲的,它们可能会对校准产生不良影响 我有大约400张图片,所以不可能对每张图片进行可视化和决策 下面是一个可能的解决方案,但考虑到大量图像,速度非常慢 def calculate_error(img_points_p, obj_points_p, rot_vectors_p, tr_vectors_p, mtx_p, dist_p): error_data =

我正在执行教程中显示的校准

我希望我的校准例行程序决定图像是否适合校准,而不是手动可视化来决定,因为有一些图像检测到的棋盘图案是弯曲的,它们可能会对校准产生不良影响

我有大约400张图片,所以不可能对每张图片进行可视化和决策

下面是一个可能的解决方案,但考虑到大量图像,速度非常慢

def calculate_error(img_points_p, obj_points_p, rot_vectors_p, tr_vectors_p, mtx_p, dist_p):
    error_data = []
    for i in range(len(obj_points_p)):
        img_points_2, _ = cv.projectPoints(obj_points_p[i], rot_vectors_p[i], tr_vectors_p[i], mtx_p, dist_p)
        error = cv.norm(img_points_p[i], img_points_2, cv.NORM_L2) / len(img_points_2)
        error_data.append(error)
    return error_data

# perform calibration
# call calculate_error(...)
# remove from img_points (2d points in image plane) the values which correspond to value greater than 0.1 in error_data
# perform calibration again with data with only lesser values from error_data 
是否可能有一个更快的替代方案?比如在检测到棋盘图案后立即检查图像是否良好,对于所有图像?

以算法形式:

  • 对每个图像运行findChessboardCorners(),拒绝未检测到棋盘的图像
  • 在幸存者图像上,使用RANSAC或LMEDS估计器在检测到的棋盘角上运行findHomography(),拒绝失败或找到少于N个内联的图像。使用一个合理的N值,比如16或36(这意味着你想“看到”4x4或6x6的等效内射。至少。不要对最大可接受的重射误差过于严格,因为你还没有校正镜头畸变

也许你可以在校准过程中使用某种RANSAC来查找内部/异常值。我对单应性不太熟悉,
retval,mask=cv.findHomography(img_points[I],obj_points[I],cv.LMEDS,16)
有效吗?是的,它可能会做一些实验。