Esempio n. 1
0
        //輪郭抽出して中心座標取得
        Point GetCenterPointofLED(Mat grayImage)
        {
            OpenCvSharp.CPlusPlus.Point centerPoint = new OpenCvSharp.CPlusPlus.Point();
            IplImage grayIpl  = grayImage.ToIplImage().Clone();
            IplImage calibIpl = new IplImage(grayIpl.Size, BitDepth.U8, 3);
            //中心の検出
            CvBlobs blobs = new CvBlobs();

            blobs.Label(grayIpl);
            //blobs.FilterByArea(20, 1500);
            CvBlob blob = blobs.LargestBlob();

            try
            {
                if (blob != null)
                {
                    centerPoint = new Point(blob.Centroid.X, blob.Centroid.Y);

                    blobs.RenderBlobs(grayIpl, calibIpl);
                }
            }catch {
                Console.WriteLine("eroor:counter");
            }

            this.CalibrationImage = new Mat(calibIpl);
            Console.WriteLine(centerPoint);
            return(centerPoint);
        }
Esempio n. 2
0
 static void Main(string[] args)
 {
     CvScalar hsv_min = Cv.RGB(150, 70, 70);     // 抽出するHSV色領域の下限
     CvScalar hsv_max = Cv.RGB(360, 255, 255);   // 抽出するHSV色領域の上限
     var cap = Cv.CreateCameraCapture(0);        // カメラのキャプチャ
     IplImage im = new IplImage();               // カメラ画像(フレーム)格納用
     IplImage hsv = Cv.CreateImage(new CvSize(640, 480), BitDepth.U8, 3);    // HSV画像格納用
     IplImage mask = Cv.CreateImage(new CvSize(640, 480), BitDepth.U8, 1);   // マスク画像格納用
     while (Cv.WaitKey(1) == -1)                 // 任意のキーが入力されるまでカメラ映像を表示
     {
         im = Cv.QueryFrame(cap);                        // カメラからフレーム(画像)を取得
         Cv.CvtColor(im, hsv, ColorConversion.BgrToHsv); // RGB色空間からHSV色空間に変換
         Cv.InRangeS(hsv, hsv_min, hsv_max, mask);       // 指定した範囲内の色抽出(マスクの作成)
         Cv.Dilate(mask, mask, null, 1);                 // 膨張処理
         Cv.Erode(mask, mask, null, 1);                  // 収縮処理
         Cv.Erode(mask, mask, null, 1);                  // 収縮処理
         Cv.Dilate(mask, mask, null, 1);                 // 膨張処理
         // エラー処理(マスクに白領域が全くないとラベリング処理でエラー)
         Cv.Ellipse(mask, new CvPoint(0, 0), new CvSize(1, 1), 0, 0, 360, CvColor.White, -1);
         CvBlobs blobs = new CvBlobs(mask);              // マスク画像のラベリング処理
         CvBlob maxBlob = blobs.LargestBlob();           // 面積が最大のラベルを抽出
         CvPoint pt = maxBlob.Centroid;                  // 面積が最大のラベルの重心座標を取得
         // 重心点に十字線を描く
         Cv.Line(im, new CvPoint(pt.X, pt.Y - 50), new CvPoint(pt.X, pt.Y + 50), new CvColor(0, 255, 0), 5);
         Cv.Line(im, new CvPoint(pt.X - 50, pt.Y), new CvPoint(pt.X + 50, pt.Y), new CvColor(0, 255, 0), 5);
         Cv.ShowImage("Frame", im);                      // 画面にフレームを表示
         Cv.ShowImage("Mask", mask);                     // 画面にマスク画像を表示
     }
 }
