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 유형의 중간 데이터를 초기화해야합니다.