本发明隶属于计算机视觉、图像处理、工业安全等领域,尤其涉及基于计算机视觉图像处理的港口集装箱起吊安全监测方法。
背景技术:
随着计算机视觉与图像处理技术的成熟,这些技术应用在其他领域也越来越广泛,让计算机取代人力,用低成本高效率的技术取代昂贵的技术也成为必然的发展趋势。在人们追求收益的过程中,安全也成为人们一大关注的问题,一旦发生安全事故,损失的可能就不仅仅是金钱收益,因此,为了安全,企业会花大量人力物力来解决各种安全问题,但是低成本高效益往往是不会停止的追求。
在港口集装箱起吊的过程中,卡车往往因为未完全与集装箱脱离而被吊起,这是一个很大的安全隐患。为了防止卡车被吊起,传统的方法在起吊机固定位置安装多个摄像头,由人工监测卡车是否被吊起。然而这种方法的缺陷是需要人力参与,无法实现自动化;避免不了人工的疏忽而造成安全事故;在某些情况下,可能人眼也无法快速准确的判别卡车的安全情况。也有一些企业使用激光等技术来监测卡车的安全状态,但是成本是非常高的。
因此,采用低成本高效率的技术来解决这个安全问题是刻不容缓的。
技术实现要素:
发明目的:解决港口集装箱起吊时,卡车可能被吊起而造成安全事故的的安全问题。技术方案:本发明公开了基于计算机视觉图像处理的港口集装箱起吊安全监测方法,本发明方法是对头部和尾部两个摄像头采集到的数据,用两个线程并行执行,分别判断卡车是否安全,并给出每个摄像头的判断结果,一旦其中一个摄像头给出卡车被吊起的结果,则合并两个摄像头的结果,即认为卡车是不安全的;若两个摄像头均未给出卡车被吊起的结果,则合并两个摄像头的结果,即认为卡车是安全的。
本发明采用两个摄像头采集视频图像数据,对两个摄像头采集的数据,用两个线程并行处理,对于每个线程处理的过程,包括步骤1~步骤8:
步骤1:获取初始化数据,设置监测信号的初始值,监测信号包括起吊信号signal1、判断信号signal2和结束信号signal3;
步骤2:根据初始化数据计算参数,得到感兴趣区域rlsd;
步骤3:根据初始化参数中给定的摄像头标号,读取对应摄像头的视频流第一帧,进行图像预处理,在感兴趣区域rlsd内进行lsd直线检测;
步骤4:根据卡车与集装箱的交界位置与lsd直线检测结果,利用最小二乘直线拟合方法得到一条直线方程l,从而得到了用直线方程表示的集装箱与卡车较为精确的交界位置;
步骤5:根据直线方程l与步骤2中求得的参数,对卡车与集装箱进行标记,获得标记点的序列initmarks;
步骤6:设置判断信号signal2信号为真利用lk光流
对步骤5中的标记点序列initmarks进行运动跟踪;
步骤7:给出判断结果:对每一帧判断卡车是否被吊起,若连续5帧图像的判断结果都是被吊起,则给出最终判断结果危险,卡车处于危险起吊状态;若结束信号signal3被设置为真时,还未给出危险的判断结果,则给出最终判断结果为安全。
步骤8:综合两个线程处理的结果:如果其中一个线程判断结果是危险,则给出两个线程的最终判断结果为卡车处于不安全状态;如果两个线程判断结果都是安全,则给出两个线程的最终判断结果为卡车处于安全状态
步骤1包括如下步骤:
步骤1-1,初始化数据。
设置摄像头参数:摄像头有两个,拍摄到集装箱与卡车头部交界位置的摄像头设置为1号摄像头,拍摄到集装箱与卡车尾部交界位置的摄像头设置为2号摄像头;
设置集装箱的大小参数:集装箱的大小为12m长的集装箱或者6m长的集装箱;
以图像左上角为原点建立以像素为单位的图像坐标系x-y,像素的横坐标x与纵坐标y分别是在其图像数组中所在的列数与所在的行数。获取卡车与集装箱交界的初始化位置,包括图像坐标系中三条直线线段l1(p0(xl1p0,yl1p0),p1(xl1p1,yl1p1))、线段l2(p2(xl2p0,yl2p0),p3(xl2p1,yl2p1))与线段l3(p4(xl3p0,yl3p0),p5(xl3p1,yl3p1)),其中用线段l1(p0(xl1p0,yl1p0),p1(xl1p1,yl1p1))表示集装箱卡车交界位置的直线段,用线段l2(p2(xl2p0,yl2p0),p3(xl2p1,yl2p1))两个端点p2的纵坐标yl2p0与p3的纵坐标yl2p1表示卡车和集装箱的交界位置左端点在y方向的范围,用线段l3(p4(xl3p0,yl3p0),p5(xl3p1,yl3p1))两个端点p4的纵坐标yl3p0与p5的纵坐标yl3p1代表卡车和集装箱的交界位置右端点在y方向的范围;
步骤1-2,三种监测信号可由起吊机控制系统分别在起吊机刚启动、起吊机提起来20cm与起吊机提起来60cm的时候给出,一旦信号被激发,起吊机安全检测系统将给出相应的操作,设置三种监测信号的初始值:设置起吊信号signal1为真,判断信号signal2为假,结束信号signal3为假;
信号signal1为集装箱起吊开始信号,即从此刻开始进行读入视频帧,之后将对每一帧进行处理;
信号signal2为集装箱起吊20cm的信号,一般情况下,集装箱需要起吊到一定高度后,才能进行判断并给出结果,因为本方法是基于运动跟踪的解决方案,如果运动量太小,再加上即使卡车没有被吊起,卡车还是会有一定运动位移,主要在轮胎部位产生的位移,这样将会导致判断不出来卡车是否被吊起或者误判;
信号signal3表示如果在集装箱起吊60cm之前都未给出判断结果,则给出的集装箱起吊60cm的信号,收到此信号的时候,将结束判断,判定没有出现危险。
当起吊机提起来20cm时,判断信号signal2为真;
当起吊机提起来60cm时,结束信号signal3为真。
步骤2包括如下步骤:
步骤2-1,计算卡车与集装箱的交界位置所在的图像坐标系x方向范围的中间值xmid:
步骤2-2,计算卡车与集装箱的交界位置的范围,将卡车与集装箱的交界位置所在的图像像素坐标系在y方向的范围分为两部分:将像素坐标系坐标x∈(xl2,xmid)部分的y方向范围由l2限定,而像素坐标系坐标x∈(xmid,xl3)部分的y方向范围由l3限定,其中xl2为xl2p0与xl2p1之间的较小值,xl3为xl3p0与xl3p1之间的较大值:
xl2=min(xl2p0,xl2p1),
xl3=min(xl3p0,xl3p1);
步骤2-3,计算卡车与集装箱交界位置形成的直线斜率k0:
在摄像机正对着集装箱与卡车的尾部时,即y11p1=yl1p0的情况是比较理想的情况,此时k0=0,但是摄像头通常无法安装的如此精准,能够正对着卡车的尾部,总会产生一些倾斜透视效果,因此在实验中通常需要一个k0来表示卡车与集装箱的大致走向;
步骤2-4,计算进行lsd(直线分割检测器,linesegmentdetector,lsd)直线检测的感兴趣区域rlsd(plu(xlsd,ylsd),wlsd,hlsd):rlsd(plu(xlsd,ylsd),wlsd,hlsd)代表了表示进行lsd直线检测的矩形区域,其中plu(xlsd,ylsd)表示矩形区域图像像素坐标系中左上方顶点,xlsd,ylsd分别表示该顶点的横坐标和纵坐标,wlsd、hlsd分别表示矩形区域的长和宽;rlsd(plu(xlsd,ylsd),wlsd,hlsd)的计算方法如下:
每个线程读取对应摄像头的一帧视频帧,假设采集到的视频帧的显示分辨率为resw×resh,其中resw表示采集到的视频帧的列数,resh则表示采集到的视频帧的行数。计算l1的长度dl1、l2的长度dl2、l3的长度dl3:
dl2=|yl2p0-yl2p1|,
dl3=|yl3p0-yl3p1|;
计算xlsd、ylsd、wlsd及hlsd:
xlsd=max(0,xl2-dl2),
wlsd=min(2×dl1,resw-xlsd),
hmin=|max(yl3p0,yl3p1,yl2p0,yl2p1)-min(yl3p0,yl3p1,yl2p0,yl2p1)|,
hlsd=min(hmin+dl2+dl3,resh-ylsd);
其中hmin表示l2与l3的y坐标最大值减去最小值。经过详细的推导计算,得到了rlsd各个参数的值;
步骤2-5,计算图像像素坐标系下打标记点的范围:图像像素坐标下,x方向上打标记的范围记为(xl,xr),其中,xl表示标记点在x方向最小坐标;xr表示标记点在x方向最大坐标;图像像素坐标下,集装箱上的标记点y方向上的宽度范围记为wt,卡车上的标记点y方向上的宽度范围记为wb,计算公式如下所示:
步骤3包括以下步骤:
步骤3-1:当signal1设置为真后,两个线程分别读取对应摄像头视频流第一帧,进行图像预处理,将图像处理为灰度图像;
步骤3-2:对步骤3-1得到的灰度图像进行直方图均衡化处理,目的是图像增强;
步骤3-3:保留在感兴趣区域rlsd范围内的图像区域,记为区域a1,去除不在感兴趣区域rlsd范围内的图像区域,然后进行直线检测,输出为线段的端点坐标序列。
步骤3-3中所述进行直线检测,包括如下步骤:
步骤3-3-1,计算图像区域a1所有像素的梯度值及梯度方向;
步骤3-3-2,遍历图像区域a1中每个像素,执行区域增长算法,得到一个梯度值与梯度方向一致的像素区域r;
步骤3-3-3,判断r是否为一个有效的直线区域,若是则保留,否则丢弃;
步骤3-3-4,得到直线检测结果,即得到一系列直线线段序列linelsd,linelsd中保存着直线的端点坐标。
步骤4包括以下步骤:
步骤4-1:筛选步骤3中得到的直线线段,如果linelsd中所有线段都已被访问过,则进入步骤4-4,否则选取一条linelsd中未被访问过的直线线段,按如下规则进行筛选:计算当前访问的直线线段的斜率k,计算直线斜率k与k0的差值dk=|k-k0|,根据设定阈值d0,且d0=0.1,如果dk<d0,则该直线线段保留,并进入步骤4-2;否则判定此直线筛选未通过,进入步骤4-3;
步骤4-2:将步骤4-1筛选出来的直线线段再做一次筛选,假设直线的两个端点坐标分别(xstart,ystart),(xend,yend):
条件1,端点(xstart,ystart)满足:xstart,<xmid,xstart,>xl2,,ystart<yl2p1,ystart>yl2p0,这四个范围限定条件同时满足时,此条件为真,否则此条件为假;
条件2,端点(xend,yend)满足:xend>xmid,xend<xl3,yend>yl3p0,yend<yl3p1,这四个范围限定条件同时满足时,此条件为真,否则此条件为假;
当直线的两个端点坐标满足条件1为真或者条件2为真的情况下,这条直线就保留下来,返回步骤4-1访问下一条直线,否则就进入步骤4-3;
步骤4-3:舍弃筛选未通过的直线线段,返回步骤4-1访问下一条直线;
步骤4-4:对经过步骤4-1~步骤4-3筛选,并保留下来的直线段端点坐标进行最小二乘法直线拟合得到直线方程l,直线方程l的函数形式为:
y1=ax1+b;
其中x1、y1为两个变量,a和b为两个未知参数,a为直线方程l的斜率,b为直线方程l的截距,运行直线拟合的算法,求得未知参数,这条直线基本上能够对应集装箱与卡车的分界位置,即能很好的模拟这个位置;
步骤4-5:输出斜率a和截距b。
步骤5包括以下步骤:
步骤5-1:两个线程分别继续读取对应摄像头的一帧视频帧,并采用直方图均衡化对新输入一帧图像进行图像增强的调整;
步骤5-2:以x坐标增量为5像素,记为δ1;y坐标增量为10像素,记为δ2,并根据直线方程l与步骤2中确定的打标记点的坐标范围,在卡车上与集装箱上获取标记点,并将标记点保存到initmarks中。用一个pos序列来标记每个标记点的位置,即根据步骤4中的直线方程l,计算每个标记点与直线方程描述直线的关系,对于一个标记点i,当直线方程的x坐标取值x1与标记点的坐标xi取值相同时,若标记点的y坐标yi小于直线方程计算出来的y1值,则将pos[i]的值修改为1中,否则修改为-1,即:如果这个标记点在集装箱上,pos[i]=1,否则这个标记点就在卡车上,pos[i]=-1。
步骤5-3:输出步骤5-2中n个标记点组成的序列initmarks=(s1,s2,s3,……,sn-1,sn),sn表示第n个标记点,然后将initmarks赋值给序列s。
步骤6包括以下步骤:
步骤6-1:两个线程分别继续读取对应摄像头的一帧视频帧,采用直方图均衡化方法增强图像;
步骤6-2:采用lk光流法跟踪序列s,跟踪结束后,得到标记每个点是否跟踪成功的状态标志序列status=(flag1,flag2,……,flagn),flagn表示第n个标记点,其中n为序列s中标记点的个数;如果标记点si跟踪失败,i∈n,则flagi为0,否则flagi为1,根据状态标志序列status,将标志位为0的标记点在s及initmarks中都清除掉;
步骤6-3:对跟踪成功的点用ransac方法筛选一次,将误匹配标记点在s及initmarks中都清除掉;
步骤6-4:如果判断信号signal2为真,则进入步骤7,否则返回步骤6-1。
步骤7包括以下步骤:
步骤7-1:将序列s赋值给临时标记点序列stemp,并将initmarks赋值给initmarkstemp;
步骤7-2:将临时标记点序列stemp进行划分,即分成集装箱上的标记点序列sbox与卡车上的标记点序列struck,若标记点在pos序列中的值是1,则将标记点放入序列sbox中,否则,将标记点放入序列struck中;由于stemp中保存的是步骤6中运动跟踪成功的标记点的位置,而initmarkstemp中保存的是stemp中的标记点在第一帧中的位置,stemp与initmarkstemp中的点都是一一对应的,顺序也是一致的,因此,将struck在initmarkstemp中对应的点划分到initmarkstruck中,而将sbox在initmarkstemp中对应的点划分到initmarksbox中;
步骤7-3:将stemp中所有的标记点进行预处理:将stemp中位移大于所有标记点的平均位移3倍的标记点去除掉,同时也去除掉initmarkstemp中对应的标记点。在图像坐标系下,根据initmarkstemp与序列stemp中保存的每个标记点的坐标,分别计算卡车上的标记点在x方向与y方向的平均位移
根据计算出来的值,分别将sbox与struck进行一次筛选,筛选的依据如下:
如果是集装箱上的标记点,x方向与y方向上的位移分别为dx、dy,且满足条件3和条件4中任意一条件,则删除该标记点:
条件3:
条件4:
如果是卡车上的标记点,x方向与y方向上的位移分别为dx、dy,且满足条件5和条件6中任一条件,则删除该标记点:
条件5:
条件6:
步骤7-4;根据7-3处理过的标记点序列sbox与struck来判断卡车是否被吊起:以下列出的四个条件中条件7、条件8、条件9至少两个条件同时为真或者条件10为真,则判定当前帧卡车被吊起,并给出当前帧的判断结果为卡车被吊起,否则给出判断结果为安全:
条件7,拟合直线进行判断:标记点序列struck经过最小二乘直线拟合得到直线方程l1,标记点序列sbox经过最小二乘直线拟合得到直线方程l2,标记点序列initmarkstemp经过最小二乘直线拟合得到直线方程l3;l1与l3方程之间的斜率差为α1、l1与l2方程之间的斜率差为α2,设定夹角的阈值为α,且α=0.08,如果夹角α1>α且α2>α,则认为此条件为真,卡车有可能被吊起;
条件8,当前帧,卡车上的标记点在x方向上有位移δxt,设定阈值δx0,且δx0=10,卡车上的标记点有
条件9,当前帧,卡车上的标记点在y方向上有位移δyt,,设定阈值δy0,且δy0=20,卡车上的标记点有
条件10,当前帧,卡车上的标记点与集装箱上的标记点在y方向上有位移δy,设定阈值δ,且δ=40,当有
步骤7-5;如果连续5帧图像的判断结果都是卡车被吊起,则给出最终的判断结果,即卡车被吊起,结束判断;
步骤7-6:如果signal3被设置为真,步骤7-5还未给出最终的判断结果,则判定没有发生危险,结束判断,否则继续读取下一帧,执行步骤6。
关于步骤3中的lsd算法、步骤5中的直方图均衡化处理、步骤6中的lk光流法和ransac方法涉及的参考文献如下:
[1]bradskig,kaehlera.learningopencv:computervisionwiththeopencvlibrary[m]."o'reillymedia,inc.",2008.
[2]pizersm,amburnep,austinjd,etal.adaptivehistogramequalizationanditsvariations[j].computervision,graphics,andimageprocessing,1987,39(3):355-368.
[3]derpaniskg.overviewoftheransacalgorithm[j].imagerochesterny,2010,4(1):2-3.
[4]vongioirg,jakubowiczj,moreljm,etal.lsd:afastlinesegmentdetectorwithafalsedetectioncontrol[j].ieeetransactionsonpatternanalysisandmachineintelligence,2010,32(4):722-732.
[5]vongioirg,jakubowiczj,moreljm,etal.lsd:alinesegmentdetector[j].imageprocessingonline,2012,2:35-55.)
有益效果:在港口集装箱起吊的过程中,卡车往往因为未完全与集装箱脱离而被吊起是一个安全隐患。为了判断卡车是否被吊起,传统的方法在起吊机固定位置安装多个摄像头,由人工监测卡车是否被吊起或者也有一些企业使用激光等技术来监测卡车的安全状态,但是成本是非常高的。因此,采用低成本高效率的技术来解决这个安全问题是刻不容缓的,而本发明就提出了一种基于计算机视觉与数字图像处理技术的有效方法。
附图说明
图1为本发明港口集装箱起吊安全监测方法对每个摄像头采集到的数据进行处理的基本流程图。
图2为或取初始化数据中的三条直线线段示例图。
图3a为卡车尾部一个角被吊起时通过初始化数据计算的卡车与集装箱的大致交界位置的范围。
图3b为卡车未被吊起时通过初始化数据计算的卡车与集装箱的大致交界位置的范围。
图3c为卡车尾部两个角被吊起时通过初始化数据计算的卡车与集装箱的大致交界位置的范围。
图4a为卡车尾部一个角被吊起时根据初始化数据计算出的对图像进行lsd直线检测的范围。
图4b为卡车未被吊起时根据初始化数据计算出的对图像进行lsd直线检测的范围。
图4c为卡车尾部两个角被吊起时根据初始化数据计算出的对图像进行lsd直线检测的范围。
图5a为卡车尾部一个角被吊起时进行lsd直线检测的结果。
图5b为卡车未被吊起时进行lsd直线检测的结果。
图5c为卡车尾部两个角被吊起时进行lsd直线检测的结果。
图6a为卡车尾部一个角被吊起,寻找到的卡车与集装箱交界位置较为精确的位置,由一条黑色的直线标记出来。
图6b为卡车未被吊起,寻找到的卡车与集装箱交界位置较为精确的位置,由一条黑色的直线标记出来。
图6c为卡车尾部两个角被吊起,寻找到的卡车与集装箱交界位置较为精确的位置,由一条黑色的直线标记出来。
图7a为卡车尾部一个角被吊起,对卡车与集装箱标记的结果。
图7b为卡车未被吊起,对卡车与集装箱标记的结果。
图7c为卡车尾部两个角被吊起,对卡车与集装箱标记的结果。
图8a为卡车尾部一个角被吊起,对标记点进行跟踪的情况,这是跟踪过程中的一帧数据。
图8b为卡车未被吊起,对标记点进行跟踪的情况,这是跟踪过程中的一帧数据。
图8c为卡车尾部两个角被吊起,对标记点进行跟踪的情况,这是跟踪过程中的一帧数据。
图9a为卡车尾部一个角被吊起,当给出判断信号后,给出卡车是否被吊起的判断结果。
图9b为卡车未被吊起,当给出判断信号后,给出卡车是否被吊起的判断结果。
图9c为卡车尾部两个角被吊起,当给出判断信号后,给出卡车是否被吊起的判断结果。
具体实施方式
下面结合附图和具体实施方式对本发明做更进一步的具体说明,但本发明的应用范围不限于此:
本发明是对头部和尾部两个摄像头采集到的数据,用两个线程并行执行,分别判断卡车是否安全,并给出每个摄像头的判断结果,一旦其中一个摄像头给出卡车被吊起的结果,则合并两个摄像头的结果,即认为卡车是不安全的;若两个摄像头均未给出卡车被吊起的结果,则合并两个摄像头的结果,即认为卡车是安全的。
具体地说,如图1所示,本发明公开了基于计算机视觉图像处理的港口集装箱起吊安全监测方法,其中对每个摄像头的处理过程主要包括以下几个步骤:
步骤1:获取初始化数据,设置监测信号。
初始化数据包括以下内容:
1)设置摄像头参数,代表安装在不同地方的设备;
2)集装箱的大小参数,12m长的集装箱或者6m长的集装箱;
3)获取卡车与集装箱交界的初始化位置,包括图像坐标系中三条直线线段l1(p0(xl1p0,yl1p0),p1(xl1p1,yl1p1))、线段l2(p0(xl2p0,yl2p0),p1(xl2p1,yl2p1))与线段l3(p0(xl3p0,yl3p0),p1(xl3p1,yl3p1));
三种监测信号可由起吊机控制系统分别在起吊机刚启动、起吊机提起来20cm与起吊机提起来60cm的时候给出,一旦信号被激发,起吊机安全检测系统将给出相应的操作,监测信号包括三种信号:
1)信号signal1:集装箱起吊开始信号,即从此刻开始进行读入视频帧,之后将对每一帧进行处理;
2)信号signal2:集装箱起吊20cm的信号,一般情况下,集装箱需要起吊到一定高度后,才能进行判断并给出结果,因为本方法是基于运动跟踪的解决方案,如果运动量太小,再加上即使卡车没有被吊起,卡车还是会有一定运动位移,主要在轮胎部位产生的位移,这样将会导致判断不出来卡车是否被吊起或者误判;
3)信号signal3——如果在集装箱起吊60cm之前都未给出判断结果,则给出集装箱起吊60cm的信号,收到此信号的时候,将结束判断,认为没有出现危险;
步骤2:根据初始化数据计算参数。包括以下参数:
1)根据线段l1(p0(xl1p0,yl1p0),p1(xl1p1,yl1p1)),找到卡车与集装箱大致的交界位置在图像坐标系x方向的一个中间值xmid;
2)计算卡车与集装箱大致的交界位置的范围,将卡车与集装箱大致的交界位置所在的图像像素坐标系在y方向的范围分为两部分:将像素坐标系坐标x∈(xl2,xmid)部分的y方向范围由l2限定,而像素坐标系坐标x∈(xmid,xl3)部分的y方向范围由l3限定,其中xl2为xl2p0与xl2p1之间的较小值,xl3为xl3p0与xl3p1之间的较大值;
3)计算卡车与集装箱交界位置形成的直线斜率k0;
4)计算进行lsd直线检测的感兴趣区域rlsd(plu(xlsd,ylsd),wlsd,hlsd);
5)计算打标记点的范围,x方向上打标记的范围为(xl,xr),图像像素坐标下,图像像素坐标下,集装箱上的标记点y方向上的宽度范围记为wt,卡车上的标记点y方向上的宽度范围记为wb;
步骤:3:对图像感兴趣区域运行直线分割检测器(linesegmentdetector,lsd),检测直线线段。起吊信号signal1设置为真后,读取当前视频流第一帧,进行图像预处理,然后在感兴趣区域rlsd(plu(xlsd,ylsd),wlsd,hlsd)内进行lsd直线检测;
步骤4:根据卡车与集装箱的交界位置与lsd直线检测结果,利用最小二乘直线拟合方法得到一条直线方程l;
步骤5:根据直线方程l与步骤2中求得的参数,对卡车与集装箱进行标记,获得标记点的序列initmarks;
步骤6:当signal2信号为真,根据摄像头标号,读取对应摄像头的视频流一帧,利用lk光流对步骤5中的标记点序列initmarks进行运动跟踪,给出当前帧的跟踪结果,并进入步骤7,判断当前帧中卡车是否被吊起;
步骤7:给出卡车是否被吊起的判断结果:对当前帧判断卡车是否被吊起,若当前是连续第5帧给出判断结果为卡车被吊起,则给出当前摄像头最终判断结果为危险,即卡车处于危险起吊状态,结束判断;若结束信号signal3被设置为真时,当前线程处理的摄像头还未给出危险的判断结果,则给出当前摄像头最终判断结果为安全,结束判断;否则继续步骤6。
对于步骤1,获取初始化数据以及从监控摄像头中读取视频帧,设置监测信号具体实施细节如下步骤:
步骤1-1:设置摄像头参数,即标号数据不同,代表安装在不同地方的设备,以便针对不同设备设置不同参数,摄像头有两个,分别是拍摄到集装箱与卡车头部交界位置的1号摄像头与拍摄到集装箱与卡车尾部交界位置的2号摄像头;
步骤1-2:集装箱的大小参数,12m长的集装箱或者6m长的集装箱;
步骤1-3:设置起吊信号signal1为真,判断信号signal2为假,结束信号signal3为假;
步骤1-4:获取卡车与集装箱交界的初始化位置:包括图像坐标系中三条直线线段l1(p0(xl1p0,yl1p0),p1(xl1p1,yl1p1))、线段l2(p2(xl2p0,yl2p0),p3(xl2p1,yl2p1))与线段l3(p4(xl3p0,yl3p0),p5(xl3p1,yl3p1)),其中线段l1表示集装箱卡车交界位置的直线段,此线段大致代表了交界位置,其中线段l2表示卡车和集装箱大致的交界位置左端点在y方向的范围,其中l3代表卡车和集装箱大致的交界位置右端点在y方向的范围,l1、l2、l3的位置关系如图2所示。
对于步骤2,根据初始化数据计算参数具体实施细节如下步骤:
步骤2-1:计算卡车与集装箱大致的交界位置所在的图像像素坐标系x方向范围的中间值为:
步骤2-2:计算卡车与集装箱大致的交界位置的范围,将卡车与集装箱大致的交界位置所在的图像像素坐标系在y方向的范围分为两部分:将像素坐标系坐标x∈(xl2,xmid)部分的y方向范围由l2限定,而像素坐标系坐标x∈(xmid,xl3)部分的y方向范围由l3限定。其中xl2为xl2p0与xl2p1之间的较小值,xl3为xl3p0与xl3p1之间的较大值:
xl2=min(xl2p0,xl2p1),
xl3=min(xl3p0,xl3p1);
步骤2-3:计算直线检测的图像范围以及卡车与集装箱交界位置形成的直线斜率,记为为k0:
在摄像机正对着集装箱与卡车的尾部时,即yl1p1=yl1p0的情况是比较理想的情况,此时k0=0,但是摄像头通常无法安装的如此精准,能够正对着卡车的尾部,总会产生一些倾斜透视效果,因此在实验中通常需要一个k0来表示卡车与集装箱的大致走向;
步骤2-4:计算进行lsd直线检测的范围。在的图像像素坐标系上将范围表示为rlsd(plu(xlsd,ylsd),wlsd,hlsd);rlsd(plu(xlsd,ylsd),wlsd,hlsd)代表了进行lsd直线检测的矩形区域,其中plu(xlsd,ylsd)表示矩形区域图像像素坐标系中左上方顶点,wlsd、hlsd分别表示矩形区域的长和宽;rlsd(plu(xlsd,ylsd),wlsd,hlsd)的计算方法如下:
假设摄像头采集的视频帧的显示分辨率为resw×resh。由于直线线段l2、l3在像素坐标系的x坐标是一样的,因此线段l2、l3的长度dl2、dl3只需要求y坐标相减的绝对值,而l1则需要用欧氏距离计算:
dl2=|yl2p0-yl2p1|,
dl3=|yl3p0-yl3p1|;
接下来计算xlsd、ylsd、wlsd及hlsd:
xlsd=max(0,xl2-dl2),
wlsd=min(2×dl1,resw-xlsd),
hmin=|max(yl3p0,yl3p1,yl2p0,yl2p1)-min(yl3p0,yl3p1,yl2p0,yl2p1)|,
hlsd=min(hmin+dl2+dl3,resh-ylsd);
经过详细的推导计算,得到了rlsd各个参数的值;
步骤2-5:计算图像像素坐标系下打标记点的范围。图像像素坐标下,x方向上打标记的范围记为(xl,xr),其中,xl表示标记点在x方向最小坐标;xr表示标记点在x方向最大坐标;图像像素坐标下,集装箱上的标记点y方向上的宽度范围记为wt,卡车上的标记点y方向上的宽度范围记为wb,其中计算公式如下所示:
对于步骤3,对图像感兴趣区域运行lsd算法,检测直线线段具体实施细节如下步骤:
步骤3-1:将输入图像处理为灰度图像;
步骤3-2:对步骤3-1的结果进行直方图均衡化处理,目的是图像增强;
步骤3-3:根据步骤二计算得到的lsd直线检测范围rlsd(plu(xlsd,ylsd),wlsd,hlsd),将图像在该范围内的图像区域保留,而将图像内其他区域去除,接下来进行直线检测,并输出为线段的端点坐标序列,直线检测的原理大致如下:
1)计算图像像素的梯度值及梯度方向;
2)遍历每个像素,执行区域增长算法,得到r;
3)判断r是否为一个有效的直线区域,若是则保留,否则丢弃;
4)遍历完成,得到直线检测结果;
对于步骤4,计算集装箱与卡车较为精确的交界位置具体实施细节如下步骤:
步骤4-1:筛选步骤3中得到的直线线段,如果linelsd中所有线段都已被访问过,则进入步骤4-4,否则选取一条linelsd中未被访问过的直线线段,按如下规则进行筛选:计算当前访问的直线线段的斜率k,计算直线斜率k与k0的差值dk=|k-k0|,根据设定阈值d0,且d0=0.1,如果dk<d0,则该直线线段保留,并进入步骤4-2;否则认为此直线筛选未通过,进入步骤4-3;
步骤4-2:将步骤4-1筛选出来的直线再做一次筛选,假设直线的两个端点坐标分别(xstart,ystart),(xend,yend):
1)端点(xstart,ystart)满足:端点坐标的x坐标:xstart<xmid端点坐标的x坐标:xstart>xl2,端点坐标的y坐标:ystart<yl2p1,端点坐标的y坐标:ystart>yl2p0,这四个范围限定条件同时满足时,此条件为真,否则此条件为假;
2)端点(xend,yend)满足:端点坐标的x坐标:xend>xmid,端点坐标的x坐标:xend<xl3,端点坐标的y坐标:yend>yl3p0,端点坐标的y坐标:yend<yl3p1,这四个范围限定条件同时满足时,此条件为真,否则此条件为假;
当直线的两个端点坐标满足1)为真或者2)为真的情况下,这条直线就保留下来,返回步骤4-1访问下一条直线,否则就进入步骤4-3;
步骤4-3:舍弃此线段,返回步骤4-1访问下一条直线;
步骤4-4:对经过前面三个步骤筛选,并保留下来的直线段端点坐标进行最小二乘法直线拟合,由于我们知道要根据观测数据拟合一条直线,因此这两个变量之间的函数形式我们可以假设为:
y1=ax1+b;
其中x、y为两个变量,而a和b为两个未知参数,a为直线方程斜率,b为直线方程截距,运行直线拟合的算法,求得未知参数,这条直线基本上能够对应集装箱与卡车的分界位置,即能很好的模拟这个位置;
步骤4-5:输出直线的参数斜率a和截距b。
对于步骤5,在交界位置进行标记,获得要跟踪的点集具体实施细节如下步骤:
步骤5-1:根据初始化参数中给定的摄像头标号,继续读取对应摄像头的一帧视频帧,并采用直方图均衡化对新输入一帧图像进行图像增强的调整;
步骤5-2:以x坐标增量为5像素,记为δ1;y坐标增量为10像素,记为δ2,并根据直线方程l与步骤2中确定的打标记点的坐标范围,在卡车上与集装箱上获取标记点,并将标记点保存到initmarks中。用一个pos序列来标记每个标记点的位置,即根据步骤4中的直线方程l,计算每个标记点与直线方程描述直线的关系,对于一个标记点i,当直线方程的x坐标取值x1与标记点的坐标xi取值相同时,若标记点的y坐标yi小于直线方程计算出来的y1值,则将pos[i]的值修改为1中,否则修改为-1;
步骤5-3:输出步骤5-2中n个标记点组成的序列initmarks=(s1,s2,s3,……,sn-1,sn),sn表示第n个标记点,然后将initmarks赋值给序列s。
对于步骤6,对标记点进行运动目标跟踪具体实施细节如下步骤:
步骤6-1:根据初始化参数中给定的摄像头标号,继续读取对应摄像头的一帧视频帧,采用直方图均衡化方法增强图像;
步骤6-2:采用lk光流法跟踪序列s,跟踪结束后,得到标记每个点是否跟踪成功的状态标志序列status=(flag1,flag2,……,flagn),其中n为序列s中标记点的个数;如果标记点si跟踪失败,i∈n,则flagi为0,否则flagi为1,根据状态标志序列status,将标志位为0的标记点在s及initmarks中都清除掉;
步骤6-3:对跟踪成功的点用ransac方法筛选一次,将误匹配标记点在s及initmarks中都清除掉;
步骤6-4:如果判断信号signal2为真,则进入步骤7,否则返回步骤6-1。
对于步骤7,给出判断结果具体实施细节如下步骤:
步骤7-1:将s赋值给stemp,后面的步骤将对临时标记点序列stemp操作;
步骤7-2:将临时标记点序列stemp进行划分,即分成集装箱上的标记点序列sbox与卡车上的标记点序列struck,若标记点在pos序列中的值是1,则将标记点放入序列sbox中,否则,将标记点放入序列struck中;对应的,将initmarkstemp划分成initmarksbox、initmarkstruck;
步骤7-3:将stemp中所有的标记点进行预处理:将stemp中位移大于所有标记点的平均位移3倍的标记点去除掉,同时也去除掉initmarkstemp中对应的标记点。在图像坐标系下,根据initmarkstemp与序列stemp中保存的每个标记点的坐标,分别计算卡车上的标记点在x方向与y方向的平均位移
根据计算出来的值,分别将sbox与struck进行一次筛选,筛选的依据如下:
1)如果是集装箱上的标记点,x方向与y方向上的位移分别为dx、dy,且满足如下条件中任一条件,则删除该标记点:
条件1
条件2
2)如果是卡车上的标记点,x方向与y方向上的位移分别为dx、dy,且满足如下条件中任一条件,则删除该标记点:
条件1
条件2
步骤7-4;根据7-4处理过的标记点序列sbox与struck来判断卡车是否被吊起,判断的依据是:以下列出的四个条件中条件1、条件2、条件3至少两个条件同时满足或者满足条件4,则认为当前帧卡车被吊起,并给出当前帧的判断结果为卡车被吊起,否则给出判断结果为安全;
条件1拟合直线进行判断:当前帧卡车上的点经过最小二乘直线拟合得到直线方程l1,当前帧集装箱上的点经过最小二乘直线拟合得到直线方程l2,第一帧卡车上与当前帧卡车上对应的标记点经过最小二乘直线拟合得到直线方程l3;l1与l3之间形成一定夹角α1、l1与l2之间形成夹角α2,设定夹角的阈值为α,一旦夹角α1>α且α2>α,则认为此条件为真,卡车有可能被吊起;
条件2当前帧,卡车上的标记点在x方向上有位移δxt,设定阈值δx0,车上的标记点有
条件3当前帧,卡车上的标记点在y方向上有位移δyt,设定阈值δy0,车上的标记点有
条件4当前帧,卡车上的点与集装箱上的点在y方向上有位移δy,设定阈值δ则认为此条件为真,当有
步骤7-5;如果连续5帧图像的判断结果都是卡车被吊起,则给出最终的判断结果,即卡车被吊起,结束判断;
步骤7-6:如果s3被设置为真,算法还是未给出最终的判断结果,则认为没有发生危险,结束判断;否则继续读取下一帧,执行步骤6。
实施例
本实施的实验硬件环境是:intel(r)core(tm)i7-6700cpu@3.40hz,16.0gb内存,64位操作系统,显卡gtx950;
本实施的实验硬件环境是:vs2015,opencv2.4.11
实例一:卡车尾部摄像头拍摄到的视频,卡车长度为12m,卡车尾部一个角被吊起的情况;如图3a、图4a、图5a、图6a、图7a、图8a和图9a所示;
实例二:卡车尾部摄像头拍摄到的视频,卡车长度为12m,卡车未被吊起的情况;如图3b、图4b、图5b、图6b、图7b、图8b和图9b所示;
实例三:卡车尾部摄像头拍摄到的视频,卡车长度为6m,卡车尾部两个角被吊起的情况;如图3c、图4c、图5c、图6c、图7c、图8c和图9c所示。