Esempio n. 1
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="trackbarName">トラックバーの名前</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="trackbarName">Name of created trackbar. </param>
        /// <param name="value">The position of the slider</param>
        /// <param name="max">Maximal position of the slider. Minimal position is always 0. </param>
        /// <param name="callback">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public CvTrackbar CreateTrackbar(string trackbarName, int value, int max, CvTrackbarCallback callback)
        {
            var trackbar = new CvTrackbar(trackbarName, name, value, max, callback);

            trackbars.Add(trackbarName, trackbar);
            return(trackbar);
        }
Esempio n. 2
0
        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="window">トラックバーの親ウィンドウ名</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="name">Trackbar name</param>
        /// <param name="window">Window name</param>
        /// <param name="value">Initial slider position</param>
        /// <param name="max">The upper limit of the range this trackbar is working with. </param>
        /// <param name="callback">Callback handler</param>
#endif
        public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback callback)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (string.IsNullOrEmpty(window))
            {
                throw new ArgumentNullException(nameof(window));
            }

            this.name     = name;
            this.window   = window;
            this.value    = value;
            this.max      = max;
            this.callback = callback ?? throw new ArgumentNullException(nameof(callback));

            // userdata wrapper
            callbackNative = (pos, ud) => callback(pos);

            //gchValue = GCHandle.Alloc(value, GCHandleType.Pinned);
            gchCallback       = GCHandle.Alloc(callback);
            gchCallbackNative = GCHandle.Alloc(callbackNative);
            var callbackPtr = Marshal.GetFunctionPointerForDelegate(callbackNative);

            NativeMethods.HandleException(
                NativeMethods.highgui_createTrackbar(name, window, ref this.value, max, callbackPtr, IntPtr.Zero, out result));

            if (result == 0)
            {
                throw new OpenCvSharpException("Failed to create CvTrackbar.");
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="window">トラックバーの親ウィンドウ名</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="name">Trackbar name</param>
        /// <param name="window">Window name</param>
        /// <param name="value">Initial slider position</param>
        /// <param name="max">The upper limit of the range this trackbar is working with. </param>
        /// <param name="callback">Callback handler</param>
#endif
        public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback callback)
        {
            if (string.IsNullOrEmpty(name))
                throw new ArgumentNullException("name");
            if (string.IsNullOrEmpty(window))
                throw new ArgumentNullException("window");
            if (callback == null)
                throw new ArgumentNullException("callback");

            this.name = name;
            this.window = window;
            this.value = value;
            this.max = max;
            this.callback = callback;

            gchValue = GCHandle.Alloc(value, GCHandleType.Pinned);
            gchCallback = GCHandle.Alloc(callback);
            IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(callback);
#if DEBUG
            int result = NativeMethods.cvCreateTrackbar(name, window, ref value, max, callback);
#else
            result = NativeMethods.cvCreateTrackbar(name, window, ref value, max, callbackPtr);
#endif
            if (result == 0)
                throw new OpenCvSharpException("Failed to create CvTrackbar.");
        }
Esempio n. 4
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="name">Name of created trackbar. </param>
        /// <param name="callback">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public CvTrackbar CreateTrackbar(string name, CvTrackbarCallback callback)
        {
            var trackbar = new CvTrackbar(name, this.name, callback);

            trackbars.Add(name, trackbar);
            return(trackbar);
        }
Esempio n. 5
0
        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="window">トラックバーの親ウィンドウ名</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="name">Trackbar name</param>
        /// <param name="window">Window name</param>
        /// <param name="value">Initial slider position</param>
        /// <param name="max">The upper limit of the range this trackbar is working with. </param>
        /// <param name="callback">Callback handler</param>
#endif
        public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback callback)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }
            if (string.IsNullOrEmpty(window))
            {
                throw new ArgumentNullException("window");
            }
            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }

            this.name     = name;
            this.window   = window;
            this.value    = value;
            this.max      = max;
            this.callback = callback;

            gchValue    = GCHandle.Alloc(value, GCHandleType.Pinned);
            gchCallback = GCHandle.Alloc(callback);
            IntPtr callbackPtr = Marshal.GetFunctionPointerForDelegate(callback);

#if DEBUG
            int result = NativeMethods.cvCreateTrackbar(name, window, ref value, max, callback);
#else
            result = NativeMethods.cvCreateTrackbar(name, window, ref value, max, callbackPtr);
#endif
            if (result == 0)
            {
                throw new OpenCvSharpException("Failed to create CvTrackbar.");
            }
        }
