正确的空间相机方向

4

我正在执行一个相机校准,就像OpenCV校准样例中描述的那样(对于镜头校正工作得很好)。此外,我现在想做一个空间校正。也就是说,当相机不与棋盘平行时,我希望获得必要的旋转,使棋盘平行于相机。这就是我正在做的:

// calculate intrinsic matrix and distortion coefficients for lens correction and get
// the rotation "rotation"
cvCalibrateCamera2(object_points,image_points,point_counts,cvGetSize(gray_image),
                   intrinsic_matrix, distortion_coeffs,
                   rotation,NULL,
                   0);
...
// convert the rotation to a 3x3 matrix
cv::Rodrigues(rotation,rotMtx,cv::noArray());
// generate maps for lens correction
cv::initUndistortRectifyMap(intrinsic,distortion,cv::Mat(),
                            cv::getOptimalNewCameraMatrix(intrinsic,distortion,imageSize,1,imageSize,0),
                                                         imageSize, CV_16SC2,*handle->mapx,*handle->mapy);
...
// perform lens correction
cv::remap(cv::Mat(sImage),dImage,*handle->mapx,*handle->mapy,cv::INTER_LINEAR);
...
// apply the rotation to make the mage parallel to the camera
cv::warpPerspective(dImage,dImage2,rotMtx,cv::Size(handle->width,handle->height),cv::INTER_LANCZOS4,cv::BORDER_TRANSPARENT,cv::Scalar());

cvCalibrateCamera2()返回的旋转3x1旋转值不为0,说明有返回值。但是warpPerspective()没有旋转图像。
这里出了什么问题?如何正确“并行化”图像?
1个回答

2
据我所知,您正在使用旋转矩阵“并行”图像,该矩阵提供了两个图像平面之间的旋转。您要寻找的是从图像平面到相机平面的变换。这需要计算平面之间的单应性矩阵。您需要找出哪个矩阵可以将您从图像平面带到相机平面。使用此矩阵来并行化您的图像。
另外,calibrateCamera会给出正向变换,要返回原始状态,需要反转您的矩阵。
试着阅读这篇文章-单应性矩阵 提示:使用焦距和主点信息在图像平面和相机平面之间进行移动。

warpPerspective()函数在变换方面没有任何作用,因此似乎不是矩阵是否反转的问题。 - Elmi
再次强调,你不能直接使用 Rodrigues 函数调用中的 'rotMtx'。你需要使用相机的焦距和主点先计算一个 3x3 的 单应矩阵 。然后使用该矩阵进行转换。 - Pranjal
但是...cvCalibrateCamera2()返回什么类型的旋转 - 它可以用来做什么? - Elmi
cvCalibrateCamera2() 函数返回两个图像平面之间的旋转 - 例如,您从一个角度拍摄棋盘图像,然后从另一个角度拍摄 - 该函数会给出第二个图像相对于第一个图像的旋转。要找到第一个图像相对于相机平面本身的旋转,您需要使用焦距和主点计算旋转和/或平移。 - Pranjal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接