卷积:conv2 matlab 到 opencv

Posted

技术标签:

【中文标题】卷积:conv2 matlab 到 opencv【英文标题】:convolution: conv2 matlab to opencv 【发布时间】:2018-11-23 16:50:20 【问题描述】:

如果我将输入图像和内核设置在:

cv::Mat conv2D(cv::Mat input,cv::Mat kernel)
    printf("\nINPUT [ %d x %d ]\n",input.rows,input.cols);
    cout << input <<endl;
    printf("\nKERNEL [ %d x %d ]\n",kernel.rows,kernel.cols);
    cout << kernel <<endl;

    cv::Mat flipped_kernel;
    cv::Point2i pad;
    cv::Mat result;
    cv::Mat padded;
    cv::Point anchor(kernel.cols -kernel.cols/2 -1,kernel.rows -kernel.rows/2 -1 );
    cv::flip( kernel, flipped_kernel, -1 );
    printf("\nFLIPPED KERNEL [ %d x %d ]\n",flipped_kernel.rows,flipped_kernel.cols);
    cout << flipped_kernel <<endl;
    pad = cv::Point2i( kernel.cols - 1, kernel.rows - 1);
    cv::copyMakeBorder( input, padded, pad.y, pad.y, pad.x, pad.x, cv::BORDER_CONSTANT,cv::Scalar(0) );
    cv::Rect region = cv::Rect( pad.x / 2, pad.y / 2, padded.cols - pad.x, padded.rows - pad.y);

    cv::filter2D( padded, result , padded.depth(), flipped_kernel, anchor, 0, cv::BORDER_CONSTANT );
    cv::Mat out = result( region );

    printf("\nOUT [ %d x %d ]\n",out.rows,out.cols);
    cout << out <<endl;
    return out;

输出不同于:

conv2(input,kernel)

在网上阅读有人说翻转是错误的,但其他人说不是。所以我使用了一个对称的旋转矩阵作为内核,结果仍然是错误的。我如何在 C++ 中执行 2d 卷积和 2d 互相关?

【问题讨论】:

这个conv2(input,kernel) 在 Matlab 中?所以你显然想在 C++ 中使用 OpenCV,这个 conv2 在 Matlab 中做了什么? 是的,是matlab的一个函数,做两个矩阵之间的卷积 你知道有更多的参数被赋予 conv2() 函数。根据您提供的第三个参数,尽管输入矩阵相同,但结果会略有不同。您可以决定 'same'、'full' 或 'valid' 作为第三个参数。所以试试 conv2(input, kernel, 'same')。你的结果和这个一样吗? 不,结果仍然不同,“相同”返回的矩阵的大小发生了变化,但问题在于返回的矩阵的值。在opencv中返回一些负值。我正在尝试在 C++ 中转换 matlab 函数。 你能给我们一个小样本 inputkernel 在 OpenCV 中给你错误值的矩阵吗?您不必指定锚点(只需使用Point(-1,-1))。您也不必使用copyMakeBorder(只需在filter2D 中指定BORDER_CONSTANT)。 【参考方案1】:

问题是我通过了 CV_32F 类型的 opencv 垫子,这给了我错误的结果,我使用以下方法将图像转换为 CV_8UC1:

input.convertTo(input,CV_8UC1); flipped_kernel.convertTo(input,CV_8UC1);

并在操作后改变输出的类型:

out.convertTo(input,CV_32F);

所以方法有效!

【讨论】:

以上是关于卷积:conv2 matlab 到 opencv的主要内容,如果未能解决你的问题,请参考以下文章

Python中的2D卷积类似于Matlab的conv2

MATLAB conv2函数的理解

MATLAB,conv2卷积函数报错,求大神帮忙看看

matlab的二维卷积操作(转)

求matlab中的conv2卷积函数用c++怎么实现

Matlab 矩阵卷积理解(转载)