C# + OpenCvSharpで画像を回転してリサイズする

タイトルの通り、OpenCvSharp(ver.3.x系)を使って画像を左右に90度倒した後、画像をリサイズして、はみだした状態や黒部分が無い状態にします。

回転だけすると以下のように意図しない状態や黒い帯が出て微妙に調整が必要だったりします。

↓これが元画像

f:id:Takachan:20180607002421p:plain

以下のように、パラメータを間違えると、はみ出した上に黒い帯がでて悲惨な感じに。

f:id:Takachan:20180607002443p:plain

なので、回転をサポートする以下のようなメソッドを用意します。

public static void RotateAndResize(Mat src, out Mat dest, bool isRight/*左倒しが基本*/)
{
    dest = new Mat();

    // 本当は大きい辺に合わせるが横長画像と仮定する
    var center = new Point2f(src.Cols / 2, src.Cols / 2);

    Mat rMat = Cv2.GetRotationMatrix2D(center, 90, 1);
    Cv2.WarpAffine(src, dest, rMat, new Size(src.Rows, src.Cols));

    if (isRight)
    {
        Cv2.Flip(dest, dest, FlipMode.XY);
    }
}

で、以下のように呼び出します。

public static void Main(string[] args)
{
    Mat src = Cv2.ImRead(@"C:\Users\Taka\Desktop\img.png");

    RotateAndResize(src, out Mat dest_L, false);
    Cv2.ImWrite(@"C:\Users\Taka\Desktop\img_L.png", dest_L);

    RotateAndResize(src, out Mat dest_R, true);
    Cv2.ImWrite(@"C:\Users\Taka\Desktop\img_R.png", dest_R);
}

実行結果は以下の通りです。

img_L.png、左倒しになります。

f:id:Takachan:20180607003037p:plain

img_R.png、こちらは右倒しです。

f:id:Takachan:20180607003056p:plain

倒した後の左右の向きが気にくわない人はFlipメソッドのFlipMode.XYを適宜変えればだいたい思った通りになると思います。