我正在尝试弄清楚如何在 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_Col
和 img_Row
只是img
的大小我还包括了 Ix
的样本值, Iy
, img
, 和 imNew
(在代码运行后)在 this Google Drive 文件夹(我只是想包含图像的第一个 channel )。我已经看到它在 remap
的其他几个问题中提到过。仅适用于常规网格,坦率地说,我不完全知道这意味着什么(这些问题是 cv::remap (in opencv) and interp2 (matlab) 和 remap irregular to regular grid 。最佳答案
你只需要做:
remap(img, imgNew, Ix, Iy, CV_INTER_LINEAR);
XI
和 YI
)。虽然在 MATLAB 中这些允许图像上的任意值,但在 OpenCV 中这些 有 只是目标图像中的像素网格(在您的情况下为 imgNew
):XI = 1 2 ... n YI = 1 1 ... 1
1 2 ... n 2 2 ... 2
... ...
1 2 ... n m m ... m
remap
函数XI
和 YI
自 Ix
以来的矩阵和 Iy
假设对应于上面的样本点。Ix
和 Iy
矩阵相应地因此它开箱即用。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/