Esempio n. 6
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="name">Name of created trackbar. </param>
        /// <param name="value">The position of the slider</param>
        /// <param name="max">Maximal position of the slider. Minimal position is always 0. </param>
        /// <param name="callback">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public CvTrackbar CreateTrackbar(string name, int value, int max, CvTrackbarCallback callback)
        {
            CvTrackbar trackbar = new CvTrackbar(name, this.name, value, max, callback);

            trackbars.Add(name, trackbar);
            return(trackbar);
        }
 private void InitializeCv()
 {
     CvWindow objectSeg = new CvWindow("Thresholded View");
     CvWindow colorPick = new CvWindow("Color Picker");
     CvTrackbarCallback lowerHCallback = delegate(int pos)
     {
         if (this.upperH > pos)
         {
             this.lowerH = pos;
         }
     };
     CvTrackbarCallback upperHCallback = delegate(int pos)
     {
         if (pos > this.lowerH)
         {
             this.upperH = pos;
         }
     };
     CvTrackbarCallback lowerSCallback = delegate(int pos)
     {
         if (this.upperS > pos)
         {
             this.lowerS = pos;
         }
     };
     CvTrackbarCallback upperSCallback = delegate(int pos)
     {
         if (pos > this.lowerS)
         {
             this.upperS = pos;
         }
     };
     CvTrackbarCallback lowerVCallback = delegate(int pos)
     {
         if (this.upperV > pos)
         {
             this.lowerV = pos;
         }
     };
     CvTrackbarCallback upperVCallback = delegate(int pos)
     {
         if (pos > this.lowerV)
         {
             this.upperV = pos;
         }
     };
     CvTrackbar lowerH = colorPick.CreateTrackbar("lower H", this.lowerH, 179, lowerHCallback);
     CvTrackbar upperH = colorPick.CreateTrackbar("upper H", this.upperH, 179, upperHCallback);
     CvTrackbar lowerS = colorPick.CreateTrackbar("lower S", this.lowerS, 255, lowerSCallback);
     CvTrackbar upperS = colorPick.CreateTrackbar("upper S", this.upperS, 255, upperSCallback);
     CvTrackbar lowerV = colorPick.CreateTrackbar("lower V", this.lowerV, 255, lowerVCallback);
     CvTrackbar upperV = colorPick.CreateTrackbar("upper V", this.upperV, 255, upperVCallback);
 }
Esempio n. 8
0
        public Histogram()
        {
            // cvCalcHist
            // コントラストや明度をいろいろ変えられるサンプル

            const int histSize = 64;

            float[]   range0 = { 0, 256 };
            float[][] ranges = { range0 };

            // 画像の読み込み
            using (IplImage srcImg = new IplImage(Const.ImageLenna, LoadMode.GrayScale))
                using (IplImage dstImg = srcImg.Clone())
                    using (IplImage histImg = new IplImage(new CvSize(400, 400), BitDepth.U8, 1))
                        using (CvHistogram hist = new CvHistogram(new int[] { histSize }, HistogramFormat.Array, ranges, true))
                        {
                            using (CvWindow windowImage = new CvWindow("image", WindowMode.AutoSize))
                                using (CvWindow windowHist = new CvWindow("histogram", WindowMode.AutoSize))
                                {
                                    // トラックバーが動かされた時の処理
                                    CvTrackbar         ctBrightness = null;
                                    CvTrackbar         ctContrast   = null;
                                    CvTrackbarCallback callback     = delegate(int pos)
                                    {
                                        int brightness = ctBrightness.Pos - 100;
                                        int contrast   = ctContrast.Pos - 100;
                                        // LUTの適用
                                        byte[] lut = CalcLut(contrast, brightness);
                                        srcImg.LUT(dstImg, lut);
                                        // ヒストグラムの描画
                                        CalcHist(dstImg, hist);
                                        DrawHist(histImg, hist, histSize);
                                        // ウィンドウに表示
                                        windowImage.ShowImage(dstImg);
                                        windowHist.ShowImage(histImg);
                                        dstImg.Zero();
                                        histImg.Zero();
                                    };

                                    // トラックバーの作成
                                    // (OpenCVでは現在位置にポインタを渡すことでトラックバーの位置の変化が取得できるが、
                                    // .NETではGCによりポインタが移動してしまうので廃止した。別の方法でうまく取得すべし。)
                                    ctBrightness = windowImage.CreateTrackbar("brightness", 100, 200, callback);
                                    ctContrast   = windowImage.CreateTrackbar("contrast", 100, 200, callback);
                                    // 初回描画
                                    callback(0);

                                    // キー入力待ち
                                    Cv.WaitKey(0);
                                }
                        }
        }
