Python 过滤校准图像的有效方法是什么?
我正在执行教程中显示的校准 我希望我的校准例行程序决定图像是否适合校准,而不是手动可视化来决定,因为有一些图像检测到的棋盘图案是弯曲的,它们可能会对校准产生不良影响 我有大约400张图片,所以不可能对每张图片进行可视化和决策 下面是一个可能的解决方案,但考虑到大量图像,速度非常慢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 =
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的等效内射。至少。不要对最大可接受的重射误差过于严格,因为你还没有校正镜头畸变
retval,mask=cv.findHomography(img_points[I],obj_points[I],cv.LMEDS,16)
有效吗?是的,它可能会做一些实验。