こんな動画をみつけたのでC#でもできないかと思い調べてみました。PythonでできることがC#ではできないなんてあってはなりません!(キリッ)

OpenCvSharpを使えばできます。ただWindowsFormsAppではなくWinFormsAppを使います。いつも使っているWindowsFormsAppだとうまくできませんでした。

プロジェクトのプロパティで対象のフレームワークは「.NET 5.0」を選択。

これでコンパイルすると

Microsoft.NET.Sdk.WindowsDesktop SDK を使用する必要はなくなりました。
ルート プロジェクト要素の SDK 属性を ‘Microsoft.NET.Sdk’ に変更することをご検討ください。

という警告がでます。これはプロジェクトファイル(.csproj)を変更すれば解決します。

1 行目に
<Project Sdk=”Microsoft.NET.Sdk.WindowsDesktop”>
と書かれていますが、これを
<Project Sdk=”Microsoft.NET.Sdk”>
に変更すると、警告が表示されなくなります。

ではNuGetでOpenCvSharp4.Windowsをインストールしましょう。そしてコードの上のほうに

と書きます。ファイルを操作するのでSystem.IOも使います。

次に画像の顔検出などを機械学習に関連した学習済みデータの分類器をダウンロードします。ここからダウンロードしましょう。

https://github.com/opencv/opencv/tree/master/data/haarcascades

今回使用するのはhaarcascade_frontalface_default.xmlですが、他にも以下のようなものがあります。

ファイル名 内容
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml 眼鏡
haarcascade_frontalcatface.xml 猫の顔(正面)
haarcascade_frontalcatface_extended.xml 猫の顔(正面)
haarcascade_frontalface_alt.xml 顔(正面)
haarcascade_frontalface_alt2.xml 顔(正面)
haarcascade_frontalface_alt_tree.xml 顔(正面)
haarcascade_frontalface_default.xml 顔(正面)
haarcascade_fullbody.xml 全身
haarcascade_lefteye_2splits.xml 左目
haarcascade_licence_plate_rus_16stages.xml ロシアのナンバープレート(全体)
haarcascade_lowerbody.xml 下半身
haarcascade_profileface.xml 顔(証明写真)
haarcascade_righteye_2splits.xml 右目
haarcascade_russian_plate_number.xml ロシアのナンバープレート(数字)
haarcascade_smile.xml 笑顔
haarcascade_upperbody.xml 上半身

これらを実行ファイルと同じ場所におきます。
注:サンプルプログラムでは指定しやすいように同じフォルダに置いているだけです。管理しやすい場所であればどこでもいいです。

では準備が整ったところではじめましょう。

まずボタンが押されたら処理の対象になる画像ファイルを選択させる処理を示します。選択されたファイルが存在し、画像ファイルなのかどうかも確認して問題なければファイルパスを返します。画像ファイルかどうかはImage.FromFile(filePath)メソッドを実行して例外が発生しないかどうかで判断しています。

処理対象の画像ファイルのパスが取得できたら顔認識の処理をして、該当部分を矩形で囲ったBitmapを取得します。

フォーム上にピクチャーボックスを置き、ボタンが押されたら顔認識された部分が矩形で囲われたビットマップを表示させます。別のボタンを押したらファイルとして保存できるようにGetResultBitmapメソッドが返したビットマップはフィールド変数に保存しておきます。

以下は顔認識された部分が矩形で囲われたビットマップをファイルとして保存する処理です。

最後に終了するときですが、なぜか終了後もプロセスが残ってしまいます。そこでEnvironment.Exit メソッドで強制的に終了させます。

実行結果ですが、顔の方向が悪いとうまく認識されません。

使用した写真

https://www.photo-ac.com/main/detail/4191092
https://www.photo-ac.com/main/detail/1597634
https://www.photo-ac.com/main/detail/3214135