Java和OpenCV颜色检测

时间:2016-06-16 08:39:04

标签: java opencv image-processing object-detection color-detection

我正在学校开展一个项目,主要是:编写一个应用程序让无人机自动飞行,并通过扫描挂在墙上的QR码,能够在房间内导航以完成一个某些任务。

我目前正在研究的是无人机检测纸箱(作为障碍物)。这些盒子是白色的,上面有一个蓝色圆圈。我打算如何解决这个问题,就是扫描框架中的颜色和方块:

如果无人机检测到方格,请检查它是否为白色。如果是白色,请检查它是否包含蓝色圆圈。如果是这样,我可以说它很可能是一个纸板箱。

这就是盒子的样子:

如果有人能够就如何开始进行颜色检测提供一些指示,我会非常高兴!

PS:我没有提供任何代码,因为我真的不知道提供什么。如果需要,我会非常乐意提供一些

更新:对于遇到与我同样问题的人,同学为我的确切情况提供了一个很好的链接:

http://opencv-java-tutorials.readthedocs.io/en/latest/08-object-detection.html

1 个答案:

答案 0 :(得分:1)

我会先从不同的角度来检测蓝圈。

  1. 检测基色

    请参阅RGB value base color name

  2. 选择所有与白色或灰色相邻的蓝色像素

    由于你的圆圈有黑色边框,所以你必须选择白色,灰色,黑色附近的所有蓝色像素...只是为了确定。这是结果(绿色是选定的像素):

    example

    另一种(更强大的)可能性是同时选择所有与白色和蓝色相邻的黑色像素。

  3. 进行关联组件分析

    所以将所有连接的像素合并为折线

  4. 对于每条折线,确定它是圆形/椭圆形/椭圆形

    可以通过调查线段之间的角度来完成。如果有尖锐的尖刺,则存在锋利的边缘并且它不是椭圆形。如果圆周距圆形/椭圆/椭圆太远而不是从其边界框计算出来,则它不是椭圆形,而是一些更复杂的曲率。

  5. 每个椭圆形决定是否填充蓝色

    所以只需填充椭圆周长的填充掩模,并比较原始图像蓝色与未处理的像素数量。如果比率接近100%蓝色,那么它将填充蓝色椭圆形....

    由于您的标记内部还有一些功能,您可以计算其中所有基色的比例,以更准确地检测标记。

    请查看Algorithms: Ellipse matching了解其他一些想法。

  6. 现在您可以同样检查背景是否为白色/灰色

  7. 还有很多其他可能的方法,比如OCR and character similarity或基于FFT / DCT,Hough变换用于圆圈......你也不仅仅局限于geometric properties comparation而是可以比较直方图。