matlab - 如何在 OpenCV 中进行网格插值 interp2

我正在尝试弄清楚如何在 OpenCV 中执行此 matlab 代码的等效操作,几个使用的地方 cv::remap作为 interp2 的替代方案,但它给我的结果与 matlab 不同。

如果它有帮助,这是在执行分段仿射变换的函数内部,作为拟合主动外观模型的一部分。

    [XI, YI] = meshgrid(1:img_Col, 1:img_Row);
    imNew=zeros(nRow,nCol,nChannels);
    for i=1:nChannels
        imNew(:,:,i) = interp2(XI, YI, double(img(:,:,i)),Ix(: , :),Iy(: , :));
    end
img_Colimg_Row只是img的大小我还包括了 Ix 的样本值, Iy , img , 和 imNew (在代码运行后)在 this Google Drive 文件夹(我只是想包含图像的第一个 channel )。我已经看到它在 remap 的其他几个问题中提到过。仅适用于常规网格,坦率地说,我不完全知道这意味着什么(这些问题是 cv::remap (in opencv) and interp2 (matlab) 和 remap irregular to regular grid 。

这些图像展示了目标是什么。 http://imgur.com/a/09QgM

谢谢你的帮助!!

最佳答案

你只需要做:

remap(img, imgNew, Ix, Iy, CV_INTER_LINEAR);

说真的,我对它进行了测试,它为您的 MATLAB 代码(以及您附加的图像)提供了相同的结果。

人们提到的“不规则”网格是指样本点网格(在您的情况下为 XIYI)。虽然在 MATLAB 中这些允许图像上的任意值,但在 OpenCV 中这些 只是目标图像中的像素网格(在您的情况下为 imgNew):
XI = 1 2 ... n   YI = 1 1 ... 1
     1 2 ... n        2 2 ... 2
     ...              ...
     1 2 ... n        m m ... m

这就是为什么在 OpenCV 中你甚至没有通过 remap函数XIYIIx 以来的矩阵和 Iy假设对应于上面的样本点。

幸运的是你计算了你的 IxIy矩阵相应地因此它开箱即用。

这都是因为remap是通过以下方式实现的:
for x <- 1...n
  for y <- 1...m
     imgNew(x,y) = interpolate the value of img at the point (Ix(x,y), Iy(x,y))
  end
end

remap 中所述theory和 documentation .

https://stackoverflow.com/questions/32235379/

相关文章:

python - 从二进制字符串加载OpenCV图像

python-2.7 - 如何提高Python PIL的最终图像质量和清晰度?

delphi - 当我尝试安装 Delphi-OpenCV。我得到 "%1 is not a val

opencv - 在 Opencv 中处理相机流,使用 FFMPEG 将其推送到 RTMP(NGIN

image - 不是JPEG文件:开头为0x0a 0x4c错误

android - 在OCR之后从Android中的图像检测字体颜色

opencv - 在 OpenCV 图像拼接中混合伪影

java - OpenCV Java RGB还是HSV?

android - javacv和opencv之间的转换以从Mat中获取均值和stdDev

opencv - 如何将Emgu::CV::Mat转换为OpenCV cv::Mat,反之亦然?