【OpenCVSharp + WPF】クソデカ画像をリサイズする

やりたいこと

クソデカ画像をリサイズしたい。

この画像、実は等倍で読み込むとディスプレイ2枚分くらいの大きさになるので、このままだと非常に困る。

f:id:takunology:20220202171722p:plain

やりかた

OpenCVSharp は NuGet から導入できる。(割とアプデが最近だった)

f:id:takunology:20220202173132p:plain

とりあえず WPF で作ってみる。ウィンドウ生成時に画像を表示したいので Loaded イベントにラムダ式を使って画像表示用のメソッドを呼び出す形にしてみた。XAML は特に変更せず、コードビハインドだけ実装。ちなみに、そのまま OpenCVSharp を using ディレクティブに追加すると、Windows.Window と OpenCVSharp.Window でクラス名が衝突するので、名前空間を含めてあげないといけない。

using OpenCvSharp;

public partial class MainWindow : System.Windows.Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += (sender, e) => Sample();
    }

    private void Sample()
    {
        Mat srcImg = Cv2.ImRead(@"C:\Users\<ユーザ名>\Desktop\img.jpeg");
        Mat resizeImg = new Mat();
        // Resize メソッドの第4引数が横方向、第5引数が縦方向の倍率になっている
        Cv2.Resize(srcImg, resizeImg, new OpenCvSharp.Size(), 0.1, 0.1, InterpolationFlags.Area);
        Cv2.ImShow("sample", resizeImg);
    }
}

このまま実行すると DLL ファイルが足りずに例外がスローされる。(なぜ最初から含めてくれないんや。。。)

System.TypeInitializationException: 'The type initializer for 'OpenCvSharp.Internal.NativeMethods' threw an exception.'

f:id:takunology:20220202172509p:plain

なので、GitHub から足りない分を DL する。

github.com

適当に Zip ファイルを展開して、中に入っている OpenCvSharpExtern とやらを実行ファイルのディレクトリ内にコピーしておく。(画像のディレクトリは .NET 6 の場合)

f:id:takunology:20220202172633p:plain

再度実行すると、可愛いサイズで表示された。

f:id:takunology:20220202174357p:plain

なんかどのサイトも C/C++ で作ったコードを読み込ませたり、Python を使えとか、古すぎて存在しないクラスとかメソッドとか使ったりで、あまり情報が無い。。。リファレンスもあったけど 1.0.0 のやつみたいでもしかしたら古いのかもしれない?でも、OpenCVC# で使えるようにしてくれてありがとう。

shimat.github.io

ということで、もし何か発見したらメモがてら記述していくかも?