0

基本行列に1列の行列(2D同次座標)を掛けようとしていますが、次のエラーが発生します。CvException occurred - OpenCV: src1.size == dst.size && src1.channels() == dst.channels()

コードは次のようになります。

IntPtr fundamentalMatrix = CvInvoke.cvCreateMat(3, 3, MAT_DEPTH.CV_32F);

[... finding the fundamental matrix ...]

IntPtr cam1PointRef = CvInvoke.cvCreateMat(3, 1, MAT_DEPTH.CV_32F);
IntPtr cam2PointRef = CvInvoke.cvCreateMat(3, 1, MAT_DEPTH.CV_32F);

//cam1Point is known
CvInvoke.cvSet2D(cam1PointRef, 0, 0, new MCvScalar(cam1Point.X));
CvInvoke.cvSet2D(cam1PointRef, 1, 0, new MCvScalar(cam1Point.Y));
CvInvoke.cvSet2D(cam1PointRef, 2, 0, new MCvScalar(1));

CvInvoke.cvMul(fundamentalMatrix, cam1PointRef, cam2PointRef, 1);

Matrix<float> cam2PointMat = new Matrix<float>(3, 1, cam2PointRef);

PointF cam2Point = new PointF();
cam2Point.X = cam2PointMat[0, 0] / cam2PointMat[0, 2];
cam2Point.Y = cam2PointMat[0, 1] / cam2PointMat[0, 2];

このように乗算の順序を逆にするCvInvoke.cvMul(cam1PointRef, fundamentalMatrix, cam2PointRef, 1);と、別の例外が発生します。

OpenCV: The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array'

私が間違っているのは何ですか?コアレスポンデントポイントを取得するために、(3 x 3)行列と(3 x 1)行列を乗算できないのはなぜですか?

4

1 に答える 1

0

現在、私は自分のPCを持っていませんが、古いcvinvoke構文の代わりにMatrix <、>汎用クラスを使用してより簡単にする必要があります。行列クラスを使用すると、行列演算で問題が発生することはありません。

エラーは、配列乗算法を使用して行列を乗算することで構成されます。

cvmul
2つの配列の要素ごとの積を計算しますdst(I)= scale * src1(I)* src2(I)すべての配列は同じタイプで、同じサイズ(またはROIサイズ)である必要があります

public static void cvMul(
    IntPtr  src1,
    IntPtr  src2,
    IntPtr  dst,
    double  scale
)
于 2012-08-31T21:26:04.193 に答える