我正在学校开展一个项目,主要是:编写一个应用程序让无人机自动飞行,并通过扫描挂在墙上的QR码,能够在房间内导航以完成一个某些任务。
我目前正在研究的是无人机检测纸箱(作为障碍物)。这些盒子是白色的,上面有一个蓝色圆圈。我打算如何解决这个问题,就是扫描框架中的颜色和方块:
如果无人机检测到方格,请检查它是否为白色。如果是白色,请检查它是否包含蓝色圆圈。如果是这样,我可以说它很可能是一个纸板箱。
这就是盒子的样子:
如果有人能够就如何开始进行颜色检测提供一些指示,我会非常高兴!
PS:我没有提供任何代码,因为我真的不知道提供什么。如果需要,我会非常乐意提供一些
更新:对于遇到与我同样问题的人,同学为我的确切情况提供了一个很好的链接:
http://opencv-java-tutorials.readthedocs.io/en/latest/08-object-detection.html
答案 0 :(得分:1)
我会先从不同的角度来检测蓝圈。
检测基色
选择所有与白色或灰色相邻的蓝色像素
由于你的圆圈有黑色边框,所以你必须选择白色,灰色,黑色附近的所有蓝色像素...只是为了确定。这是结果(绿色是选定的像素):
另一种(更强大的)可能性是同时选择所有与白色和蓝色相邻的黑色像素。
进行关联组件分析
所以将所有连接的像素合并为折线
对于每条折线,确定它是圆形/椭圆形/椭圆形
可以通过调查线段之间的角度来完成。如果有尖锐的尖刺,则存在锋利的边缘并且它不是椭圆形。如果圆周距圆形/椭圆/椭圆太远而不是从其边界框计算出来,则它不是椭圆形,而是一些更复杂的曲率。
每个椭圆形决定是否填充蓝色
所以只需填充椭圆周长的填充掩模,并比较原始图像蓝色与未处理的像素数量。如果比率接近100%蓝色,那么它将填充蓝色椭圆形....
由于您的标记内部还有一些功能,您可以计算其中所有基色的比例,以更准确地检测标记。
请查看Algorithms: Ellipse matching了解其他一些想法。
现在您可以同样检查背景是否为白色/灰色
还有很多其他可能的方法,比如OCR and character similarity或基于FFT / DCT,Hough变换用于圆圈......你也不仅仅局限于geometric properties comparation而是可以比较直方图。