2

cvPerspectiveTransform4つの2Dポイントを変換するために使用しようとしています。すでに変換行列(3x3)を取得しましたcvFindHomography。エラーが発生しないように、どのような構造を提供すればよいかわかりません。これらのポイントでそれを行う方法を教えてくれる人はいますか?

  • x:y
  • 0:0
  • 640:0
  • 0:480
  • 640:480

WinでOpenCV2.4.0を使用しています。

4

2 に答える 2

1

これは、行列を正しく初期化する1つの方法です。おそらく最もエレガントではありませんが、機能します。

CvMat* input = cvCreateMat(1, 4, CV_32FC2);
CvMat* output = cvCreateMat(1, 4, CV_32FC2);

float data[8] = {0,0,0,640,480,0,640,480};

for (int i =0; i < 8; i++)
{
    input->data.fl[i] = data[i];
}

cvPerspectiveTransform(input, output, matrix_from_cvFindHomography);

C ++ APIは、より直感的な実装を提供します。パースペクティブトランスフォームなどの多くのOpenCV関数は、ポイントのベクトルを入力として受け入れます。これは、次の方法で初期化できます。

std::vector<cv::Point2f> inputs;
std::vector<cv::Point2f> outputs;

inputs.push_back(cv::Point2f(0,0));
inputs.push_back(cv::Point2f(640,0));
inputs.push_back(cv::Point2f(0,480));
inputs.push_back(cv::Point2f(640,480));

cv::perspectiveTransform(inputs, outputs, matrix_from_findHomography);
于 2012-10-16T17:55:54.830 に答える
0

3x3 cv :: Matのfloatがあると仮定すると、それを次のように変換できます(すべてのfをdに二重に変更したい場合)

cv::Matx33f transform(your_cv_Mat);
cv::Matx31f pt1(0,0,1);
cv::Matx31f pt2(640,0,1);
...
pt1 = transform*pt1;
pt2 = transform*pt2;
...

必ず3番目の座標で正規化し、それが意味をなさない場合は同次座標を読んでください

pt1 *= 1/pt1(2);
pt2 *= 1/pt2(2);
...
cv::Point2f final_pt1(pt1(0),pt1(1));
cv::Point2f final_pt2(pt2(0),pt2(1));

Matxでこれを行う必要はありません。cv::Matでも同様に機能します。個人的には、Matxのサイズとタイプを追跡しやすく、その内容をデバッガーで簡単に表示できるため、変換を操作するためのMatxが好きです。

于 2012-10-16T16:39:52.150 に答える