OpenCVには、グレースケール画像の平行移動および回転アルゴリズムを実装するための関数が付属しています(面内)

float shift_and_rot_test_opencv(cv::Mat des, Vector2f shift, int rot)
{
  float center_x=(DIM_SAMPLE_POINTS_X-1)/2.0;
  float center_y=(DIM_SAMPLE_POINTS_Y-1)/2.0;
  cv::Point center = cv::Point(center_x, center_y);
  double scale = 1.0;
  //img_shift_rot_test = cv::getRotationMatrix2D(center, (double)rot, 1.0);
  cv::Mat trans_mat = cv::getRotationMatrix2D(center, (double)rot, 1.0);
  trans_mat.at<float>(0,2) += shift(0)/SENSOR_RANGE/2.0*DIM_SAMPLE_POINTS_X;
  trans_mat.at<float>(1,2) += -shift(1)/SENSOR_RANGE/2.0*DIM_SAMPLE_POINTS_Y;
  cv::warpAffine(img4, img_shift_rot_test, trans_mat, img4.size());
  cv::absdiff(img_shift_rot_test, des, img_absdiff);
  //img_absdiff *= 0.5;
  float err = 0.0;
  int rows = img_absdiff.rows;
  int cols = img_absdiff.cols;
  for(int row = 0; row < rows; row++)
    for(int col = 0; col < cols; col++)
    {
      err += img_absdiff.at<float>(row, col);
    }
  cv::imshow("error abs", img_absdiff);
  cv::waitKey(10);
  return err/2.0/current_total;
}

getRotationMatrix2D関数は、画像の回転に使用される2Dマトリックス(2 * 3)を取得するために使用されます:https://docs.opencv.org/3.4/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326

次に、warpAffine()関数を使用して変換し、shiftを使用してオフセットを表します。座標系のy軸は、画像のy軸と反対です。

戻り値はエラー率です。

ヒント:計算を高速化するには、cv :: Matタイプの中間データを初期化する必要があります。

おすすめ

転載: blog.csdn.net/li4692625/article/details/109410866