OpenCVSharpを使ってカメラから顔認識モザイク
C#でOpenCV使うにはEmgu CVとかもあるわけですが今回はOpenCVSharpを使用しました。
ほとんどサンプルからコピペだけどね!
参考にさせていただいたのは
opencvsharp - OpenCV wrapper for .NET Framework - Google Project Hostingschima.hatenablog.com
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using OpenCvSharp; using System.Diagnostics; namespace mo { static class Program { static IplImage FaceDe(IplImage srcImg) { CvColor[] colors = new CvColor[]{ new CvColor(0,0,255), new CvColor(0,128,255), new CvColor(0,255,255), new CvColor(0,255,0), new CvColor(255,128,0), new CvColor(255,255,0), new CvColor(255,0,0), new CvColor(255,0,255), }; const double Scale = 1.04; const double ScaleFactor = 1.139; const int MinNeighbors = 2; using (IplImage smallImg = new IplImage(new CvSize(Cv.Round(srcImg.Width / Scale), Cv.Round(srcImg.Height / Scale)), BitDepth.U8, 1)) { // 顔検出用の画像の生成 using (IplImage gray = new IplImage(srcImg.Size, BitDepth.U8, 1)) { Cv.CvtColor(srcImg, gray, ColorConversion.BgrToGray); Cv.Resize(gray, smallImg, Interpolation.Linear); Cv.EqualizeHist(smallImg, smallImg); } //using (CvHaarClassifierCascade cascade = Cv.Load<CvHaarClassifierCascade>(Const.XmlHaarcascade)) // どっちでも可 using (CvHaarClassifierCascade cascade = CvHaarClassifierCascade.FromFile("haarcascade_frontalface_alt.xml")) // using (CvMemStorage storage = new CvMemStorage()) { storage.Clear(); // 顔の検出 CvSeq<CvAvgComp> faces = Cv.HaarDetectObjects(smallImg, cascade, storage, ScaleFactor, MinNeighbors, 0, new CvSize(30, 30)); // モザイク処理 for (int d = 0; d < faces.Total; d++) { CvRect r = faces[d].Value.Rect; for (int y = r.Y; y < r.Bottom; y += 10) { for (int x = r.X; x < r.Right; x += 10) { int red = 0, green = 0, blue = 0; for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j++) { CvColor color = srcImg[y + i, x + j]; red += color.R; green += color.G; blue += color.B; } } red /= 400; green /= 400; blue /= 400; for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j++) { srcImg[y + i, x + j]=new CvColor((byte)red,(byte)green,(byte)blue); } } } } } return srcImg; } } } /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { using (CvCapture cap = CvCapture.FromCamera(0)) // device type + camera index using (CvWindow w = new CvWindow("FuctionMosaic")) { while (CvWindow.WaitKey(10) < 0) { IplImage img = new IplImage(); img = cap.QueryFrame(); w.Image = FaceDe(img); } } } } }