Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opencv仿射精度_C++_Opencv_Opencv3.0 - Fatal编程技术网

C++ opencv仿射精度

C++ opencv仿射精度,c++,opencv,opencv3.0,C++,Opencv,Opencv3.0,我正在尝试使用OpenCVs WarpeAffine来变换图像。我使用双线性插值选项(默认设置)。当使用非常小的变换(例如,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

我正在尝试使用OpenCVs WarpeAffine来变换图像。我使用双线性插值选项(默认设置)。当使用非常小的变换(例如,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;
注意,当我设置

tfm.at<double>(0,2) = 0.5, 
tfm.at(0,2)=0.5,

相反,warpeaffine可以正确地变换(和插值)图像

你确定transf_img_测试也是CV_64F吗?是的。我有transf_img_test.type()=6,它对应于CV_64FI,没有看到任何明显的错误,我认为它应该可以工作。也许你可以试试0.5到0.01之间的其他值,看看什么时候停止工作,这会给你一些线索。你可以看看OpenCV的源代码,但是有几个实现(cuda、opencl)。看看其中的代码,可能有一个可疑的
round_delta
,可能与你的问题有关(我不太了解所有代码)。我会尝试在img_测试矩阵中输入大于1的值(例如100),看看它是否工作得更好。谢谢。当将值显著高于(或低于)1时,同样的问题仍然存在。
tfm.at<double>(0,2) = 0.5,