我正在尝试检测模拟仪表的一些仪表读数。我目前正在使用亚马逊识别服务从本机应用程序中的仪表中提取读数。该过程效果不佳,因此是尝试解决此问题的一部分。我在应用程序中实现了裁剪功能,因此我们仅将图像的相关部分发送到服务。我遇到另一个问题。仪表上的模拟分隔符散布着,使它们读作一个。
未裁剪的仪表图像 uncroppped meter image
来自移动应用的裁剪图像 cropped image from the mobile app
我尝试过的。我创建了一个简单的服务器应用程序,以尝试删除这些行,然后再将图像发送到rekognito
const { img } = req.params; // Mat
const grayWithGaussianBlur = img
.cvtColor(cv.COLOR_BGR2GRAY)
.gaussianBlur(new cv.Size(5, 5), 0, 0, cv.BORDER_DEFAULT)
.canny(30, 150);
结果看起来像这样。 result
输出符合我的预期。我一直在尝试找出如何去除散布的边缘而留下清晰定义的边缘。
我过滤了轮廓,只留下了符合特定标准的轮廓。像面积大于某个阈值一样,
const contours = grayWithGaussianBlur.copy().findContours(cv.RETR_TREE, cv.CHAIN_APPROX_NONE);
const viable = contours.filter(contour => {
const { width,height } = contour.boundingRect();
return width > 5 && width <= height; // example criteria
});
const newImage = new cv.Mat(grayWithGaussianBlur.rows, grayWithGaussianBlur.cols, 0);
newImage.drawContours(viable, new cv.Vec3(255, 255, 255), -1);
无法正常工作。
我对图像处理概念的理解非常模糊,我不确定这是否是解决此问题的好方法。我对自己在做什么也不了解:)。
对不起,我没有足够的声誉来直接嵌入图像。
任何人都可以帮助或建议一种更好的方法来删除这些行。预先感谢。