はじめに
以前、文字認識と顔検出について書きました。どちらも既存の車輪(百度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を提供しているためです。必要に応じて選択してください。
簡から繁へ、そのまま使える
今後の続編も、お楽しみに