我试图弄清楚如何在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
,{{1}的样本值在this Google云端硬盘文件夹中(我只打算包含图片的第一个频道),然后img
(代码运行后)。我已经看到它在其他几个问题上提到imNew
仅适用于常规网格,坦率地说,我并不完全知道这意味着什么(这些问题是cv::remap (in opencv) and interp2 (matlab)和{ {3}}
这些图片展示了目标是什么。 remap irregular to regular grid
感谢您的帮助!!
答案 0 :(得分:0)
你只需要这样做:
remap(img, imgNew, Ix, Iy, CV_INTER_LINEAR);
说真的,我测试了它,它给你的MATLAB代码(以及你附加的图像)提供了相同的结果。
人们提到的'不规则'网格是指示例点网格(在您的情况下为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
这就是为什么在OpenCV中你甚至没有传递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中提到的那样。