我有一个紧凑的循环,其中我获取摄像头图像,对其进行去畸变和一些变换(例如透视变换),并利用cv::remap(...)
完成每个操作,这比使用纯矩阵运算要高效得多。
据我了解,可以将查找映射组合成一个,并在每个循环迭代中仅调用一次remap。是否有一种通用的方法来实现此目的?我不想自己实现所有的插值处理。
注意:该过程应适用于不同大小的映射。在我的特定情况下,去畸变保留图像尺寸,而其他变换则将图像缩放为不同的大小。
示例代码:
// input arguments
const cv::Mat_<math::flt> intrinsic = getIntrinsic();
const cv::Mat_<math::flt> distortion = getDistortion();
const cv::Mat mNewCameraMatrix = cv::getOptimalNewCameraMatrix(intrinsic, distortion, myImageSize, 0);
// output arguments
cv::Mat undistortMapX;
cv::Mat undistortMapY;
// computes undistortion maps
cv::initUndistortRectifyMap(intrinsic, distortion, cv::Mat(),
newCameraMatrix, myImageSize, CV_16SC2,
undistortMapX, undistortMapY);
// computes undistortion maps
// ...computation of mapX and mapY omitted
cv::convertMaps(mapX, mapY, skewMapX, skewMapY, CV_16SC2);
for(;;) {
cv::Mat originalImage = getNewImage();
cv::Mat undistortedImage;
cv::remap(originalImage, undistortedImage, undistortMapX, undistortMapY, cv::INTER_LINEAR);
cv::Mat skewedImage;
cv::remap(undistortedImage, skewedImage, skewMapX, skewMapY, cv::INTER_LINEAR);
outputImage(skewedImage);
}