Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

cv::remap on a pre-rotated image

cv::remap on a pre-rotated image

I am undistorting images from my camera, based on calibration data, using code such as this:

cv::fisheye::estimateNewCameraMatrixForUndistortRectify(cameraMatrix, calibCoeffs, imgSize, cv::Matx33d::eye(), newCamMat, 1);

cv::fisheye::initUndistortRectifyMap(cameraMatrix, calibCoeffs, cv::Matx33d::eye(), newCamMat, imgSize, CV_16SC2, map1, map2);

cv::remap(imgSrc, imgDst, map1, map2, cv::INTER_LINEAR);

Works great. However, I would like to use a hardware feature of my camera to allow image rotation by 90 degrees. For example, if the original image (for which the undistortion works) is 1920x1080, then I would also like to apply the undistortion to rotated frames from the camera (1080x1920).

I (very naively) tried to simply rotate the transformation matrix before using it on the rotated frames, as in:

cv::rotate(map1, map1, cv::ROTATE_90_CLOCKWISE);
cv::rotate(map2, map2, cv::ROTATE_90_CLOCKWISE);
cv::remap(imgSrc, imgDst, map1, map2, cv::INTER_LINEAR);

But this did not provide the expected results.

Any pointers in the right direction would be appreciated.

cv::remap on a pre-rotated image

cv::remap on a pre-rotated image

I am undistorting images from my camera, based on calibration data, using code such as this:

cv::fisheye::estimateNewCameraMatrixForUndistortRectify(cameraMatrix, calibCoeffs, imgSize, cv::Matx33d::eye(), newCamMat, 1);

cv::fisheye::initUndistortRectifyMap(cameraMatrix, calibCoeffs, cv::Matx33d::eye(), newCamMat, imgSize, CV_16SC2, map1, map2);

cv::remap(imgSrc, imgDst, map1, map2, cv::INTER_LINEAR);

Works great. However, I would like to use a hardware feature of my camera to allow image rotation by 90 degrees. For example, if the original image (for which the undistortion works) is 1920x1080, then I would also like to apply the undistortion to rotated frames from the camera (1080x1920).

I (very naively) tried to simply rotate the transformation matrix before using it on the rotated frames, as in:

cv::rotate(map1, map1, cv::ROTATE_90_CLOCKWISE);
cv::rotate(map2, map2, cv::ROTATE_90_CLOCKWISE);
cv::remap(imgSrc, imgDst, map1, map2, cv::INTER_LINEAR);

But this did not provide the expected results.

(Obviously one approach would be to do the rotation after (or along with) the undistortion, but I'd like to avoid that if possible for performance reasons; currently it is being done by the hardware).

Any pointers in the right direction would be appreciated.