亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#開發的人臉左右相似度計算軟件源碼分析

2020-01-24 01:57:00
字體:
來源:轉載
供稿:網友

本文實例講述了C#開發的人臉左右相似度計算軟件。分享給大家供大家參考。具體分析如下:

模仿湖南衛視快樂大本營中所使用的一款人臉左右對稱相似度計算軟件,自己寫的一個小軟件,使用語言是C#,希望跟喜歡這個軟件的同志們共享!

1. FaceClass類程序

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using System.Drawing.Drawing2D;namespace FaceSmile{ class FaceClass {  /// <summary>  /// 左臉對稱函數  /// </summary>  /// <param name="a"></param>  /// <returns></returns>  public static Bitmap FaceFlipLeft(Bitmap a)  {   Rectangle rect = new Rectangle(0, 0, a.Width, a.Height);   System.Drawing.Imaging.BitmapData srcData = a.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, a.PixelFormat);   IntPtr ptr = srcData.Scan0;   int bytes = 0;   bytes = srcData.Stride * a.Height;   byte[] grayValues = new byte[bytes];   System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);   byte[] temp = new byte[bytes];   temp = (byte[])grayValues.Clone();   for (int j = 0; j < a.Height; j++)   {    for (int i = 0; i < (int)(a.Width/2); i++)    {     temp[(a.Width - 2 - i) * 3 + j * srcData.Stride] = temp[i * 3 + j * srcData.Stride];     temp[(a.Width - 2 - i) * 3 + 1 + j * srcData.Stride] = temp[i * 3 + 1 + j * srcData.Stride];     temp[(a.Width - 2 - i) * 3 + 2 + j * srcData.Stride] = temp[i * 3 + 2 + j * srcData.Stride];    }   }   grayValues = (byte[])temp.Clone();    System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);   a.UnlockBits(srcData);   return a;  }  /// <summary>  /// 右臉對稱函數  /// </summary>  /// <param name="a"></param>  /// <returns></returns>  public static Bitmap FaceFlipRight(Bitmap a)  {   Rectangle rect = new Rectangle(0, 0, a.Width, a.Height);   System.Drawing.Imaging.BitmapData srcData = a.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, a.PixelFormat);   IntPtr ptr = srcData.Scan0;   int bytes = 0;   bytes = srcData.Stride * a.Height;   byte[] grayValues = new byte[bytes];   System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);   byte[] temp = new byte[bytes];   temp = (byte[])grayValues.Clone();   for (int j = 0; j < a.Height; j++)   {    for (int i = 0; i < (int)(a.Width / 2); i++)    {     temp[i * 3 + j * srcData.Stride] = temp[(a.Width - 2 - i) * 3 + j * srcData.Stride];     temp[i * 3 + 1 + j * srcData.Stride] = temp[(a.Width - 2 - i) * 3 + 1 + j * srcData.Stride];     temp[i * 3 + 2 + j * srcData.Stride] = temp[(a.Width - 2 - i) * 3 + 2 + j * srcData.Stride];    }   }   grayValues = (byte[])temp.Clone();   System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);   a.UnlockBits(srcData);   return a;  }  /// <summary>  /// 定義膚色檢測函數  /// </summary>  /// <param name="a"></param>  /// <returns></returns>  public static Bitmap SkinDetect(Bitmap a)  {   Rectangle rect = new Rectangle(0, 0, a.Width, a.Height);   System.Drawing.Imaging.BitmapData bmpData = a.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);   int stride = bmpData.Stride;   unsafe   {    byte* pIn = (byte*)bmpData.Scan0.ToPointer();    byte* P;    int R, G, B;    double r, g, Fupr, Flor, Wrg;    for (int y = 0; y < a.Height; y++)    {     for (int x = 0; x < a.Width; x++)     {      P = pIn;      B = P[0];      G = P[1];      R = P[2];      if (R + G + B == 0)      {       r = 0;       g = 0;      }      else      {       r = (R / (R + G + B));       g = (G / (R + G + B));      }      Fupr = (1.0743 * r + 0.1452 - 1.3767 * r * r);      Flor = (0.5601 * r + 0.1766 - 0.776 * r * r);      Wrg = (r - 0.33) * (r - 0.33) + (g - 0.33) * (g - 0.33);      if ((R - G >= 45) && ((R > G) && (G > B)) && (Fupr > g) && (Wrg >= 0.0004))      {       P[0] = (byte)B;       P[1] = (byte)G;       P[2] = (byte)R;      }      else      {       P[0] = 0;       P[1] = 0;       P[2] = 0;      }      pIn += 3;     }     pIn += stride - a.Width * 3;    }   }   a.UnlockBits(bmpData);   return a;  }  /// <summary>  /// 定義圖像灰度化函數  /// </summary>  /// <param name="src"></param>  /// <returns></returns>  public static Bitmap ImageGray(Bitmap src)  {   int w = src.Width;   int h = src.Height;   //構建與原圖像大小一樣的模版圖像   Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);   //將原圖像存入內存   System.Drawing.Imaging.BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);   System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);   unsafe   {    byte* pIn = (byte*)srcData.Scan0.ToPointer();    byte* pOut = (byte*)dstData.Scan0.ToPointer();    byte* p;    int stride = srcData.Stride;    int r, g, b;    for (int y = 0; y < h; y++)    {     for (int x = 0; x < w; x++)     {      p = pIn;      r = p[2];      g = p[1];      b = p[0];      //調用圖像灰度化公式      pOut[0] = pOut[1] = pOut[2] = (byte)(b * 0.114 + g * 0.587 + r * 0.299);      pIn += 3;      pOut += 3;     }     pIn += srcData.Stride - w * 3;     pOut += srcData.Stride - w * 3;    }    src.UnlockBits(srcData);    dstBitmap.UnlockBits(dstData);    return dstBitmap;   }  } }}

2. SameRatioClass類程序

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using System.Drawing.Drawing2D;namespace FaceSmile{ class SameRatioClass {  /// <summary>  /// 左右臉相似度函數  /// </summary>  /// <param name="src"></param>  /// <param name="dst"></param>  /// <returns></returns>  public static double SameRatio(Bitmap src, Bitmap dst)  {   byte[] srcData = GetBytes(src);   byte[] dstData = GetBytes(dst);   double ratio = 0;   int sum = 0;   int std=0;   for (int i = 0; i < srcData.Length; i++)   {    sum += Math.Abs(srcData[i] - dstData[i]);    std += srcData[i];   }   ratio = 100-(double)(100*sum / std);   return ratio;  }  /// <summary>  /// 得到圖像信息函數  /// </summary>  /// <param name="src"></param>  /// <returns></returns>  private static byte[] GetBytes(Bitmap src)  {   int w = src.Width;   int h = src.Height;   byte[] dataImage = new byte[w * h];   System.Drawing.Imaging.BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);      unsafe   {    byte* pIn = (byte*)srcData.Scan0.ToPointer();        byte* p;    int stride = srcData.Stride;    int r, g, b;    for (int y = 0; y < h; y++)    {     for (int x = 0; x < w; x++)     {      p = pIn;      r = p[2];      g = p[1];      b = p[0];      dataImage[x + y * x] = (byte)((r + g + b) / 3);      pIn += 3;           }     pIn += srcData.Stride - w * 3;         }    src.UnlockBits(srcData);    return dataImage;   }  } }}

3. 主窗體程序

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace FaceSmile{ public partial class Form1 : Form {  public Form1()  {   InitializeComponent();   groupBox1.Visible = true;   groupBox2.Visible = false;  }  #region 全局變量定義  //定義原始圖像變量  private Bitmap src ;  //定義圖像相似度變量  private double ratio = 0;  //定義圖像路徑變量  private string curFileName;  //定義人臉位置圖像調整變量  private int numAdjust = 0;  #endregion  #region 軟件操作  //左臉對稱  private void button1_Click(object sender, EventArgs e)  {   if (src != null)   {    Bitmap temp = (Bitmap)src.Clone();    Bitmap a = FaceClass.FaceFlipLeft(temp);    pictureBox1.Image = (Image)a;    ratio = SameRatioClass.SameRatio(a, src);    label1.Text = ratio.ToString();   }   else   {    MessageBox.Show("Please open one image!");   }  }  //右臉對稱  private void button2_Click(object sender, EventArgs e)  {   if (src != null)   {    Bitmap temp = (Bitmap)src.Clone();    Bitmap a = FaceClass.FaceFlipRight(temp);    pictureBox1.Image = (Image)a;    ratio = SameRatioClass.SameRatio(a, src);    label1.Text = ratio.ToString();   }   else   {    MessageBox.Show("Please open one image!");   }  }  //打開圖像  private void button3_Click(object sender, EventArgs e)  {   OpenImage();   if (src != null)   {    pictureBox1.Image = (Image)src;    pictureBox1.Width = src.Width;    pictureBox1.Height = src.Height;   }   else   {    MessageBox.Show("Please open one image!");   }  }  //保存圖像  private void button4_Click(object sender, EventArgs e)  {   SaveImage();  }  //圖像打開函數  private void OpenImage()  {   try   {    ofd.Filter = "All files (*.*)|*.*|bmp files (*.bmp)|*.bmp|jpeg files (*.jpg)|*.jpg|png files (*.png)|*.png";    ofd.Title = "打開";    ofd.ShowHelp = true;    if (ofd.ShowDialog() == DialogResult.OK)    {     curFileName = ofd.FileName;     src = new Bitmap(curFileName);    }   }   catch (Exception ex)   {    MessageBox.Show(ex.Message);   }  }  //圖像保存函數  private void SaveImage()  {   try   {    sfd.Filter = "保存(*.bmp)|*.bmp";    sfd.Title = "保存";    sfd.ShowHelp = true;    if (sfd.ShowDialog() == DialogResult.OK)    {     Bitmap temp = (Bitmap)pictureBox1.Image;     temp.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Bmp);    }   }   catch (Exception ex)   {    MessageBox.Show(ex.Message);   }  }  //其他操作  private void button5_Click(object sender, EventArgs e)  {   groupBox2.Location = new Point(groupBox1.Location.X, groupBox1.Location.Y);   groupBox2.Visible = true;   groupBox1.Visible = false;  }  //膚色檢測  private void button6_Click(object sender, EventArgs e)  {   if (pictureBox1.Image != null)   {    pictureBox1.Image = (Image)FaceClass.SkinDetect((Bitmap)pictureBox1.Image);   }   else   {    MessageBox.Show("Please open one image!");   }  }  //返回操作  private void button7_Click(object sender, EventArgs e)  {   groupBox1.Visible = true;   groupBox2.Visible = false;  }  //灰度化  private void button8_Click(object sender, EventArgs e)  {   if (pictureBox1.Image != null)   {    pictureBox1.Image = (Image)FaceClass.ImageGray((Bitmap)pictureBox1.Image);   }   else   {    MessageBox.Show("Please open one image!");   }  }  //博客連接  private void label2_Click(object sender, EventArgs e)  {   System.Diagnostics.Process.Start("IEXPLORE.EXE", "http://dongtingyueh.blog.163.com/");  }  //修正人臉位置  private void button9_Click(object sender, EventArgs e)  {   if (numAdjust != 0)   {    int a = numAdjust;    int b = src.Width - a;    int result = a < b ? a : b;    if (result == b)    {     src = src.Clone(new Rectangle(src.Width - 2 * result, 0, 2 * result, src.Height), src.PixelFormat);    }    else    {     src = src.Clone(new Rectangle(0, 0, 2 * result, src.Height), src.PixelFormat);    }    pictureBox1.Image = (Image)src;    pictureBox1.Width = src.Width;    pictureBox1.Height = src.Height;   }   trackBar1.Value = 0;   label4.Text = "0";  }  #endregion  #region 人臉位置修正  private void trackBar1_Scroll(object sender, EventArgs e)  {   if (src != null)   {    trackBar1.Maximum = src.Width;    trackBar1.Minimum = 0;    numAdjust = trackBar1.Value;    label4.Text = numAdjust.ToString();   }   else   {    MessageBox.Show("Please open one image!");   }  }  private void trackBar1_ValueChanged(object sender, EventArgs e)  {   pictureBox1.Invalidate();  }  private void trackBar1_MouseUp(object sender, MouseEventArgs e)  {   if (src != null)   {    Graphics g = pictureBox1.CreateGraphics();    g.DrawLine(new Pen(Color.Red, 2), new Point((int)(numAdjust), 0), new Point((int)(numAdjust), src.Height));    g.Dispose();   }   else   {    MessageBox.Show("Please open one image!");   }  }  #endregion }}

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放国产精品| 亚洲美女免费精品视频在线观看| 狠狠久久亚洲欧美专区| 亚洲男人第一网站| 久久深夜福利免费观看| 日韩一区二区三区国产| 国模精品系列视频| 精品国产999| 中文字幕在线观看日韩| 日韩av网站电影| 国产精品草莓在线免费观看| 国产成人激情视频| 亚洲精品在线不卡| 韩国精品美女www爽爽爽视频| 国产精品2018| 日韩高清a**址| 亚洲精品黄网在线观看| 国产精品网址在线| 欧美日韩第一页| 久久免费视频在线观看| 欧美在线国产精品| 久久久久久香蕉网| 精品香蕉在线观看视频一| 成人黄色免费网站在线观看| 国产91精品久| 欧美亚洲一区在线| 中文字幕日韩在线观看| 中文字幕日韩欧美| 91最新在线免费观看| 欧美激情一二三| 亚洲黄色av网站| 国产一区二区免费| 亚洲最新av在线网站| 国产精品视频色| 国产精品视频男人的天堂| 亚洲bt欧美bt日本bt| 亚洲黄页网在线观看| 欧美日韩中文字幕日韩欧美| 亚洲欧美在线磁力| 亚洲欧美另类在线观看| 91精品国产91久久| 色综合久久88色综合天天看泰| 自拍偷拍亚洲精品| 97激碰免费视频| 性欧美激情精品| 国产一区二区在线免费视频| 日韩成人中文电影| 国产日本欧美在线观看| 一区二区三区久久精品| 91精品国产91久久久久久| 精品久久久久久久久久ntr影视| 久久精品欧美视频| 91精品国产综合久久久久久久久| 欧美性极品xxxx做受| 日韩视频免费中文字幕| 国产精国产精品| 日韩电影中文字幕在线| 成人xxxxx| 97精品国产aⅴ7777| 中文字幕精品国产| 国产精品电影网站| 日韩高清免费在线| 日本高清不卡的在线| 亚洲最大成人免费视频| 精品欧美aⅴ在线网站| 日本中文字幕成人| 欧美裸体xxxxx| 亚洲欧美在线一区二区| 国产精品久久久久久久9999| 久久噜噜噜精品国产亚洲综合| 欧美成人激情在线| 亚洲精品一区av在线播放| 欧美自拍视频在线| 一区二区欧美亚洲| 日韩av在线天堂网| 精品视频久久久久久| 亚洲wwwav| 国产精品旅馆在线| 精品视频在线导航| 伦伦影院午夜日韩欧美限制| 欧美多人爱爱视频网站| 国内精品小视频在线观看| 久久免费精品视频| 欧美另类高清videos| 日韩福利视频在线观看| 精品在线观看国产| 久久精品国产2020观看福利| 最近2019中文免费高清视频观看www99| 欧美视频在线视频| 久久久久久69| 国产精品自产拍高潮在线观看| 深夜精品寂寞黄网站在线观看| 亚洲国产中文字幕在线观看| 色综合久综合久久综合久鬼88| 永久免费毛片在线播放不卡| 国产精品96久久久久久| 狠狠色狠狠色综合日日小说| 欧美激情乱人伦| 国语自产精品视频在线看抢先版图片| 在线观看不卡av| 国产v综合v亚洲欧美久久| 69久久夜色精品国产69乱青草| 成人免费观看49www在线观看| 久久久精品视频在线观看| 精品久久久久久| 国产亚洲成av人片在线观看桃| 日韩视频中文字幕| 国产精品一区二区三区久久久| 欧美在线性视频| 久久人人爽人人爽人人片亚洲| 久久久噜噜噜久久| 亚洲美女在线看| 98精品国产高清在线xxxx天堂| 91亚洲永久免费精品| 人人爽久久涩噜噜噜网站| 国产日韩精品视频| 亚洲自拍另类欧美丝袜| 亚洲精品一区在线观看香蕉| 亚洲人成电影在线观看天堂色| 午夜精品美女自拍福到在线| 17婷婷久久www| 福利视频一区二区| 九九视频直播综合网| 亚洲japanese制服美女| 久久综合久中文字幕青草| 国产综合视频在线观看| xxxxxxxxx欧美| 91理论片午午论夜理片久久| 在线观看91久久久久久| 日韩欧美成人精品| 自拍偷拍亚洲欧美| 日本视频久久久| 欧美性videos高清精品| 日韩在线欧美在线| 亚洲电影天堂av| 日本人成精品视频在线| 精品福利在线观看| 亚洲欧洲激情在线| 国产成人精品视频| 国产精品成人v| 福利一区福利二区微拍刺激| 懂色av中文一区二区三区天美| 亚洲老头同性xxxxx| 国外成人性视频| 欧美视频在线免费| 69av成年福利视频| 97在线视频一区| 欧美不卡视频一区发布| 奇门遁甲1982国语版免费观看高清| 69久久夜色精品国产69乱青草| 亚洲欧洲在线播放| 2019中文在线观看| 色老头一区二区三区在线观看| 不用播放器成人网| 91久久综合亚洲鲁鲁五月天| 中文字幕免费国产精品| 欧美国产在线视频| 精品激情国产视频| 国产一区二区日韩精品欧美精品| 68精品国产免费久久久久久婷婷| 精品久久久91| 亚洲精品资源美女情侣酒店| 国产精品美女呻吟| 亚洲欧美中文日韩v在线观看|