填充数据矩阵轮廓以进行扫描

时间:2020-08-03 15:08:27

标签: python c++ opencv image-processing

我在金属体上有一个小的蚀刻数据矩阵,经过一些处理(灰度)后,会产生样品图像。除了模块外部的某些区域与模块边界内的颜色共享相同的颜色外,生成的图像大部分都很好。只需将模块边界内的区域(白色边框)设为白色。

尝试先打开Opencv变体,然后再关闭,但效果不佳(不会发生解码)。还尝试了Canny边缘和填充轮廓,但这会引入噪点。从理论上讲,我可以删除一些轮廓,但这会导致图像不准确,因为某些轮廓(主要是黑色区域)位于需要着色的轮廓内,并且会导致结果不准确(或不扫描)。

实现此目标的最佳方法是什么(需要较少的图像/点击审判)。白色边界内的区域将根据入射光角度而变化(水平或垂直间隙)。

// In Java, ZXing is being used to read the pre-processed image
// based on processed bytearray returned from native

// Native process, takes input 480x640 image, crops based on view finder 
// which is when we have a 213x213 sized image
cv::resize(img, img, Size(600, 600));

labelUtils.BrightnessAndContrastAuto(img, img);

// identify contour area of datamatrix and crop the selection
vector<Point> contourPoints;
getDataMatrixContour(img,contourPoints);
if (contourPoints.empty) {
   threshold(img, img, 100, 255, THRESH_BINARY_INV);
   return;
}
// get contour rect which has the code
Rect icRect = cv::boundingRect(contourPoints);
//            double scaleFactor = desiredWidth / icRect.width;

// resize bounding rect to have some padding area
LabelUtils::resizeRect(icRect, 1.2);

// make rect even, else cvtColor color fails for odd-sized images
if (icRect.width % 2 != 0)
   icRect.width += 1;
if (icRect.height % 2 != 0)
   icRect.height += 1;

// crop image to a (sub)scaled even size
labelUtils.submatImage(pImg, icRect);

int sigma = 2, threshold = 5, amount = 10;
sharpenForMetal(img, sigma, threshold, amount);

threshold(img, img, 100, 255, THRESH_BINARY_INV);
return;

sample 1 sample 2 sample 3

1 个答案:

答案 0 :(得分:0)

图像清晰度下降是由于使用了调整大小而不是单应变换。调整大小会导致图像丢失,而单应性保留了我所拥有的进一步处理管线所需的细节。