2017-07-05 14 views
0

私はOpenCVキャリブレーションに渡すInputArrayOfArraysを生成しようとしています。私はそれがベクトルのベクトルでなければならないと信じています。しかし、私がキャリブレーション関数を呼び出すと、入力と出力の配列が同じサイズではないことを例外として爆発します。私はキャリブレーションコールの外で変換を実行しようとしましたが、結果のInputArrayOfArrays(opとip)は初期化されていないようです(報告されたtotal()サイズはランダムです)。ベクトルを直接調べると、期待どおりのものになります。 ご迷惑をおかけして申し訳ありません。OpenCVのInputArrayOfArrays

{ 
.... 
//pixel position is imagePoints 
std::vector<std::vector<cv::Point> > imagePoints(1); //={ Point(144,103), Point(206,75), Point(109,151), Point(253,159) }; 
imagePoints[0].push_back(Point(144,103)); 
imagePoints[0].push_back(Point(206,75)); 
imagePoints[0].push_back(Point(109,151)); 
imagePoints[0].push_back(Point(253,159)); 
//real world position is object Points 
std::vector<std::vector<cv::Point3d> > objectPoints(1); //={ Point3d(4,3,0), Point3d(7,2,0), Point3d(2,5,0), Point3d(8,6,0)}; 
objectPoints[0].push_back(Point3d(4,3,0)); 
objectPoints[0].push_back(Point3d(7,2,0)); 
objectPoints[0].push_back(Point3d(2,5,0)); 
objectPoints[0].push_back(Point3d(8,6,0)); 

InputArrayOfArrays ip = InputArrayOfArrays(imagePoints); 
InputArrayOfArrays op = InputArrayOfArrays(objectPoints); 

printf("ip (%d, %I64u) op (%d, %I64u)\n", ip.empty(), ip.total(), op.empty(), op.total()); 

fisheye::calibrate(objectPoints, imagePoints, distorted.size(), Ka, Da, rvec, tvec, flag, cv::TermCriteria(3, 20, 1e-6)); 

} 

Ouptutは次のとおりです。
IP(0、18446744073709499195)OP(0、18446744073709499176)
OpenCVのエラー:アサーションは(失敗objectPoints.empty()& & imagePoints.empty()& & objectPoints!!。 cv :: fisheye :: calibrateファイルのC:\ Temp \ OpenCV_3.2_extra \ source \ opencv \ modules \ calib3d \ src \ fisheye.cppの行701

答えて

0

の合計()== imagePoints.total())ベクトルを定義してポイントを正しい方法で追加しているかどうかはわかりません

ことなく、

std::vector<cv::Point2d> imagePoints; //={ Point(144,103), Point(206,75), Point(109,151), Point(253,159) }; 
imagePoints.push_back(Point2d(144,103)); 
imagePoints.push_back(Point2d(206,75)); 
imagePoints.push_back(Point2d(109,151)); 
imagePoints.push_back(Point2d(253,159)); 
//real world position is object Points 
std::vector<cv::Point3d> objectPoints; //={ Point3d(4,3,0), Point3d(7,2,0), Point3d(2,5,0), Point3d(8,6,0)}; 
objectPoints.push_back(Point3d(4,3,0)); 
objectPoints.push_back(Point3d(7,2,0)); 
objectPoints.push_back(Point3d(2,5,0)); 
objectPoints.push_back(Point3d(8,6,0)); 
+0

おかげで違いはありませんでした、次のようにそれをやってみてください。私はそれが配列の配列を取る理由は、複数の画像の校正ポイントを指定することができると思います。私は1つのポイントを提供したいだけです。 –

+0

私はそれをテストできるようにあなたのコードを送ることができますか? – vacky

+0

それ以上はありませんが、私はそれを追加します。 –