チュートリアル: インテル® IPP 9.0 による画像の回転とブラー

インテル® IPP ワープ関数を使用した画像の回転

インテル® IPP 9.0 から、回転パラメーター (角度、x シフト、y シフト) に基づいて事前に計算したアフィン係数を使用して画像の回転を実装する ippiWarpAffine<Interpolation> 関数を利用できるようになりました。指定した回転パラメーターのアフィン係数を取得するには、ippiGetRotateTransform 関数を適用します。この関数は、指定した (0, 0) まわりの角度で画像を回転し、指定した x シフト値と y シフト値で画像をシフトする変換のアフィン係数を計算します。

計算したバウンディング・ボックスを適用して、変換した画像がデスティネーション ROI に合うように、回転した画像の x シフトと y シフトを変更します。 アフィン変換のバウンディング・ボックスを計算するには、ippiGetAffineBound 関数を使用します。

ワープアフィン処理関数を呼び出す前に、次の操作を行う必要があります。

インテル® IPP ワープ関数を使用して画像を回転する方法のサンプルコードを以下に示します。


IppStatus warpAffine(Ipp8u* pSrc, IppiSize srcSize, int srcStep, Ipp8u* pDst, IppiSize dstSize, int dstStep, const double coeffs[2][3])
{
    int specSize = 0, initSize = 0, bufSize = 0;
    Ipp8u* pBuffer  = NULL;
    const Ipp32u numChannels = 3;
    IppiPoint dstOffset = {0, 0};
    IppiBorderType borderType = ippBorderConst;
    IppiWarpDirection direction = ippWarpForward;
    Ipp64f pBorderValue[numChannels];
    IppiWarpSpec* pSpec = NULL;
    IppStatus status = ippStsNoErr;

    for (int i = 0; i < numChannels; ++i) pBorderValue[i] = 255.0;

    /* 指定バッファーと初期化バッファーのサイズ */
    status = ippiWarpAffineGetSize(srcSize, dstSize, ipp8u, coeffs, ippLinear, direction, borderType,
        &specSize, &initSize);

    /* メモリーを割り当て */
    pSpec = (IppiWarpSpec*)ippsMalloc_8u(specSize);

    /* アフィン変換データの初期化 */
    if (status >= ippStsNoErr) status = ippiWarpAffineLinearInit(srcSize, dstSize, ipp8u, coeffs, direction, numChannels, borderType, pBorderValue, 0, pSpec);

    /* ワークバッファーのサイズを取得 */
    if (status >= ippStsNoErr) status = ippiWarpGetBufferSize(pSpec, dstSize, &bufSize);

    pBuffer = ippsMalloc_8u(bufSize);

    /* アフィン変換処理 */
    if (status >= ippStsNoErr) status = ippiWarpAffineLinear_8u_C3R(pSrc, srcStep, pDst, dstStep, dstOffset, dstSize, pSpec, pBuffer);

    /* メモリーを解放 */
    ippsFree(pSpec);
    ippsFree(pBuffer);

    return status;
}

インテル® IPP Warp 関数の詳細は、『インテル® IPP リファレンス・マニュアル』を参照してください。

戻る次へ