Esempio n. 9
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="count">スライダの最大値.最小値は常に 0.</param>
        /// <param name="onChange">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
        /// <returns></returns>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="name">Name of created trackbar. </param>
        /// <param name="value">The position of the slider</param>
        /// <param name="count">Maximal position of the slider. Minimal position is always 0. </param>
        /// <param name="onChange">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public TrackbarWithLabel CreateTrackbar(string name, int value, int count, CvTrackbarCallback onChange)
        {
            var t = new TrackbarWithLabel(name, value, count, 0);

            t.Dock = DockStyle.Top;
            t.Trackbar.ValueChanged += (o, e) =>
            {
                int pos = ((TrackBar)o).Value;
                onChange(pos);
            };
            SetClientSize(new System.Drawing.Size(ClientSize.Width, ClientSize.Height + t.Height));
            _panelTrackbar.Height += t.Height;
            _panelTrackbar.Controls.Add(t);
            return(t);
        }
Esempio n. 10
0
        public IplImage BuildHist(IplImage src_tmp)
        {
            const int histSize = 64;

            float[]   range0 = { 0, 256 };
            float[][] ranges = { range0 };
            // 화상의 읽기
            using (IplImage srcImg = new IplImage(src_tmp.Size, BitDepth.U8, 1))
                using (IplImage dstImg = new IplImage(src_tmp.Size, BitDepth.U8, 1))
                    using (IplImage histImg = new IplImage(new CvSize(400, 400), BitDepth.U8, 1))
                        using (CvHistogram hist = new CvHistogram(new int[] { histSize }, HistogramFormat.Array, ranges, true))
                        {
                            src_tmp.CvtColor(srcImg, ColorConversion.BgrToGray);
                            srcImg.Copy(dstImg);
                            using (CvWindow windowImage = new CvWindow("변환된 이미지", WindowMode.AutoSize))
                                using (CvWindow windowHist = new CvWindow("히스토그램", WindowMode.AutoSize))
                                {
                                    // 트랙바가 동작되었을 때의 처리
                                    CvTrackbar         ctBrightness = null;
                                    CvTrackbar         ctContrast   = null;
                                    CvTrackbarCallback callback     = delegate(int pos)
                                    {
                                        int brightness = ctBrightness.Pos - 100;
                                        int contrast   = ctContrast.Pos - 100;
                                        // LUT의 적용
                                        byte[] lut = CalcLut(contrast, brightness);
                                        srcImg.LUT(dstImg, lut);
                                        // 히스토그램 그리기
                                        CalcHist(dstImg, hist);
                                        DrawHist(histImg, hist, histSize);
                                        // 윈도우에 표시
                                        DstHist = histImg.Clone();
                                        windowImage.ShowImage(dstImg);
                                        windowHist.ShowImage(histImg);
                                        dstImg.Zero();
                                        histImg.Zero();
                                    };
                                    // 트랙바의 작성
                                    ctBrightness = windowImage.CreateTrackbar("명도", 100, 200, callback);
                                    ctContrast   = windowImage.CreateTrackbar("대조", 100, 200, callback);
                                    // 첫회 그리기
                                    callback(0);
                                    // 키 입력대기
                                    Cv.WaitKey(0);
                                }
                            return(DstHist);
                        }
        }
Esempio n. 11
0
        public Histogram()
        {
            // cvCalcHist

            const int histSize = 64;

            float[]   range0 = { 0, 256 };
            float[][] ranges = { range0 };

            using (IplImage srcImg = new IplImage(FilePath.Image.Lenna, LoadMode.GrayScale))
                using (IplImage dstImg = srcImg.Clone())
                    using (IplImage histImg = new IplImage(new CvSize(400, 400), BitDepth.U8, 1))
                        using (CvHistogram hist = new CvHistogram(new int[] { histSize }, HistogramFormat.Array, ranges, true))
                        {
                            using (CvWindow windowImage = new CvWindow("image", WindowMode.AutoSize))
                                using (CvWindow windowHist = new CvWindow("histogram", WindowMode.AutoSize))
                                {
                                    CvTrackbar         ctBrightness = null;
                                    CvTrackbar         ctContrast   = null;
                                    CvTrackbarCallback callback     = delegate(int pos)
                                    {
                                        int brightness = ctBrightness.Pos - 100;
                                        int contrast   = ctContrast.Pos - 100;
                                        // perform LUT
                                        byte[] lut = CalcLut(contrast, brightness);
                                        srcImg.LUT(dstImg, lut);
                                        // draws histogram
                                        CalcHist(dstImg, hist);
                                        DrawHist(histImg, hist, histSize);

                                        windowImage.ShowImage(dstImg);
                                        windowHist.ShowImage(histImg);
                                        dstImg.Zero();
                                        histImg.Zero();
                                    };

                                    ctBrightness = windowImage.CreateTrackbar("brightness", 100, 200, callback);
                                    ctContrast   = windowImage.CreateTrackbar("contrast", 100, 200, callback);
                                    // initial action
                                    callback(0);

                                    Cv.WaitKey(0);
                                }
                        }
        }
