0

私のプロジェクトの一部で、アフィン変換された画像のパッチの向きを計算する必要があります。今私の問題は、元の歪みのない画像に対してこの計算された向きを見つける方法がわからないことです。

たとえば、ゆがんだ画像のポイントが見つかります(100,200)。8x8 の隣接ピクセルを使用して、この点の向きを抽出できます。30度だとします。ポイントが見つかった歪んだ画像は、元の画像に各軸 (ピッチ、ヨー、ロール) で 60 度の変換を適用した結果です (この方向抽出は通常、コンピューター ビジョンでは記述子抽出として知られています)。

これで、変換行列がわかりました。変換された画像内の点の向きも既知です。ポイント wrt 参照の位置は既知です (逆変換を使用)。このポイント(100,200)が参照フレーム(たとえば150,​​250)に移動した場合、新しい方向が何であるかを知りたいです。言い換えれば、参照画像に対する新しい向きは何ですか。

ロール角回転(60度)だけであれば、これは簡単に解決できます。この場合、参照フレームに対する向きは 30+60 = 90 になります。

OpenCVを使用してこれを実装しようとしました:

        cv::Mat rvec1(3,1,CV_32F); // rot vector related to B
        rvec1.at<float>(0,0)=0;
        rvec1.at<float>(1,0)=30*to_RAD;
        rvec1.at<float>(2,0)=0;

        cv::Mat rvec2(3,1,CV_32F); // rot vector related to A
        rvec2.at<float>(0,0)=0;
        rvec2.at<float>(1,0)=60*to_RAD;
        rvec2.at<float>(2,0)=0;

        cv::Mat R_A;
        cv::Mat R_B;

        cv::Rodrigues(rvec1, R_B);
        cv::Rodrigues(rvec2, R_A);

        cv::Mat R_combined= R_B*R_A;

        cv::Mat rvec_result;
        cv::Rodrigues(R_combined,rvec_result);

2 つの回転ベクトルを使用して、回転マット A と B を作成したいと考えています。これら2つを乗算した後、それを回転ベクトルに変換したいのですが、最後の行で実行時エラーが発生するだけです(cv::Rodrigues(R_combined,rvec_result);)

よろしくお願いいたします。

4

1 に答える 1

1

2 つの回転行列 ( rodriguesを使用して取得できます) があり、それらを A と B と呼んでいるようです。それらを組み合わせる方法を知りたいと思います。A はパッチに対する矢印の方向を表し、B は原点に対するパッチであるとしましょう。パッチの中心にある原点から始めましょう。A は矢印の向きを表します。ここで、原点を B だけ回転させて、元の基準軸が新しい原点に対して B になるようにします。それを行うには、ただ行うだけです

Combined = [B]*[A];

アップデート

コードでエラーが発生する理由がわかりませんが、私にとっては完全に機能します。これが私が実行したコードです。

cv::Mat rvec1(3,1,CV_32F); // rot vector related to B
rvec1.at<float>(0,0)=0;
rvec1.at<float>(1,0)=30*M_PI/180;;
rvec1.at<float>(2,0)=0;

cv::Mat rvec2(3,1,CV_32F); // rot vector related to A
rvec2.at<float>(0,0)=0;
rvec2.at<float>(1,0)=60*M_PI/180;;
rvec2.at<float>(2,0)=0;

cv::Mat R_A;
cv::Mat R_B;

cv::Rodrigues(rvec1, R_B);
cv::Rodrigues(rvec2, R_A);

cv::Mat R_combined= R_B*R_A;

cv::Mat rvec_result;
cv::Rodrigues(R_combined,rvec_result);

std::cout << rvec1 << std::endl<<std::endl;
std::cout << rvec2 << std::endl<<std::endl;
std::cout << R_A << std::endl<<std::endl;
std::cout << R_B << std::endl<<std::endl;
std::cout << R_combined << std::endl<<std::endl;
std::cout << rvec_result << std::endl<<std::endl;

そして、ここに私の出力があります

[0; 0.52359879; 0]

[0; 1.0471976; 0]

[0.49999997, 0, 0.86602545;
0, 1, 0;
-0.86602545, 0, 0.49999997]

[0.86602539, 0, 0.5;
0, 1, 0;
-0.5, 0, 0.86602539]

[-5.9604645e-08, 0, 1;
0, 1, 0;
-1, 0, -5.9604645e-08]

[0; 1.5707964; 0]
于 2012-09-05T21:27:19.107 に答える