読者です 読者をやめる 読者になる 読者になる

目的of目的

技術的な事とか趣味な事を書いて日本語の練習

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);
                }
            }
           
        }
    }
}