Esempio n. 3
0
    static void Main(string[] args)
    {
        CvScalar hsv_min = Cv.RGB(150, 70, 70);                                  // 抽出するHSV色領域の下限
        CvScalar hsv_max = Cv.RGB(360, 255, 255);                                // 抽出するHSV色領域の上限
        var      cap     = Cv.CreateCameraCapture(0);                            // カメラのキャプチャ
        IplImage im      = new IplImage();                                       // カメラ画像(フレーム)格納用
        IplImage hsv     = Cv.CreateImage(new CvSize(640, 480), BitDepth.U8, 3); // HSV画像格納用
        IplImage mask    = Cv.CreateImage(new CvSize(640, 480), BitDepth.U8, 1); // マスク画像格納用

        while (Cv.WaitKey(1) == -1)                                              // 任意のキーが入力されるまでカメラ映像を表示
        {
            im = Cv.QueryFrame(cap);                                             // カメラからフレーム(画像)を取得
            Cv.CvtColor(im, hsv, ColorConversion.BgrToHsv);                      // RGB色空間からHSV色空間に変換
            Cv.InRangeS(hsv, hsv_min, hsv_max, mask);                            // 指定した範囲内の色抽出(マスクの作成)
            Cv.Dilate(mask, mask, null, 1);                                      // 膨張処理
            Cv.Erode(mask, mask, null, 1);                                       // 収縮処理
            Cv.Erode(mask, mask, null, 1);                                       // 収縮処理
            Cv.Dilate(mask, mask, null, 1);                                      // 膨張処理
            // エラー処理(マスクに白領域が全くないとラベリング処理でエラー)
            Cv.Ellipse(mask, new CvPoint(0, 0), new CvSize(1, 1), 0, 0, 360, CvColor.White, -1);
            CvBlobs blobs   = new CvBlobs(mask);            // マスク画像のラベリング処理
            CvBlob  maxBlob = blobs.LargestBlob();          // 面積が最大のラベルを抽出
            CvPoint pt      = maxBlob.Centroid;             // 面積が最大のラベルの重心座標を取得
            // 重心点に十字線を描く
            Cv.Line(im, new CvPoint(pt.X, pt.Y - 50), new CvPoint(pt.X, pt.Y + 50), new CvColor(0, 255, 0), 5);
            Cv.Line(im, new CvPoint(pt.X - 50, pt.Y), new CvPoint(pt.X + 50, pt.Y), new CvColor(0, 255, 0), 5);
            Cv.ShowImage("Frame", im);                      // 画面にフレームを表示
            Cv.ShowImage("Mask", mask);                     // 画面にマスク画像を表示
        }
    }
        /// <summary>
        /// 最適blobの選定
        /// </summary>
        /// <remarks>
        /// 最適blobの選定(areaの大きさと前回からの距離)
        /// </remarks>
        public int mesure(CvBlobs blobs)
        {
            if (blobs.Count == 0)
            {
                return(0);
            }
            CvPoint2D64f pos_ans   = new CvPoint2D64f(-1, -1);
            CvBlob       maxBlob   = blobs.LargestBlob();
            int          max_label = blobs.GreaterBlob().Label;

            if (blobs.Count == 0)
            {
                return(0);
            }
            pos_ans   = maxBlob.Centroid;
            distance0 = Cal_distance_const(distance_pre);
            if (blobs.Count > 1)
            {
                // 最適blobの選定
                double eval, eval_max = 0;
                foreach (var item in blobs)
                {
                    eval = position_mesure.Cal_Evaluate(item.Value.Centroid, item.Value.Area, pos_pre, distance0);
                    if (eval > eval_max)
                    {
                        eval_max  = eval;
                        max_label = item.Key;
                        pos_ans   = item.Value.Centroid;

                        Console.WriteLine("{0} | Centroid:{1} Area:{2} eval:{3}", item.Key, item.Value.Centroid, item.Value.Area, eval);

                        //w.WriteLine("{0} {1} {2} {3} {4}", dis, dv, i, item.Key, item.Value.Area);
                    }
                    //sw.Stop(); t5 = 1000.0 * sw.ElapsedTicks / Stopwatch.Frequency; sw.Reset(); sw.Start();
                    Console.WriteLine(" pos_ans:{0}", pos_ans);
                }
            }
            double dis = Cal_distance(pos_ans, pos_pre);

            if (distance_pre > dis)
            {
                distance_pre = (1 - dist_alpha) * distance_pre + dist_alpha * dis;
            }
            else
            {
                distance_pre = dis;
            }
            pos_pre = pos_ans;
            return(max_label);
        }
