使用openCV在C ++中以小步长和子像素精度对图像进行平移,旋转和缩放

时间:2016-11-12 15:06:26

标签: c++ opencv rotation scaling subpixel

我正在尝试在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中增加子像素精度? 要么 是否存在按子像素精度进行图像缩放和旋转的想法或代码(如上述链接中为图像转换提供的代码)?

我很感激任何想法。

0 个答案:

没有答案