【问题标题】:Matlab Interp2 function behaviour differently compared with OpenCV Remap与 OpenCV Remap 相比,Matlab Interp2 函数行为不同
【发布时间】:2018-03-23 08:31:54
【问题描述】:

我正在尝试为 interp2 寻找等效的 OpenCV 函数,我参考此海报在 OpenCV 中使用 remap 函数。

cv::remap (in opencv) and interp2 (matlab)

但是,我意识到这两个函数之间的输出存在显着差异。这是我的 Matlab 代码

U = [0.1 0.1 0.1; 0.2 0.2 0.2; 0.3 0.3 0.3];
X = [0 0 0; 0.5 0.5 0.5; 1 1 1];
Y = [0 0.5 1;0 0.5 1;0 0.5 1];
V = interp2(U,X,Y,'linear',NaN)

我得到的输出 V 矩阵为

   NaN       NaN       NaN
   NaN       NaN       NaN
   NaN       NaN    0.1000

这是我的 OpenCV 代码

#include "highgui.h"
#include "cv.h"
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    //generate flowmap model
    CvFileStorage* fx = cvOpenFileStorage("result.txt", 0, CV_STORAGE_WRITE);//ask storage for save file
    Mat xmesh = cvCreateMat(3, 3, 5);
    Mat ymesh = cvCreateMat(3, 3, 5);

    for (int i = 0; i < xmesh.rows; i++)
        for (int j = 0; j < xmesh.cols; j++)
        {
            xmesh.at<float>(i, j) = i*0.5;
            ymesh.at<float>(i, j) = j*0.5;
        }

    //generate optical flow folder
    Mat u = cvCreateMat(3, 3, 5);

    for (int i = 0; i <u.rows; i++)
        for (int j = 0; j < u.cols; j++)
        {
            u.at<float>(i, j) = (i + 1)*0.1;
        }
    Mat v = Mat::zeros(u.size(), u.type());

    remap(u, v, xmesh, ymesh, INTER_LINEAR, 0, cvScalarAll(0));

    //convert mat to Iplimage
    IplImage* xmesh_a = cvCloneImage(&(IplImage)xmesh);
    IplImage* ymesh_a = cvCloneImage(&(IplImage)ymesh);
    IplImage* u_a = cvCloneImage(&(IplImage)u);
    IplImage* v_a = cvCloneImage(&(IplImage)v);

    //save end to txt
    cvWrite(fx, "xmesh", xmesh_a, cvAttrList());
    cvWrite(fx, "ymesh", ymesh_a, cvAttrList());
    cvWrite(fx, "u", u_a, cvAttrList());
    cvWrite(fx, "v", v_a, cvAttrList());
    cvReleaseFileStorage(&fx);

    waitKey();

}

我得到的输出V矩阵是

1.00000001e-001, 1.50000006e-001, 2.00000003e-001,
1.00000001e-001, 1.50000006e-001, 2.00000003e-001,
1.00000001e-001, 1.50000006e-001, 2.00000003e-001

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 如果U持有你的数据,函数调用不就是这样:interp2(X,Y,U,...)吗?
  • @Irreducible 感谢您的回复,但我认为这对网格插值没有影响。阅读此海报stackoverflow.com/questions/32235379/…

标签: matlab remap


【解决方案1】:

结果的差异与 c++ 和 MATLAB 之间的索引差异有关,分别是从 0 开始和从 1 开始。

interp2(U,X,Y,'linear',NaN)interp2(1:3,1:3,U,X,Y,'linear',NaN) 相同,将其更改为interp2(0:2,0:2,U,X,Y,'linear',NaN) 将得到与 OpenCV 相同的结果。

如果您希望remap 的结果与interp2 的结果相同,您可以将xmeshymesh 向后移动并搜索负位置以产生nan 值。

#include <cmath>
//...
//...
for (int i = 0; i < xmesh.rows; i++)
    for (int j = 0; j < xmesh.cols; j++)
    {
        xmesh.at<float>(i, j) = i*0.5-1;
        ymesh.at<float>(i, j) = j*0.5-1;
    }
//...
//...
remap(u, v, xmesh, ymesh, INTER_LINEAR, 0, cvScalarAll(NAN));

结果:

nan nan nan 
nan nan nan
nan nan 0.1

【讨论】:

  • 谢谢! @rahnema1 你能告诉我如何修改 OpenCV 代码以实现与 Matlab 函数相同的结果吗?谢谢!
  • 我的意思是,如果我想更改 OpenCV 代码以实现原始 interp2 函数在 Matlab 中的作用,我需要使用当前网格之外的网格值,对吗?此时我是否需要使用 NaN 划桨我的 xmesh 和 ymesh ?我正在尝试划桨 NaA,但不知道如何在 OpenCV 中分配 NaN 值。
  • 您需要将网格向后移动一步。我的意思是for (int i = -1; i &lt; xmesh.rows-1; i++) for (int j = -1; j &lt; xmesh.cols-1; j++) 并包含&lt;cmath&gt; 并将remap 函数的最后一个参数设置为NAN
  • 我更改了我的 OpenCV 代码,但仍然没有得到相同的结果。如果您可以发布修改后的 OpenCV 代码以便我进行测试,那就太好了。感谢您的帮助,一旦我得到相同的结果,我会接受答案。
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多