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

2024-05-08 14:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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中心的像素。根据以下链接:

cv2.getOptimalNewCameraMatrix returns ROI of [0,0,0,0] on some data sets

https://answers.opencv.org/question/28438/undistortion-at-far-edges-of-image/?answer=180493#post-id-180493

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

提前感谢您的帮助或建议


Tags: 图像imagealpha矩阵像素cv2opencvcamera