Esempio n. 12
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="trackbarName">トラックバーの名前</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="trackbarName">Name of created trackbar. </param>
        /// <param name="value">The position of the slider</param>
        /// <param name="max">Maximal position of the slider. Minimal position is always 0. </param>
        /// <param name="callback">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public CvTrackbar CreateTrackbar(string trackbarName, int value, int max, CvTrackbarCallback callback)
        {
            var trackbar = new CvTrackbar(trackbarName, name, value, max, callback);
            trackbars.Add(trackbarName, trackbar);
            return trackbar;
        }
Esempio n. 13
0
 public extern static int cvCreateTrackbar(/* const char* */ String trackbar_name, /* const char* */ String window_name,
                                           /*int* */ ref int value, int count, CvTrackbarCallback on_change);
Esempio n. 14
0
        /// <summary>
        /// 初期化(目盛りは0~100)
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="window">トラックバーの親ウィンドウ名</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Constructor (value=0, max=100)
        /// </summary>
        /// <param name="name">Trackbar name</param>
        /// <param name="window">Window name</param>
        /// <param name="callback">Callback handler</param>
#endif
        public CvTrackbar(string name, string window, CvTrackbarCallback callback)
            : this(name, window, 0, 100, callback)
        {
        }
Esempio n. 15
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="name">Name of created trackbar. </param>
        /// <param name="callback">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public CvTrackbar CreateTrackbar(string name, CvTrackbarCallback callback)
        {
            CvTrackbar trackbar = new CvTrackbar(name, this._name, callback);
            _trackbars.Add(name, trackbar);
            return trackbar;
        }
Esempio n. 16
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="count">スライダの最大値.最小値は常に 0.</param>
        /// <param name="onChange">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
        /// <returns></returns>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="name">Name of created trackbar. </param>
        /// <param name="value">The position of the slider</param>
        /// <param name="count">Maximal position of the slider. Minimal position is always 0. </param>
        /// <param name="onChange">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public TrackbarWithLabel CreateTrackbar(string name, int value, int count, CvTrackbarCallback onChange)
        {
            var t = new TrackbarWithLabel(name, value, count, 0);
            t.Dock = DockStyle.Top;
            t.Trackbar.ValueChanged += (o, e) =>
            {
                int pos = ((TrackBar)o).Value;
                onChange(pos);
            };
            SetClientSize(new CvSize(ClientSize.Width, ClientSize.Height + t.Height));
            _panelTrackbar.Height += t.Height;
            _panelTrackbar.Controls.Add(t);
            return t;
        }
Esempio n. 17
0
        /// <summary>
        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="value">スライダの初期位置</param>
        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Creates the trackbar and attaches it to this window
        /// </summary>
        /// <param name="name">Name of created trackbar. </param>
        /// <param name="value">The position of the slider</param>
        /// <param name="max">Maximal position of the slider. Minimal position is always 0. </param>
        /// <param name="callback">the function to be called every time the slider changes the position. This function should be prototyped as void Foo(int);</param>
        /// <returns></returns>
#endif
        public CvTrackbar CreateTrackbar(string name, int value, int max, CvTrackbarCallback callback)
        {
            CvTrackbar trackbar = new CvTrackbar(name, this.name, value, max, callback);
            trackbars.Add(name, trackbar);
            return trackbar;
        }
Esempio n. 18
0
        /// <summary>
        /// 初期化(目盛りは0~100)
        /// </summary>
        /// <param name="name">トラックバーの名前</param>
        /// <param name="window">トラックバーの親ウィンドウ名</param>
        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
