openCV でサブピクセル精度で変換、回転、およびスケーリングを実行しようとしています。
これは、サブピクセル精度で翻訳を行うためのリンクです。
C ++でOpenCVを使用して非常に小さなステップで画像を変換します
したがって、スケーリングと回転についても同じことを行う必要があります。たとえば、画像を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 でサブピクセルの精度を上げるにはどうすればよいですか? または、サブピクセル精度で画像のスケーリングと回転を行うためのアイデアやコードはありますか (前述のリンクで画像変換用に提供されているコードなど)。
アイデアをいただければ幸いです。