//輪郭抽出して中心座標取得 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); }
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); }
/// <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; }
/// <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))); }
// 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(); // } } } } } }