[PCL, OpenCV] OpenCVやPCLでの剛体変換の計算

(To be written)

Case 1: OpenCV系のクラスで剛体変換行列を取り扱う場合

こちらのほうがたいへん簡単.PCLを使わなくてもいい時などはこちらで行う方がベター.

たとえば,

cv::Mat transMat( 4, 4, CV_64F );

という行列を考えると,

cv::Point3d  point;

という成分を加える最も単純な方法は

transMat.at<double>( 0, 3 ) += point.x;
transMat.at<double>( 1, 3 ) += point.y;
transMat.at<double>( 2, 3 ) += point.z;

とするとよい.回転も同様.

剛体変換行列の合成

cv::Mat transMatA2B, transMatA2C;

が定義されている場合,合成は単に

transMatB2C = transMatA2C * transMatA2B.inv();

のように行える.先の平行移動もすべて行列の形で扱った方が,個人的には見通しが良い

(速度の問題を抱えている場合を除いては…).

すなわち

cv::Mat point;
point = cv::Mat().eye( 4, 4, CV_64F );
transMat.at<double>( 0, 3 ) += point.x;
transMat.at<double>( 1, 3 ) += point.y;
transMat.at<double>( 2, 3 ) += point.z;
transMat * point;