ため息申し訳ありませんが、作業中の画像処理コードでIntel IPL(画像処理ライブラリ)を使用しています。これは、画像を正しく回転させるのに苦労した話です。
- ソース画像があります。サイズ(w、h)は必ずしも正方形ではありません。
- 角度シータで回転します。
- 角度シータで回転したサイズ(w、h)の画像に合わせるために必要な出力サイズを計算しました。このサイズは(dw、dh)です。そのサイズの宛先バッファーを割り当てました。
- ソース画像の中心(w / 2、h / 2)を中心に角度シータでソース画像を回転させ、その回転した画像を宛先バッファの中心に配置したいと思います。
iplRotate ()は、 xShiftとyShiftの2つのシフトパラメータを取ります。これらは、回転が実行された後、画像がx軸とy軸に沿ってシフトされる距離を示します。
問題は、回転した画像を宛先画像の中央に配置するようにiplRotateを取得できないことです。それは常に中心から外れています。
xShiftとyShiftがどうあるべきかについての私の最良の推測は、次のとおりです。
- xShift = dw - w
- yShift = dh - h
しかし、これは機能せず、 xShiftとyShiftを計算するために他に何をすべきかわかりません。iplRotateを使用して私がやりたいことを行う方法について誰かが何か提案がありますか?
最後にもう1つ、 iplGetRotateShift()を使用してxShiftとyShiftを計算しようとしましたが、無駄になりました。私はこれがうまくいくと想像します:
iplGetRotateShift(dw / 2.0, dh / 2.0, theta, &xShift, &yShift);
しかし、そうではありません。
編集: IPLの代わりにIntel IPP 6.0を使用してコードを書き直しましたが、同じ間違った結果が表示されます。Intelが2つの異なるライブラリでローテーションを間違えたとは想像できないので、何か間違ったことをしているに違いありません。
編集: Dani van der Meerが提案した次の(IPP)コードを試しました:
xShift = (dw - w) / 2.0;
yShift = (dh - h) / 2.0;
ippiAddRotateShift(w / 2.0, h / 2.0, angle, &xShift, &yShift);
残念ながら、まだ運がありません。それも機能しません。