#else
        /// <summary>
        /// Constructor (value=0, max=100)
        /// </summary>
        /// <param name="name">Trackbar name</param>
        /// <param name="window">Window name</param>
        /// <param name="callback">Callback handler</param>
#endif
        public CvTrackbar(string name, string window, CvTrackbarCallback callback)
            : this(name, window, 0, 100, callback)
        {
        }
Esempio n. 19
0
        public FindContours()
        {
            // cvFindContoursm cvDrawContours
            // 画像中から輪郭を検出し,-1~+1までのレベルにある輪郭を描画する

            const int SIZE = 500;

            using (IplImage img = new IplImage(SIZE, SIZE, BitDepth.U8, 1))
            {
                // 画像の初期化
                img.Zero();
                for (int i = 0; i < 6; i++)
                {
                    int dx = (i % 2) * 250 - 30;
                    int dy = (i / 2) * 150;
                    if (i == 0)
                    {
                        for (int j = 0; j <= 10; j++)
                        {
                            double  angle = (j + 5) * Cv.PI / 21;
                            CvPoint p1    = new CvPoint(Cv.Round(dx + 100 + j * 10 - 80 * Math.Cos(angle)), Cv.Round(dy + 100 - 90 * Math.Sin(angle)));
                            CvPoint p2    = new CvPoint(Cv.Round(dx + 100 + j * 10 - 30 * Math.Cos(angle)), Cv.Round(dy + 100 - 30 * Math.Sin(angle)));
                            Cv.Line(img, p1, p2, CvColor.White, 1, LineType.AntiAlias, 0);
                        }
                    }
                    Cv.Ellipse(img, new CvPoint(dx + 150, dy + 100), new CvSize(100, 70), 0, 0, 360, CvColor.White, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 115, dy + 70), new CvSize(30, 20), 0, 0, 360, CvColor.Black, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 185, dy + 70), new CvSize(30, 20), 0, 0, 360, CvColor.Black, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 115, dy + 70), new CvSize(15, 15), 0, 0, 360, CvColor.White, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 185, dy + 70), new CvSize(15, 15), 0, 0, 360, CvColor.White, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 115, dy + 70), new CvSize(5, 5), 0, 0, 360, CvColor.Black, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 185, dy + 70), new CvSize(5, 5), 0, 0, 360, CvColor.Black, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 150, dy + 100), new CvSize(10, 5), 0, 0, 360, CvColor.Black, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 150, dy + 150), new CvSize(40, 10), 0, 0, 360, CvColor.Black, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 27, dy + 100), new CvSize(20, 35), 0, 0, 360, CvColor.White, -1, LineType.AntiAlias, 0);
                    Cv.Ellipse(img, new CvPoint(dx + 273, dy + 100), new CvSize(20, 35), 0, 0, 360, CvColor.White, -1, LineType.AntiAlias, 0);
                }

                // 輪郭の検出
                CvSeq <CvPoint> contours;
                CvMemStorage    storage = new CvMemStorage();
                // native style
                Cv.FindContours(img, storage, out contours, CvContour.SizeOf, ContourRetrieval.Tree, ContourChain.ApproxSimple);
                contours = Cv.ApproxPoly(contours, CvContour.SizeOf, storage, ApproxPolyMethod.DP, 3, true);

                // wrapper style
                //img.FindContours(storage, out contours, ContourRetrieval.Tree, ContourChain.ApproxSimple);
                //contours = contours.ApproxPoly(storage, ApproxPolyMethod.DP, 3, true);

                // ウィンドウに表示
                using (CvWindow window_image = new CvWindow("image", img))
                    using (CvWindow window_contours = new CvWindow("contours"))
                    {
                        CvTrackbarCallback onTrackbar = delegate(int pos)
                        {
                            IplImage        cnt_img   = new IplImage(SIZE, SIZE, BitDepth.U8, 3);
                            CvSeq <CvPoint> _contours = contours;
                            int             levels    = pos - 3;
                            if (levels <= 0) // get to the nearest face to make it look more funny
                            {
                                //_contours = _contours.HNext.HNext.HNext;
                            }
                            cnt_img.Zero();
                            Cv.DrawContours(cnt_img, _contours, CvColor.Red, CvColor.Green, levels, 3, LineType.AntiAlias);
                            window_contours.ShowImage(cnt_img);
                            cnt_img.Dispose();
                        };
                        window_contours.CreateTrackbar("levels+3", 3, 7, onTrackbar);
                        onTrackbar(3);

                        Cv.WaitKey();
                    }
            }
        }