2016-10-17 21 views
0


私はcvCalibrateCamera2を使用しようが、私は回転行列が適切に定義されていないというエラーが表示されます。
cvCalibrateCamera2 - 回転行列を適切に定義する方法は?

...calibration.cpp:1495: error: (-5) the output array of rotation vectors must be 3-channel 1xn or nx1 array or 1-channel nx3 or nx9 array, where n is the number of views

私はすでにその情報からあらゆる可能性を試してみましたが、私はまだ、このエラーを取得します。

マイコード:

CvMat *object_points = cvCreateMat((int)pp.object_points.size(), 1, CV_32FC3); 
CvMat *image_points = cvCreateMat((int)pp.image_points.size(), 1, CV_32FC2); 
const CvMat point_counts = cvMat((int)pp.point_counts.size(), 1, CV_32SC1, &pp.point_counts[0]); 

for (size_t i=0; i<pp.object_points.size(); i++) 
{ 
    object_points->data.fl[i*3+0] = (float)pp.object_points[i].x; 
    object_points->data.fl[i*3+1] = (float)pp.object_points[i].y; 
    object_points->data.fl[i*3+2] = (float)pp.object_points[i].z; 
    image_points->data.fl[i*2+0] = (float)pp.image_points[i].x; 
    image_points->data.fl[i*2+1] = (float)pp.image_points[i].y; 
} 

CvMat* tempR = cvCreateMat(1, 3, CV_32F); 

cvCalibrateCamera2(object_points, image_points, &point_counts, 
        cvSize(pp.width, pp.height), camera->m_calib_K, 
        camera->m_calib_D, tempR, &tempData->m_calib_T, 
        CV_CALIB_USE_INTRINSIC_GUESS) 

// camera->calib_T is defined as: 
// double m_calib_T_data[3]; 
// cvMat(3, 1, CV_64F, camera->m_calib_T_data); 

私はcvCalibrateCamera2で使用される回転行列は1×3でなければなりません(そして、私は3×3行列を取得するにはロドリゲスの機能を使用したい)が、それが言及した任意の他の組み合わせとして機能していないと思いました間違っている

アイデア?

そして私は、私は文が明確だと思うのOpenCV 2.4.0(多分そこにバグがその方法ではあるが、いくつかの理由のために、私はOpenCVの新しいバージョンを使用することはできません)

答えて

0

を使用しています。私はC#に自信がありませんが、強力な初期化が必要であることがわかります。 ライン

CvMat* tempR = cvCreateMat(1, 3, CV_32F); 

での問題は、すべてのN個のオブジェクトは、使用ポイントのtempRはライン1×3を持っているべきであるということです。この意味で、文は明らか

...calibration.cpp:1495: error: (-5) the output array of rotation vectors must be 3-channel 1xn or nx1 array or 1-channel nx3 or nx9 array, where n is the number of views

なりあなたはそのようなtempR(多かれ少なかれ、私はC#でNを計算する方法がわからない)

CvMat* tempR = cvCreateMat(N, 3, CV_32F); 

からNを抽出するようにしてくださいを作成する必要がありますobject.point.sizeのディメンション。動作しない場合は、image.point.sizeを試してください。

+0

まずは、C++です。なぜあなたはこれがC#だと思いますか?次に、cvCalibrateCamera2を使用した後、50x3の行列(回転行列)と50x3の変換行列を取得すると、nx = 50のビューを持つ場合、3x3カメラ回転行列と1x3変換ベクトルを取得する方法は? –

+0

@never_ever:はい。ステレオキャリブレーション(ステレオキャリブレーション()関数などを使用していないため、私はステレオキャリブレーションとは思えません)を取得することができる回転変換オブジェクトは、チェッカーボードを使用して従来の方法でモノカメラをキャリブレーションしていると仮定しますイメージプレーンから(多くの)チェッカーボードプレーンへの相対的な変換です(逆も同様です)。別の何かが期待されましたか? (C++については間違いですが、私はpythonでopenCVを使い始めました) – marcoresk

関連する問題