【仓库物资识别】九、空车出库二(approxPolyDP函数的使用)

由于现场扫描区域范围的限制,不需要考虑到加高的车型,下左图为上一篇博客提到的车高车型。

 因为车型的限制,所以简化了工作量,随之而来的是新的小问题,如何分离出车头(因为我只需要考虑车身范围,进行分点等分操作)。上右图为扫描到的空车数据转换成的灰度图。

1、如何进行分割去点车头部分?

一开始是先想到的使用直方图统计的方法,找到车头和车身之间的分离处进行分割,但是由于本人水平有限,实现不了。

然后想到了设置二值化阈值,将车头找出来,由于车身和车头的实际高度差在两米左右,所以阈值的查找设置还是比较轻松得。

下图是二值化时设置了两个不同的阈值。

由图可见,车头被很好的分离出来了,车尾有一道也被分离出来了,是因为车身挡板原因,不会对结果造成太大的影响。

所以下一步就可以直接拿车头和车身二值化后的Mat直接相减。

相减的时候需要注意一下,黑色为0,白色为255,如果直接用图1减去图2,由于0-255为负,所以得到的差值图为全黑,解决这个问题,只要加上一个绝对值就可以了,若想得到白底黑车的图片,再加上取反函数即可(取反函数为:bitwise_not(img1, img2),支持就地操作,即输入输出可以是相同Mat)。图3为最终分离到的车身部分,对于除车身范围其他较小轮廓,可以在程序中设置范围进行滤除。

找角点:

对于车身正着得的时候,扫描到的车身近似矩形,所以依然可以用最小外接矩的方法找到车身的四个角点,然后进行后续处理。如下左一图。

如果每一位司机大哥都可以停的那么正的话,那就最好了,但是不能排除有些司机大哥的水平欠缺,从而导致车身歪斜。如上中,右图。对车身有角度的情况下,外接矩找到的角点就会有很大的误差,因为当车身是歪的,虽然现实中,车身任然是一个矩形,可是扫描到的一个平行四边形。外接矩就很难发挥作用。如下图:

解决办法:approxPolyDP函数

函数原型:

void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed);

第一个参数 InputArray curve:输入的点集
第二个参数OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的。画出来即是一个多边形;
第三个参数double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离。
第四个参数bool closed:若为true,则说明近似曲线是闭合的,反之,若为false,则断开。

 函数算法描述:

该函数采用是道格拉斯-普克算法(Douglas-Peucker)算法来实现。该算法也以Douglas-Peucker算法和迭代终点拟合算法为名。算法的目的是给出由线段组成的曲线(也称为折线),以找到具有较少点的相似曲线。该算法基于原始曲线和简化曲线(即曲线之间的豪斯多夫距离)之间的最大距离定义“不相似”。 简化曲线由定义原始曲线的点的子集组成。

起始曲线是有序的一组点或线,距离维度ε> 0。该算法递归地划分线。 最初给出了第一点和最后一点之间的所有点。 它会自动标记要保存的第一个和最后一个点。 然后找到距离第一点和最后一点组成的线段的最远的点作为终点; 这一点在距离终点之间的近似线段的曲线上显然最远。 如果该点比线段更接近于ε,那么当前未被标记的任何点将被保存,而没有简化的曲线比ε更差的可以丢弃。如果离线段最远的点距离近似值大于ε,则必须保留该点。 该算法以第一个点和最远点递归地调用自身,然后以最远点和最后一个点(包括最远点被标记为保留)递归调用自身。当递归完成时,可以生成一个新的输出曲线,其中包括所有且仅标记为保留的点。
使用的函数效果如下:

 代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值