Esempio n. 5
0
 /// <summary>
 /// Find the largest blob. (cvLargestBlob)
 /// </summary>
 /// <param name="blobs">List of blobs.</param>
 /// <returns>The largest blob.</returns>
 public static CvBlob LargestBlob(CvBlobs blobs)
 {
     if (blobs == null)
         throw new ArgumentNullException(nameof(blobs));
     return blobs.LargestBlob();
 }
        //輪郭抽出して中心座標取得
        Point GetCenterPointofLED(Mat grayImage)
        {
            OpenCvSharp.CPlusPlus.Point centerPoint = new OpenCvSharp.CPlusPlus.Point();
            IplImage grayIpl = grayImage.ToIplImage().Clone();
            IplImage calibIpl = new IplImage(grayIpl.Size, BitDepth.U8, 3);
            //中心の検出
            CvBlobs blobs = new CvBlobs();
            blobs.Label(grayIpl);
            //blobs.FilterByArea(20, 1500);
            CvBlob blob = blobs.LargestBlob();

            try
            {
                if (blob != null)
                {
                    centerPoint = new Point(blob.Centroid.X, blob.Centroid.Y);

                    blobs.RenderBlobs(grayIpl, calibIpl);
                }
            }catch{
                Console.WriteLine("eroor:counter");
            }

            this.CalibrationImage = new Mat(calibIpl);
            Console.WriteLine(centerPoint);
            return centerPoint;
        }
Esempio n. 7
0
        /// <summary>
        /// 指先の位置を探す
        /// </summary>
        /// <param name="targetName"></param>
        /// <returns></returns>
        public System.Drawing.Point FingerFinder(string targetName = "")
        {
            //To find the finger point which on the Graphics
            //カメラのパラメタ
            capFlag = true;
            Mat              tempImg, flipImg;
            Mat              grayImg, renderImg;
            Mat              srcImgbyCam = new Mat();
            double           centerX = 0.0, centerY = 0.0;
            ColorRecognition iRo = new ColorRecognition();

            var capture = new VideoCapture(CaptureDevice.Any)
            {
                //キャプチャする画像のサイズフレームレートの指定
                FrameHeight = 480,
                FrameWidth  = 320,
                //FrameHeight = 640, FrameWidth = 480,
            };

            using (capture)
            {
                while (capFlag)
                {
                    //カメラから画像をキャプチャする
                    capFlag = capture.Read(srcImgbyCam);

                    if (srcImgbyCam.Empty())
                    {
                        break;
                    }

                    //Camera Test window
                    Cv2.ImShow("srcImgbyCam", srcImgbyCam);
                    flipImg = srcImgbyCam.Clone();
                    flipImg = flipImg.Flip(FlipMode.XY);

                    tempImg = Mat.Zeros(srcImgbyCam.Size(), srcImgbyCam.Type());
                    grayImg = new Mat(srcImgbyCam.Size(), MatType.CV_8UC1);
                    //指検出方法
                    iRo.FindColor(ref flipImg, ref tempImg);

                    Cv2.CvtColor(tempImg, grayImg, ColorConversionCodes.BGR2GRAY);
                    Cv2.Threshold(grayImg, grayImg, 100, 255, ThresholdTypes.Binary);
                    //ラベリング処理
                    //CvBlobs blobs = new CvBlobs(grayImg2Ipl);
                    CvBlobs blobs = new CvBlobs(grayImg);
                    renderImg = new Mat(srcImgbyCam.Size(), MatType.CV_8UC3);
                    //ラベリング結果の描画
                    blobs.RenderBlobs(srcImgbyCam, renderImg);
                    //緑最大面積を返す
                    CvBlob maxblob = blobs.LargestBlob();

                    if (maxblob != null)
                    {
                        centerX = Math.Round(maxblob.Centroid.X, 2);
                        centerY = Math.Round(maxblob.Centroid.Y, 2);

                        //手動のキャリブレーション
                        centerX = (int)((centerX - 12) / 12.87);
                        centerY = (int)((centerY - 43) / 12.40);

                        //手動のキャリブレーション Ⅱ
                        centerX = (int)((centerX - 2) * 2);
                        centerY = (int)((centerY - 1) * 2);

                        //For Debug
                        textBox_CenterCoordinates.Text = centerX.ToString() + " , " + centerY.ToString();
                    }

                    int keyValue = Cv2.WaitKey(100);
                    if (keyValue == 27)
                    {
                        Window.DestroyAllWindows();
                        //対象Release
                        tempImg.Release(); flipImg.Release();
                        grayImg.Release(); renderImg.Release();
                        srcImgbyCam.Release();
                        capFlag = false;
                        break;   //ESC キーで閉じる
                    }
                }
            }
            return(new System.Drawing.Point(Convert.ToInt32(centerX + movement.X), Convert.ToInt32(centerY + movement.Y)));
        }
