【问题标题】:How to find each square in datamatrix code如何在datamatrix代码中找到每个正方形
【发布时间】:2022-01-13 12:37:10
【问题描述】:

我正在开发一个项目,以使用 emgu/opencv 和 c# 对像 datamatrix 这样的二维代码进行分级。 我希望能够检测到图像中的每个外部正方形。如下图:

我试图提取图像的轮廓,但得到的组合轮廓如下所示:

如何只提取外部方块进行分析?

更新:

我使用外边缘边界框矩形并尝试将图像拆分为 14 行和列,但由于某种原因,它比边界框小,但具有正确的行和列。因此,我无法从每个单元格中提取颜色。这是我的代码

      CvInvoke.cvThreshold(grayimg, grayimg, 50, 255.0, THRESH.CV_THRESH_BINARY);
                    grayimg._Not();

                    StructuringElementEx element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT);
                    CvInvoke.cvMorphologyEx(grayimg, grayimg, IntPtr.Zero, element, CV_MORPH_OP.CV_MOP_CLOSE, 18);

                    var sourceContours1 = grayimg.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);

                    Rectangle rr = CvInvoke.cvBoundingRect(sourceContours1, 3);
                 
                    int verticalGrids = 14;
                    int horizontalGrids = 14;

                    int gridWidth = rr.Width / 14;
                    int gridHeight = rr.Height / 14;

                    for (int j = 0; j < verticalGrids; j++)
                    {
                        int yo = j * gridHeight;

                        for (int k = 0; k < horizontalGrids; k++)

                        {
                            int xo = k * gridWidth;

                            Rectangle gridBox = new Rectangle(); ;
                            gridBox.X = rr.X + xo;
                            gridBox.Y = rr.Y + yo;
                            gridBox.Width = gridWidth;
                            gridBox.Height = gridHeight;

                            fullframegradcam3.Draw(gridBox, new Bgr(0, 255, 0), 2);

                        }

                    }

                    cibcam3.Image = fullframegradcam3.Bitmap;

这是我得到的输出:

【问题讨论】:

  • 腐蚀/扩张可能
  • 很难直接提取这些方块。最好尝试获得全局边界正方形,并根据单元格数量的知识,估计并提取仅包含正方形的切片。然后你可以单独得到它们。或者,检测这些切片中的横向边缘。
  • @YvesDaoust 请检查原始问题,我已根据您的建议对其进行了更新,但没有得到正确的输出。

标签: python c# opencv image-processing emgucv


【解决方案1】:

一种可能性是估计代码的内部区域并将其填充以擦除。

【讨论】:

  • 请检查原始问题,我已根据您的建议对其进行了更新,但没有得到正确的输出
  • @user3177511: 原始图像还是预处理图像?
  • 预处理图像....我转换为灰度 >> 阈值 >> 变形关闭
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多