试图找到 Mat 图像的大小

Trying to find Magnitude of Mat image

我正在尝试学习 OpenCV(使用 3.0.0 版)。 现在我想看看点运算对各种图像做了什么,一切都很顺利,直到我尝试进行幅度运算,这需要输入的形式为

magnitude(InputArray x, InputArray y, OutputArray magnitude)

它还描述了 x 和 y 应该是 x/y-coordinates 向量的浮点数组,并且大小相同。

我试过制作 Mat 的矢量并将输入图像拆分为这些矢量,然后对它们执行幅度运算符,但这没有用。所以我想我需要将参数作为列和行传递,但现在我收到错误

    OpenCV Error: Assertion failed (src1.size() == src2.size() && type == src2.type() && (depth == CV_32F || depth == CV_64F)) in magnitude, file /home/<user>/opencv-3.0.0-beta/modules/core/src/mathfuncs.cpp, line 521
    terminate called after throwing an instance of 'cv::Exception'
      what():  /home/<user>/opencv-3.0.0-beta/modules/core/src/mathfuncs.cpp:521: error: (-215) src1.size() == src2.size() && type == src2.type() && (depth == CV_32F || depth == CV_64F) in function magnitude

Aborted (core dumped)

而且我不确定为什么,因为我显然将输入 Mats 转换为 CV_64F 类型。 我使用的幅度函数错了吗?或者只是传递了错误的数据?

void Magnitude(Mat img, Mat out)
{

    img.convertTo(img, CV_64F);
    out.convertTo(out, CV_64F); 

    for(int i = 0 ; i < img.rows ; i ++)
        for(int j = 0 ; j < img.cols ; j++)
            cv::magnitude(img.row(i), img.col(j), out.at<cv::Vec2f>(i,j));

    cv::normalize(out,out,0,255,cv::NORM_MINMAX);
    cv::convertScaleAbs(out,out);
    cv::imshow("Magnitude", out);

    waitKey();
}
void magnitude(InputArray x, InputArray y, OutputArray magnitude)

其中 xymagnitude 必须具有相同的大小。在您的情况下,这意味着您的图像必须是二次的。对吗?

示例用法:

cv::Sobel(img, gx, img.depth(), 1, 0, 3);     
cv::Sobel(img, gy, img.depth(), 0, 1, 3); 

cv::Mat mag(gx.size(), gx.type());
cv::magnitude(gx, gy, mag);