cvPerspectiveTransform
4つの2Dポイントを変換するために使用しようとしています。すでに変換行列(3x3)を取得しましたcvFindHomography
。エラーが発生しないように、どのような構造を提供すればよいかわかりません。これらのポイントでそれを行う方法を教えてくれる人はいますか?
- x:y
- 0:0
- 640:0
- 0:480
- 640:480
WinでOpenCV2.4.0を使用しています。
cvPerspectiveTransform
4つの2Dポイントを変換するために使用しようとしています。すでに変換行列(3x3)を取得しましたcvFindHomography
。エラーが発生しないように、どのような構造を提供すればよいかわかりません。これらのポイントでそれを行う方法を教えてくれる人はいますか?
WinでOpenCV2.4.0を使用しています。
これは、行列を正しく初期化する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);
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が好きです。