【问题标题】:Cross correlation c++ and matlab互相关c++和matlab
【发布时间】:2015-08-18 05:51:20
【问题描述】:

我正在尝试在 C++ 中进行互相关。问题是我在 matlab 中没有得到相同的结果。

C++ 代码

float telo[5] = {-1, 0, 1, 2, 3};
Mat prueba(1, 5, CV_32F, telo);
float telo2[3] = { 0, 1, 2 };
Mat prueba2(1, 3, CV_32F, telo2);
Mat result;
matchTemplate(prueba, prueba2, result, CV_TM_CCORR);
Result: 2048.0004882812500 2.660783784765e-314#DEN -6.2774385622041925e+066

Matlab 代码:

a = [-1,0,1,2,3]
b = [0,1,2]
xcorr2(a,b)
Result: -2 -1 2 5 8 3 0

我做错了什么?

【问题讨论】:

    标签: c++ matlab opencv cross-correlation


    【解决方案1】:

    当我使用 OpenCV 3 尝试您的 C++ 代码示例时,如预期的那样,我得到以下结果:

    2, 5, 8
    

    这与 Matlab 解决方案相同,但没有尾巴。


    编辑:

    要获得与使用 Matlab 相同的结果,您可以在输入数据中添加一些零填充。在您的数据中手动执行:

    float telo[9] = {0, 0, -1, 0, 1, 2, 3, 0, 0};
    Mat prueba(1, 9, CV_32F, telo);
    

    或者更通用的解决方案(也应该适用于 2D 数据)是调用

    copyMakeBorder(prueba, prueba, prueba2.rows - 1, prueba2.rows - 1, prueba2.cols - 1, prueba2.cols - 1, cv::BORDER_CONSTANT);
    

    在matchTemplate之前。

    【讨论】:

    • 感谢您的回答。我使用的是opencv 2.49,那么是否有错误的实现或为什么输出不同?有什么办法可以得到与matlab完全相同的输出(序列的头尾)?
    • 我不知道您为什么会看到不同的结果。您是否尝试过使用您发布的代码或者这是一个简化的示例?我更新了我的答案以解释如何获得尾巴。
    • 我从我的 main 函数中复制了完全相同的源代码并粘贴到这里。有没有规定我应该使用多少个零?因为 matlab 自己做填充。
    • 是的,规则是:在每一侧添加(prueba2 的长度 - 1)。我打电话给copyMakeBorder 就是这样做的。
    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 2011-09-11
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多