如何使I420图像数据不失真?有效地

问题描述 投票:0回答:1

我能够成功使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);
opencv yuv distortion remap
1个回答
0
投票

如果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颜色转换。

© www.soinside.com 2019 - 2024. All rights reserved.