Esempio n. 8
0
    // Use this for initialization
    void Start()
    {
        using (var video = new VideoCapture(0))
        {
            //保存先行列
            var frame = new Mat();
            var gray  = new Mat();
            //保存
            while (Cv2.WaitKey(1) == -1)
            {
                //画像読み込み
                video.Read(frame);
                //グレースケール変換
                Cv2.CvtColor(frame, gray, ColorConversionCodes.BGR2GRAY);
                //二値化
                using (var binary = gray.Threshold(100, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary))
                {
                    // ラベリング実行
                    CvBlobs blobs = new CvBlobs(binary);

                    // 入力画像と同じサイズ、チャネル数の画像を生成
                    using (var render = new Mat(frame.Rows, frame.Cols, MatType.CV_8UC3, 3))
                        using (var img = new Mat(frame.Rows, frame.Cols, MatType.CV_8UC3, 3))
                        {
                            // ラベリング結果の描画
                            blobs.RenderBlobs(frame, render);
                            CvBlob maxBlob = blobs.LargestBlob();
                            Debug.Log(maxBlob.Rect);
                            Debug.Log(maxBlob.Centroid);
                            Debug.Log(maxBlob.Area);

                            // 各blob(輪郭要素)の情報の取得
                            //foreach (KeyValuePair<int, CvBlob> item in blobs)
                            //{
                            //    int labelValue = item.Key;
                            //    CvBlob blob = item.Value;
                            //    // 外接矩形(矩形の左上の座標(x,y),幅と高さ)
                            //    Console.WriteLine("外接矩形は、{0}", blob.Rect);

                            //    // 面積
                            //    Console.WriteLine("面積は、{0}", blob.Area);
                            //    // 重心
                            //    Console.WriteLine("重心は、{0}", blob.Centroid);
                            //    Debug.Log(blob.Centroid);
                            //    // 角度
                            //    Console.WriteLine("角度は、{0}", blob.Angle());
                            //    // ラベルの数値
                            //    Console.WriteLine("ラベルは、{0}", blob.Label);
                            //    // 輪郭情報を得る(ここではキーのみで特に意味なし)
                            //    Console.WriteLine("輪郭は、{0}", blob.Contour);

                            //    // 輪郭情報を得る
                            //    CvContourChainCode cc = blob.Contour;
                            //    // 描画
                            //    cc.Render(img);

                            //    // 周囲長の取得と表示
                            //    double perimeter = cc.Perimeter();
                            //    Console.WriteLine("周囲長は、{0}", perimeter);
                            //    // スペース(特に意味なし)
                            //    Console.WriteLine("");
                            //}

                            // using (new Window("frame", frame))
                            //using (new Window("binary", binary))
                            using (new Window("render", render));
                            //using (new Window("img", img))
                            // {
                            //     Cv2.WaitKey();
                            // }
                        }
                }
            }
        }
    }