C# 顔比較

C# 顔比較

以前に文字認識と顔検出について書きました。どちらも既存のもの(直接百度SDKを呼び出す)を使っています。実はドキュメントをよく見れば、誰でも書き方がわかります。しかも百度は複数の言語のコード例を提供しています。

最終更新 2022/01/20 14:12
Csharp小记
読了目安 3 分
カテゴリ
.NET
タグ
.NET C# 顔比較

はじめに

以前、文字認識と顔検出について書きました。どちらも既存の車輪(百度SDKの直接呼び出し)を利用しており、ドキュメントをよく読めば書き方がわかるもので、百度は複数の言語のコードサンプルも提供しています。

そのため、特に要件がなければ、百度APIを使ってAI機能の一部を実装するコードは今回で一旦終了とします。この3つを書いたのは、日常生活や仕事でこれらのシナリオが比較的多く利用されるからです。

顔比較機能は、一般的に本人の顔と本人確認書類(身分証)との照合に使用されます。

実装機能

  • 2枚の顔画像が同一人物かどうかを検証する

開発環境

  • 開発ツール:Visual Studio 2013

  • .NET Framework バージョン:4.5

実装コード

//公式サイトからAipSdk.dllをダウンロードしてプロジェクトに参照追加
//APIドキュメントURL:https://cloud.baidu.com/doc/FACE/s/Lk37c1tpf

//ご自身のアカウントのapi_keyとsecret_keyを入力
string api_key = "", secret_key = "";

 private void btnCompare_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image == null || pictureBox2.Image == null)
    {
        MessageBox.Show("先に画像をピクチャボックスにコピーしてください");
        return;
    }

    Baidu.Aip.Face.Face client = new Baidu.Aip.Face.Face(api_key, secret_key);
    List<byte[]> list = new List<byte[]>();
    list.Add(ImageToByte((Bitmap)pictureBox1.Image));
    list.Add(ImageToByte((Bitmap)pictureBox2.Image));
    JObject result = client.Match(list);
    if ((int)result["result_num"]==0)
    {
        textBox1.Text = "一致しません";
    }
    else
    {
        JArray jarr = (JArray)result["result"];
        string score = jarr[0]["score"].ToString();
        textBox1.Text = "一致度:" + score;
    }
}

//画像をコピーするメソッド
private Image CopyImage()
{
    try
    {
        Image image = null;
        IDataObject iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.FileDrop))
        {
            object obj = iData.GetData(DataFormats.FileDrop);
            image = Image.FromFile((obj as string[])[0].ToString());
        }
        else if (iData.GetDataPresent(DataFormats.Bitmap))
        {
            object obj = iData.GetData(DataFormats.Bitmap);
            image = obj as Image;
        }
        return image;
    }
    catch { return null; }
}

//画像をbyte[]に変換
public byte[] ImageToByte(Bitmap inImg)
{
    MemoryStream mstream = new MemoryStream();
    inImg.Save(mstream, ImageFormat.Bmp);
    byte[] bytes = new Byte[mstream.Length];
    mstream.Position = 0;
    mstream.Read(bytes, 0, bytes.Length);
    mstream.Close();
    return bytes;
}

private void pictureBox1_Click(object sender, EventArgs e)
{
    //pictureBox1にフォーカスを設定
    pictureBox1.Focus();
}
private void pictureBox2_Click(object sender, EventArgs e)
{
     //pictureBox2にフォーカスを設定
    pictureBox2.Focus();
}
private void pictureBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    //pictureBox1に画像を貼り付け
    if (e.Control && e.KeyCode == Keys.V)
    {
        pictureBox1.Image = CopyImage();
    }
}
private void pictureBox2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    //pictureBox2に画像を貼り付け
    if (e.Control && e.KeyCode == Keys.V)
    {
        pictureBox2.Image = CopyImage();
    }
}

実装効果

百度によると、類似度が80以上であれば同一人物と見なすとされています。

ドキュメントをご覧になる際、公式が提供するパラメータと私が書いたものが異なる場合がありますが、それは公式がV2とV3の2種類のAPIを提供しているためです。必要に応じて選択してください。

簡から繁へ、そのまま使える

今後の続編も、お楽しみに

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む