2

参考:如何检测和计算螺旋的匝数

即使在基于像素的计算中,我也无法计算。

如果我附上了图片,如何开始计算圈数。

我试过 FindContours(); 但并没有完全隔离它不能隔离的轮次。matchshape() 我也有相似因子,但对于整个线圈。

所以我尝试如下轮数:

 public static int GetSpringTurnCount()
        {
            if (null == m_imageROIed)
                return -1;
            int imageWidth = m_imageROIed.Width;
            int imageHeight = m_imageROIed.Height;

            if ((imageWidth <= 0) || (imageHeight <= 0))
                return 0;

            int turnCount = 0;

            Image<Gray, float> imgGrayF = new Image<Gray, float>(imageWidth, imageHeight);

            CvInvoke.cvConvert(m_imageROIed, imgGrayF);

            imgGrayF = imgGrayF.Laplace(1); // For saving integer overflow.

            Image<Gray, byte> imgGray = new Image<Gray, byte>(imageWidth, imageHeight);
            Image<Gray, byte> cannyEdges = new Image<Gray, byte>(imageWidth, imageHeight);

            CvInvoke.cvConvert(imgGrayF, imgGray);

            cannyEdges = imgGray.Copy();

            //cannyEdges = cannyEdges.ThresholdBinary(new Gray(1), new Gray(255));// = cannyEdges > 0 ? 1 : 0;
            cannyEdges = cannyEdges.Max(0);

            cannyEdges /= 255;

            Double[] sumRow = new Double[cannyEdges.Cols];
            //int sumRowIndex = 0;
            int Rows = cannyEdges.Rows;
            int Cols = cannyEdges.Cols;
            for (int X = 0; X < cannyEdges.Cols; X++)
            {
                Double sumB = 0;

                for (int Y = 0; Y < cannyEdges.Rows; Y ++)
                {
                    //LineSegment2D lines1 = new LineSegment2D(new System.Drawing.Point(X, 0), new System.Drawing.Point(X, Y));

                    Double pixels = cannyEdges[Y, X].Intensity;

                    sumB += pixels;


                }
                sumRow[X] = sumB;
            }

            Double avg = sumRow.Average();

List<int> turnCountList = new List<int>();

            int cnt = 0;
            foreach(int i in sumRow)
            {
                sumRow[cnt] /=  avg;
                if(sumRow[cnt]>3.0)
                turnCountList.Add((int)sumRow[cnt]);
                    cnt++;
            }
            turnCount = turnCountList.Count();

 cntSmooth = cntSmooth * 0.9f + (turnCount) * 0.1f;
            return (int)cntSmooth;
    }

在此处输入图像描述

我接下来尝试冲浪。

====================================================

编辑:添加样本。如果你喜欢就去做。 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

====================================================

编辑:尝试了另一个算法:

  1. ROI 然后旋转(最大的细浅蓝色矩形)
  2. GetMoments() 使用该时刻缩小 ROI 高度和 position.Y。
  3. 使用空白图像设置缩小的 ROI 和 ._And()。(带有绿色矩形的灰色区域)
  4. 将图像切成两半。
  5. 轮廓和拟合椭圆。
  6. 获得最大拟合椭圆数。

稍后将致力于更好的算法和结果。

在此处输入图像描述

4

1 回答 1

0

假设较大的白色簇是春天

- 编辑 -

  1. 对图片应用逆阈值并使用洪水填充算法填充角落。
  2. 使用 findContours 和 minAreaRect 找到最大白色簇的旋转边界框
  3. 跟踪盒子长轴,执行以下操作
  4. 对于沿轴轨迹轴线垂直穿过当前像素的每个像素
  5. 这条线将至少在两点上穿过弹簧。
  6. 找到与轴距离较大的点
  7. 这将在类似于正弦函数的点上创建集合
  8. 计算此集合的峰值或簇,这将获得两倍的循环数。

所有这一切都假设您在图片中没有高噪点。

于 2012-12-12T18:16:34.800 回答