2012-01-17 8 views
3

マトリックス乗算は画像処理の非常に基本的なタスクであり、OpenCVはオーバーロードされた*演算子を処理します。点のSTLベクトルはキャスティングによってMatに変換できます。行列乗算のOpencv STLベクトル

vector<Point2f> p1(2); 
p1[0].x=1;p1[0].y=0; 
p1[1].x=0;p1[1].y=1; 
Mat p1M=Mat(p1); 

OpenCVのドキュメントで述べたように、これはベクトルの無に等しい行を持つ(2つの要素を持つ)単一の列に行列を作成します。あなたが行列したいとき

[1 0;0 1]------>p1M.rows=2;p1M.cols=1 

これは、問題を作成し、基本的には、Matrixが行うすべてのキャストベクトルはそのままベクトルをマージすることだと信じています。

しかし、コマンドp1M.at<float> (0,1)p1M.at<float> (1,0)は0と1を返します。

OpenCV Error: Assertion failed (a_size.width == len) in gemm, file /home/james/OpenCV-2.3.1/modules/core/src/matmul.cpp, line 708 terminate called after throwing an instance of 'cv::Exception' what(): /home/james/OpenCV-2.3.1/modules/core/src/matmul.cpp:708: error: (-215) a_size.width == len in function gemm

私はちょうどそれを行うための関数を書くことを考えています:これは私がP1M * P1Mは可能ですが、残念ながらそれだけでコンパイルし、実行時エラーが発生し考えさせられました!ベクトルをMatに、逆をベクトルに...何かが欠けていますか?あなたがCVに見たいと思うかもしれません

+0

を呼び出すことで期待しているマトリックスにP1Mを変換してみてください。私はあなたがMat contrustorを調べて、マトリックスがセットアップされてstd:vectorを与える様子を見てみることをお勧めします。 – boto

+1

2 * 1の行列が作成されるのは間違いありませんが、2つのチャネルの2 * 1の行列が作成されると思います。これは、行列の各要素が単一の浮動小数点数ではなく、cv :: Vec2fであることを意味します。したがって、次の値を印刷すると、p1M.at (0,0)[0]、p1M.at (0,0)[1]、p1M.at (1,0) 0]、p1M.at (1,0)[1]の場合は、2,1.0,0.0,0.0,1.0となるはずです。 OpenCVの行列乗算がマルチチャネル行列をサポートしているとは思わないので、エラーメッセージが表示されます。 – cxyzs7

+0

私はImageWatch(VSプラグイン)やデバッガをお勧めします。その結果Matのタイプを非常に簡単に見つけることができます。または、チャンネル数を指定してください。 – Ela782

答えて

2

::マット::あなたはそれがポイントの各コンポーネントに対して1つのチャネルを作成するポイントのリストからマットを作成するとき http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-reshape

の形を変えます。したがって、Point3fを使用すると、3つのチャンネルを持つ単一の列のMatが作成されます。

あなたは、私が行列は2×2の形であなたのベクターから構築されていなかったことを推測する主張から

p1M.reshape(1);