我能够成功使RGB图像失真。
现在,我正在直接处理I420数据,而不是先将其转换为RGB。
下面是我在相机校准后执行的步骤。
K = cv::Matx33d(541.2152931632737, 0.0, 661.7479652584254,
0.0, 541.0606969363056, 317.4524205037745,
0.0, 0.0, 1.0);
D = cv::Vec4d(-0.042166406281296365, -0.001223961942208027, -0.0017036710622692108, 0.00023929900459453295);
newSize = cv::Size(3400, 1940);
cv::Matx33d new_K;
cv::fisheye::estimateNewCameraMatrixForUndistortRectify(K, D, cv::Size(W, H), cv::Mat::eye(3, 3, CV_64F), new_K, 1, newSize); // W,H are the distorted image size
cv::fisheye::initUndistortRectifyMap(K, D, cv::Mat::eye(3, 3, CV_64F), new_K, newSize, CV_16SC2, mapx, mapy);
cv::remap(src, dst, mapx, mapy, cv::INTER_LINEAR);
上面的代码成功地给了我没有失真的图像。
现在,我要取消I420数据的失真。因此,现在我的src将是I420 / YV12数据。如何在不先将I420数据转换为RGB的情况下对其进行失真处理?
顺便说一句I420是只有1个通道的图像格式(与RGB中的3个通道不同)。它的高度= 1.5 *图像高度。其宽度等于图像宽度。
下面的代码是将I420转换为BGR
cvtColor(src, BGR, CV_YUV2BGR_I420, 3);
如果YV12数据是一个通道图像,则将remap
操作的插值应用于所有三个YUV数据表示的值,而不是单独的Y,U和V分量。
因此,粗略地说,而不是做一个>
c.YYYYYYYY,c.UU,c.VV
它将执行一个
c.YYYYYYYYUUVV
线性插值中。
您可以在重新映射后执行YV12-> BGR颜色转换,但是插值像素的颜色将是错误的。
而不是进行线性插值,请尝试在remap
中使用最近邻插值。然后,您应该能够在YV12-> BGR颜色转换后获得正确的颜色。
因此,找到mapx,mapy,然后使用remap
查找INTER_NEAREST
,最后执行YV12-> BGR颜色转换。