小萝莉 通过本文主要向大家介绍了c#人脸识别源码,c#人脸识别,c#实现人脸识别,c#人脸检测,c# oa源码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
本文实例讲述了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;
}
}
}
}
</div>
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;
}
}
}
}
</div>
3. 主窗体程序
using System; using System.Col

