Opencv 9点標定_精度とHALCONの結果はわずか(±0.2 mm)

3004 ワード

多くの初心者は、標定の概念があいまいで、座標系の関係がはっきりしていないので、カメラ標定とロボットカメラ標定がどのような関係があるのか分からないので、当初は自分も一人で長い間模索していたと思います.
我々が一般的に言うカメラ標定は2つに分けられ,1つはカメラパラメータの標定であり,これは一般的に張氏標定法に用いられ,標定の役割はカメラ自身の歪みを補正し,補正したパラメータを用いて図形を処理してから提示することである.この方面の資料については、ネット上では、私もこれ以上説明しません.一般的なマニピュレータの位置決めもこの標定は行われません.現在のカメラの歪みはまだ小さいので、精度は多くの要求を満たすことができます.
本文は第2種を紹介して、カメラとマニピュレータの間の標定、作用:カメラの座標系とマニピュレータの座標系の間の関係を創立して、つまりマニピュレータに目をつけて、それをどこに行かせてどこに行きます.
よく使われる方法は9点標定で、使用される関数はEstimateRigidTransformで、ネット上でestimateRigidTransformについての詳細な説明は少なく、Emgucvはほとんどありません.当時Nを探していたが、opencvには座標系変換のアルゴリズムがないと思っていたが、もう少しでhalconに駆けつけるところだった.opencvの機械視覚面での応用はhalconに全く及ばないと言わざるを得なかった.EstimateRigidTransformには2つの方法があります.
方法1:Mat EstimateRigidTransform(PointF[]sourcePoints,PointF[]destinationPoints,bool fullAffine);2*3のdoubleのマトリクスを返します.
最初のパラメータsourcePoints:前の画像の点(カメラ座標系の下の点)を交換します.
2番目のパラメータdestinationPoints:変換後の画像上の点(マニピュレータ座標系下の点)
3番目のパラメータfullAffine:TRUE(rotation,translation,scaling,shearing,reflectionを含む全シミュレーション変換)
FALSE(コンストレイント付きアフィニティ変換)
方法2:Mat EstimateRigidTransform(IinputArray src,IinputArray dst,bool fullAffine);//画像を返す
最初のパラメータsrc:変換前の画像
2番目のパラメータdst:変換前の画像
3番目のパラメータfullAffine:TRUE(rotation,translation,scaling,shearing,reflectionを含む全シミュレーション変換)
FALSE(コンストレイント付きアフィニティ変換)
座標点が必要なので、最初の関数を選択します.9点の標定を採用するのは点数が多ければ多いほど正確であるが、多ければ多いほど良いわけではない.点数が多ければ多いほど標定も面倒になるため、選択した9点はカメラの真ん中でエッジにあまり近づかず、位置決めする点に配慮すればよい.最低でもマニピュレータとカメラで各2点を結ぶ必要があります.
標定手順:
0.準備作業:カメラ位置、マニピュレータ位置は全部固定して、標定針はマニピュレータに固定して、固定してから移動できない.標定針の位置は必ずクランプまたは吸盤内の工具と同じ位置の高さでなければならない.
1.標定板を作ります.条件が合わない場合は、普通の紙で9個の円を描き、印刷すればいいです.
2.標定板をカメラの下に置き、位置領域はマニピュレータが動作する領域と同じで、高さを含めてできるだけ一致しなければならない.これは標定精度の鍵である.
3.カメラの焦点距離を調整して、写真を撮って、それから9つの点の座標を識別して、どのように円を探すかについて、opecvのホフが円を探すのは非常に誤審しやすくて、比較的に良い方法は輪郭を採用して円を探す法です.これもブログを書いて話したいです.
4.マニピュレータを9の円の中心に順次移動し、マニピュレータ座標(9個)をメモする
5.マニピュレータ座標destinationPointsとカメラ座標sourcePointsを代入する方法EstimateRigidTransformで、2*3の行列を算出できます.
6.得られた標定パラメータに従って、画像の下のすべての座標をロボットの座標に変換することができ、ロボットは画像上の指定された位置に移動することができる.
座標変換方法:
Point2d cal_Rob_Coordinate(Point2d points_camera)
{
	Point2d Rob_coordinate;
	double A = _Hom_mat2d.ptr(0)[0];
	double B = _Hom_mat2d.ptr(0)[1];
	double C = _Hom_mat2d.ptr(0)[2];
	double D = _Hom_mat2d.ptr(1)[0];
	double E = _Hom_mat2d.ptr(1)[1];
	double F = _Hom_mat2d.ptr(1)[2];
	Rob_coordinate.x = (A * points_camera.x) + (B * points_camera.y) + C;
	Rob_coordinate.y = (D * points_camera.x) + (E * points_camera.y) + F;
	return Rob_coordinate;
}

以下は2020年12月25日に追加された内容です.第6歩ではopencvsharpでMat.を発見しました.Ptr()の結果はopencvとは異なります.
Opencvsharp var A=Hom_と書いてくださいmat2d.Get (    ,    );
これで、標定が終わり、マニピュレータを自由に遊んで、物体に向かって写真を撮って、挟む点を位置決めして、以上の標定で得られたパラメータに基づいてマニピュレータ座標系の座標に換算して、座標を通信プロトコルを通じてマニピュレータに伝達することができます.
親測精度とHALCONの計算結果はわずか(±0.2 mm)
 
参照先:https://www.cnblogs.com/thebreeze/p/10316030.html