我正在尝试在openCV中使用子像素精度进行平移,旋转和缩放。
这是使用subpixel pecision进行翻译的链接:
Translate image by very small step by OpenCV in C++
所以,我需要对缩放和旋转做同样的事情,例如当我将图像旋转2度时它可以工作但是当我将它旋转1度或低于1度时它不起作用,并且旋转的结果2度与旋转2.1度相同!
在提供的链接中提到我可以通过更改imgproc.hpp中的以下代码来提高精度
enum InterpolationMasks {
INTER_BITS = 5,
INTER_BITS2 = INTER_BITS * 2,
INTER_TAB_SIZE = 1 << INTER_BITS,
INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE
};
以下是轮换示例: 源图像如下:
0 0 0 0
0 255 255 0
0 255 255 0
0 0 0 0
我正在对图像中心进行旋转。
旋转1度时,结果与源图像相同!
对于旋转2度,结果与旋转相同2.1度(不应该)!
这是一段代码:
Mat rotateImage(Mat sourceImage, double rotationDegree){
Mat rotationMatrix, rotatedImage;
double rowOfImgCenter, colOfImgCenter;
rowOfImgCenter = scaledImage.rows / 2.0 - 0.5;
colOfImgCenter = scaledImage.cols / 2.0 - 0.5;
Point2d imageCenter(colOfImgCenter, rowOfImgCenter);
rotationMatrix = getRotationMatrix2D(imageCenter, rotationDegree, 1.0);
warpAffine(scaledImage, rotatedImage, rotationMatrix, scaledImage.size(), INTER_AREA);
return rotatedImage;
}
当我检查提供的翻译代码时,它的工作精度为1e-7但是当我在1e-8列中进行翻译时,它给了我源图像而不是翻译它(这是不正确的),当我这样做时matlab中的代码给出了以下正确的结果(我希望在c ++中具有相同的结果且具有良好的准确性):
0 0 0 0
0 2.5499999745e+02 255 2.549999976508843e-06
0 2.5499999745e+02 255 2.549999976508843e-06
0 0 0 0
当我将图像旋转1度旋转时,结果应如下所示(这是我在matlab中得到的并且在c ++中需要相同的结果) (我必须删除一些数字(降低准确性),以便矩阵适合这里)
0 0 1.1557313 0
1.1557313 2.5497614e+02 2.549761e+02 0
0 2.5497614e+02 2.549761e+02 1.1557313
0 1.1557313 0 0
现在我的问题是如何在openCV中增加子像素精度? 要么 是否存在按子像素精度进行图像缩放和旋转的想法或代码(如上述链接中为图像转换提供的代码)?
我很感激任何想法。