opencv-python实际演练(二)军棋自动裁判(2)棋子图像采集效果分析

引子

在前一篇文章《opencv-python实际演练(二)军棋自动裁判(1)棋子图像采集设备DIY》介绍了棋子图像采集设备的制作过程,在取得棋子图像后发现提取目标区域的效果还不够好,有时不能正确地找出目标区域。本文试图找出影响目标区域提取的关键因素,为棋子图像采集设备的改进做出理论上的指导。

提取过程的实例分析

Canny 边缘检查结果如下:
在这里插入图片描述
直观上看,这个外边缘很完整,接下来查找外轮廓
contours,_ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
在这里插入图片描述
从上图可见,查找得到的外轮廓是相当准确的,而且已有的两个外轮廓都找到了,而且找得很准。

但是如果前一步的边缘检测的结果并没有两个清晰的外轮廓,比如用LED灯时,图像中间有很强的反光,则边缘检测就会出现很多不规则的区域,两个棋子区域可能还会连成在一起,棋子区域的边缘可能会出现断裂,这时查找外轮廓,得到的就不是两个轮廓了,而是可能找到几十个外轮廓,有一个实例中有反光的图片时,查找到了72个外轮廓,这时再继续提取区域意义就不大了,

如果棋子的周围有一个噪声点,形成了一些小的外轮廓,只要有两个面积较大的外轮廓将两个棋子包住 ,就可以通过计算轮廓的面积,将一些面积较小的噪声点形成的轮廓去掉。

但是在图片明暗不均,棋子外边缘没有完整呈现的情况下,通过去掉面积较小的轮廓并不能解决问题。

因此这一步的关键是在边缘检测时,能得到封闭的,包住两个棋子的边缘线,比如有一次实例中这个边缘线断裂了,,“团长”的“团”字形成的轮廓会被当成一个面积较大的轮廓并检测出来,但这并不我们想要的。

所以在采集图像时,我们要想办法在硬件上做一些调整,在二值化阈值等等参数上作一些调整,确保两个棋子的外框边线完整封闭,这样外轮廓检测算法才能找到正确的轮廓。直观上看来,就是边缘检查的结果中,两个外框线不能有断裂现象。

接下来对轮廓做多边形拟合
approxBox = cv2.approxPolyDP(c,epsilon,True)

如果将精度设得较高,误差值epsilon设得较小,则拟合得到的多边形边数较多,与原始轮廓比较接近,如下图所示,“连长”部分拟合得到一个7边形,团长部分得到一个5边形
在这里插入图片描述
通过增加epsilon的值 ,再次拟合:
在这里插入图片描述
这时发现拟合结果的边数减少了,减到了4,得到了一个4边形

然后再针对以上的4边形,获取最小矩形包络
rect = cv2.minAreaRect(approxBox)
用一个面积最小的矩形包住4边形。

这时得到的矩形可能有倾斜的情况,如果摄像头平面与棋子平面不平行,还有可能出现梯形状变形。从实际情况来看,保证摄像头平面与棋子平面的基本平行比较容易做到,所以梯形状变形出现的可能性不大。当然,这一类变形都可以通过透视变换进行一定程度的纠正。

影响目标区域提取效果的硬件因素分析

通过对硬件设备的调试,结合软件处理过程,我们得到影响提取效果的一些因素

1,棋子区域与非棋子区域的明暗对比,再者相差越大越好,如果两者相差不大,很难通过二值化将这两个区域区分开来,通过实验发现,盖板朝向摄像头的底面采用黑色,效果最好。

2,图像中不要出现反光,高光,明暗不均的现象,否则会造成很多不规则的轮廓。通过实现发现,用摄像头自带的LED会造成明显的明暗不均现象,目前看来,使用外部光源要比led照明效果发好很多。此外盖板朝向摄像头的底面不要采用反光材料,用黑纸或黑布效果最好,不要用塑料膜或塑料片。

3,放置棋子的矩形孔的边缘越平直越好,为什么呢?不是可以通过软件纠正吗?从上一节的分析可知,如果矩形孔的边缘不够平直,有许多毛刺,将会使拟合得到的初始多边形有许多的边,虽然通过迭代,最终可以得到4边形,但这个4边形可能发生严重的倾斜,变形等,很可能与棋子的原始区域并不相符。所以在制作盖析的棋子孔时,要尽可能地让边缘平直

4,放置棋子的矩形孔的大小要刚好使得棋子可以放入,不能太小,也不能太大。如果太大了,棋子放在其中,倾斜较大,也会对提取效果有一定的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值