1

我正在检测 PCB 板上的二维条码。环境是 Visual Studio 2012。

我们遇到了一些问题,无法成功过滤出二维条码图像。

加载图:原始图像尺寸为 1600*1200。

在我们加载图形并开始一系列处理后,如下步骤:

1.通过自动阈值方法找到阈值。

2. 对图像做二值阈值。

3. 做开口使图像清晰。

开场:dst = open(src,element) = dilate(erode(src, element))

4.过滤掉除正方形以外的矩形。 然后我们可以得到一个正方形的集合。如下图,经过步骤 1-4 我们可以在图像上找到正方形。

5.使用类似的Data Matrix Template分别与正方形进行直方图分析比较。

5.1 计算直方图

void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** 范围, bool uniform=true, bool accumulate=false);

5.2 对数组的取值范围进行归一化

void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray());

5.3 比较两个具有相关性的直方图。

double compareHist( InputArray H1, InputArray H2, CV_COMP_CORREL );

6. 处理后我们无法从正方形集合中过滤出正确的图像。

6.1 我们将直方图的 bin 从 256 调整到 64/32,但结果没有鲁棒性,相关值非常低,甚至小于 0.5。

6.2 我们也尝试使用 EMD(Earth Mover's Distance)来估计两个正方形的相似度,但并没有解决这个问题。

[[问题]]: 可以分享一些建议来改进我们的检测方法吗?

4

1 回答 1

1

为什么不使用库?

数据矩阵 opencv 模块

zxing Cpp

libdmtx

否则,您可以研究这些库中的代码并尝试优化自己的代码。

于 2017-04-13T10:33:42.547 回答