Python 不失真过程后保持imgae分辨率-摄像机校准

Python 不失真过程后保持imgae分辨率-摄像机校准,python,opencv,image-processing,camera-calibration,perspectivecamera,Python,Opencv,Image Processing,Camera Calibration,Perspectivecamera,我正在使用python中的opencv进行摄像机校准。我已经使用cv2.CalibleCamera进行了校准,得到了相机矩阵和失真系数。我还评估了摄像机矩阵的有效性;换句话说,估计的焦距镜头与数据表中传感器的焦距镜头非常接近(我从数据表中知道像素大小和焦距镜头,单位为mm)。我应该提到,为了不干扰新图像,我遵循以下说明;因为我需要在未失真的图像中保留所有源像素 alpha = 1. # to keep all pixels scale = 1. # to change output image

我正在使用python中的opencv进行摄像机校准。我已经使用cv2.CalibleCamera进行了校准,得到了相机矩阵和失真系数。我还评估了摄像机矩阵的有效性;换句话说,估计的焦距镜头与数据表中传感器的焦距镜头非常接近(我从数据表中知道像素大小和焦距镜头,单位为mm)。我应该提到,为了不干扰新图像,我遵循以下说明;因为我需要在未失真的图像中保留所有源像素

alpha = 1. # to keep all pixels
scale = 1. # to change output image size

w,h = 200,200 # original image size captured by camera
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coefs, (w,h), alpha, (int(scale2*w), int(scale2*h))))
mapx, mapy = cv2.initUndistortRectifyMap(camera_matrix, dist_coefs, None, newcameramtx, (w,h), 5)
dst = cv2.remap(img, mapx, mapy, cv2.INTER_CUBIC)

x_, y_, w_, h_ = roi
dst_cropped = dst[y_:y_+h_, x_:x_+w_]

现在是问题和我的问题:

源图像正径向畸变率很高,由无畸变处理产生的dst图像令人满意,似乎正径向畸变已经被消除,至少在视觉上是如此。因为alpha=1。我还拥有dst图像中的所有源像素。然而,ROI确实很小,它在IMAE的中部种植了一个区域。我可以说,dst_裁剪只包含靠近dst中心的像素。根据以下链接:

我发现可能的问题是因为我的数据集;然后,我尝试平衡数据集,使更多的图像具有接近图像边界的棋盘。我重复了校准,获得的结果与第一次试验非常接近,但是在dst_裁剪的图像中仍然呈现相同的效果。我也尝试使用alpha参数,但任何小于1的数字。不在dst图像中保留所有源像素。考虑到以上所有信息,我似乎不得不继续使用dst图像,而不是dst裁剪的图像;然后,另一个问题来自与源图像(w,h)相同的dst大小。很明显,因为alpha=1。dst包含所有源像素以及零像素,但我的问题是如何保持分辨率不变。如果我没有犯错误,似乎所有的点都被映射,然后结果图像被缩小到适合(w,h)。那么,我的问题是,我如何强制校准保持以前的分辨率?例如,如果某些点映射到(-100,-100)或(300300),则dst应为[400400],而不是[200200]。如何扩展图像而不是缩小


提前感谢您的帮助或建议,

将(int(scale2*w),int(scale2*h))替换为(w,h)抱歉,在发布问题时出现了打字错误,是(int(scale.w),int(scale.h)),我尝试了不同的比例,如1(这导致(w,h)),0.5,1.5;但同样的问题。好吧,你不想保持图像分辨率(200x200),但你想保持像素大小?在未失真期间,您不能在任何地方保持像素大小,因为您将扭曲/未失真像素。那么,您希望在图像中的什么位置保持像素大小?围绕主要问题?您可以根据地图计算尺寸失真,以便重新映射(例如,从源到目标的4个点)和测量区域。如果面积变化太大,请更改参数。使用样条线,您可以更改每个区域的贴图,但可能没有可用的算法和研究主题。是的,我想保留像素大小。事实上,图像边界比围绕主点更重要。我需要这些像素的位移场/映射。那么,如果我想得到所有源像素的位移场,我应该怎么做?事实上,我很困惑,也不确定给定的映射。实际上,cv2.initnOrdityMap作为mapx和mapy提供的是从目标到源的映射;这意味着,通过反演mapx和mapy,不存在所有源像素到目标空间的有效位移。是否可以直接从校准矩阵和dist_coefs生成从源到目标的正向映射?将(int(scale2*w),int(scale2*h))替换为(w,h)对不起,发帖时出现了一个打字错误,是(int(scale.w),int(scale.h)),我尝试了不同的比例,如1(这导致(w,h)),0.5,1.5;但同样的问题。好吧,你不想保持图像分辨率(200x200),但你想保持像素大小?在未失真期间,您不能在任何地方保持像素大小,因为您将扭曲/未失真像素。那么,您希望在图像中的什么位置保持像素大小?围绕主要问题?您可以根据地图计算尺寸失真,以便重新映射(例如,从源到目标的4个点)和测量区域。如果面积变化太大,请更改参数。使用样条线,您可以更改每个区域的贴图,但可能没有可用的算法和研究主题。是的,我想保留像素大小。事实上,图像边界比围绕主点更重要。我需要这些像素的位移场/映射。那么,如果我想得到所有源像素的位移场,我应该怎么做?事实上,我很困惑,也不确定给定的映射。实际上,cv2.initnOrdityMap作为mapx和mapy提供的是从目标到源的映射;这意味着,通过反演mapx和mapy,不存在所有源像素到目标空间的有效位移。是否可以直接从校准矩阵和距离系数生成源到目标的正向映射?