1

OpenCV を学習しようとしています (バージョン 3.0.0 を使用)。現在、ポイント操作がさまざまな画像に対して何を行うかを確認しようとしています。入力が次の形式である必要がある大きさ操作を実行しようとするまで、すべてがうまくいきます

magnitude(InputArray x, InputArray y, OutputArray magnitude)

また、x と y は、ベクトルの x/y 座標の浮動小数点配列であり、同じサイズでなければならないことも説明しています。

マットのベクトルを作成し、入力画像をこれらのベクトルに分割してから、それらに対してマグニチュード演算子を実行しようとしましたが、うまくいきませんでした。したがって、引数を列と行として渡す必要があると思いますが、今はエラーが発生しています

    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)

入力マットを 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();
}
4

1 に答える 1

4
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);
于 2015-02-13T09:22:52.873 に答える