任务:我的装配线末端安装了一个摄像头 捕获生产物品的图像。我们举个例子说,我们 制作门票(上面有一些文字和图片)。所以每一个 生成的票据被拍照并保存到磁盘上作为图像。现在我 我想检查这些保存的图像是否有异常(即比较 他们到图像(模板),这是好的)。所以,如果有问题 在我们的装配线上有一张票(缺少图片,污渍......),我的 应用程序应该找到它(因为它的图像与我的图像差别太大 模板)。
问题:比较图片和查找的最简单方法是什么 他们之间的差异?我是否需要编写自己的方法,或者我可以 使用现有的?如果我只设置一个公差值会很棒 (即图像可以相差1%),将两个图像放在一个函数中并得到 返回值为true或false:)
工具:C#或VB.NET,Emgu.CV(OpenCV的.NET包装器)或类似的东西
答案 0 :(得分:3)
我对OpenCV了解不多,但对图像处理有点了解。
前进的方式取决于拍摄新照片的频率。一种简单的方法是计算“好”模板的差异图片和实际产品的图像。
如果图像100%相同,则生成的图像应为空。如果有残留像素,您可以对这些像素进行计数,并将其作为偏离标准的度量。
但是,您必须匹配其中一个图像的方向(可能还有比例)以对齐边框,否则此方法将无效。
如果您有时间约束,您可能希望在处理之前减少图像中的信息(例如,使用边缘检测和/或将其转换为灰度或甚至单色位图,如果您的产品功能足够重要的话)< / p>
答案 1 :(得分:2)
我建议查看AForge Imaging library,因为它有很多非常有用的功能用于此类工作。
您可以使用以下几种方法:
此外,您需要确保知道故障单的哪些部分更重要。例如,我猜想丢失的徽标或水印是一个大问题。但是某些区域可能有可变文本,例如序列号,因此您希望它们不同。基本上,您可能需要将图像的某些区域与其他区域区别对待。
答案 2 :(得分:1)
我不知道细节,但我知道在高吞吐量必不可少的工业环境中,有时使用神经网络。它们将数百万比特(相机像素)变为1(好或坏)。 也许这会帮助您进行搜索。
答案 3 :(得分:1)
肯定有应用程序和库已经做了你想做的事情,但我不知道任何事情。显然,人们可以对这两个图像进行哈希处理并进行比较,但是期望事物相同并且不会为光线差异或类似事物留下任何余地。
假设您已经控制了图像中对象的方向相同且位置相同,那么可以做的一件事就是遍历每个图像的像素,并获得每个图像的HSV值这样:
Color color1 = Image1.GetPixel(i,j);
Color color2 = Image2.GetPIxel(i,j);
float hue1 = color1.GetHue();
float sat1 = color1.GetSaturation();
float bright1 = color1.GetBrightness();
float hue2 = color2.GetHue();
float sat2 = color2.GetSaturation();
float bright2 = color2.GetBrightness();
并与这些值进行一些比较。我认为,这可以让你比使用RGB值更可靠,特别是因为你想在比较中加入一些公差。
编辑:
为了好玩,我写了一个使用上述想法的小样本应用程序。基本上它总计了H,S和V值相差一些量的像素数(我选择了0.1作为我的值),然后如果H,S或V计数器超过38400或2%,则从比较循环中退出。像素(0.02 * 1600 * 1200)。在最坏的情况下,比较两个相同的图像花了大约2秒钟。当我比较一个已被改变到足以超过2%值的图像时,通常只需要几分之一秒。
显然,如果每秒产生大量图像,这可能会太慢,但我认为无论如何它都很有趣。
答案 4 :(得分:1)
我不是该领域的专家,但听起来你需要这样的东西
http://en.wikipedia.org/wiki/Template_matching
并且它支持OpenCV支持模板匹配 http://nashruddin.com/template-matching-in-opencv-with-example.html
答案 5 :(得分:1)
This guy here为同样的问题编写了一个简单的Java代码。我想,将它转换为C#并不难。它工作得很好,也可以在其中找到更新更强的版本。