我正在尝试使用OpenCVs warpAffine来转换图像。我使用双线性插值选项(默认设置)。当使用非常小的变换(例如,0.01像素的平移)时,变换后的图像与原始图像完全相同。这是有问题的,因为我需要一个很大的精度,因为对变换后的图像进行了进一步的计算。
示例:
Mat img_test = (Mat_<double>(5,5) << 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0);
Mat tfm; Mat transf_img_test;
tfm = Mat::eye(2,3,CV_64F);
tfm.at<double>(0,2) = 0.01;
warpAffine( img_test, transf_img_test, tfm, img_test.size(), INTER_LINEAR);
cout << "Original = " << img_test << endl;
cout << "Transformed = " << transf_img_test << endl;
两张图片完全相同:
Original = [0, 0, 0, 0, 0;
0, 0, 1, 0, 0;
0, 0, 1, 0, 0;
0, 0, 1, 0, 0;
0, 0, 0, 0, 0]
Transformed = [0, 0, 0, 0, 0;
0, 0, 1, 0, 0;
0, 0, 1, 0, 0;
0, 0, 1, 0, 0;
0, 0, 0, 0, 0]
请注意,当我设置
时tfm.at<double>(0,2) = 0.5,
相反,warpAffine正确地转换(和插值)图像。