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

时间:2015-08-26 19:42:55

标签: matlab opencv computer-vision

我试图弄清楚如何在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我还包括IxIy,{{1}的样本值在this Google云端硬盘文件夹中(我只打算包含图片的第一个频道),然后img(代码运行后)。我已经看到它在其他几个问题上提到imNew仅适用于常规网格,坦率地说,我并不完全知道这意味着什么(这些问题是cv::remap (in opencv) and interp2 (matlab)和{ {3}}

这些图片展示了目标是什么。 remap irregular to regular grid

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

你只需要这样做:

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函数XIYI矩阵,因为假设IxIy对应于上面的样本点。

幸运的是,您相应地计算了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 theorydocumentation中提到的那样。