【发布时间】: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