1.一种基于车窗角点检测和多方向投影的车窗精确定位方法,包括如下步骤:
步骤1:对含有车辆的彩色图像image进行车牌定位,将定位到的车牌位置记为矩形区域plateRect;
步骤2:根据车牌位置plateRect定义车窗左下角角点的检测区域detectRoiL以及车窗右下角角点的检测区域detectRoiR;
步骤3:在detectRoiL内使用SVM检测到所有车窗左下角角点的候选区域,存储在链表中,记为链表leftCornersList,在detectRoiR内使用SVM检测到所有车窗右下角角点的候选区域,存储在链表中,记为链表rightCornersList;
步骤4:从leftCornersList和rightCornersList中分别选出最终的车窗左下角角点区域记为winCornerRectL和车窗右下角角点区域记为winCornerRectR,使其满足如下条件:在所有候选区域中,(winCornerRectR.x+winCornerRectR.width/2)–(winCornerRectL.x+winCornerRectL.width/2)的绝对值最大,并且(winCornerRectR.y+winCornerRectR.height/2)–(winCornerRectL.y+winCornerRectL.height/2)的绝对值要小于max(winCornerRectL.height,winCornerRectR.height);
其中winCornerRectL.x为winCornerRectL的左上角横坐标,winCornerRectL.width为winCornerRectL的宽度,winCornerRectL.y为winCornerRectL的左上角纵坐标,winCornerRectL.height为winCornerRectL的高度,winCornerRectR.x为winCornerRectR的左上角横坐标,winCornerRectR.width为winCornerRectR的宽度,winCornerRectR.y为winCornerRectR的左上角纵坐标,winCornerRectR.height为winCornerRectR的高度,max表示从两个数中取较大者;
步骤5:根据winCornerRectL和winCornerRectR的位置以及plateRect的宽度plateRect.width定义车窗左边缘检测区域winLeftRect、车窗右边缘检测区域winRightRect以及车窗下边缘检测区域winDownRect;
步骤6:在图像image中分别截取winLeftRect区域部分、winRightRect区域部分以及winDownRect区域部分,得到车窗左边缘检测区域图像、车窗右边缘检测区域图像以及车窗下边缘检测区域图像,并对截取得到的车窗左边缘检测区域图像和车窗右边缘检测区域图像进行图像灰度化、Sobel垂直边缘检测以及OTSU二值化操作,将最终得到的二值化图像分别记为winLeftImg和winRightImg,对截取得到的车窗下边缘检测区域图像进行图像灰度化、Sobel水平边缘检测以及OTSU二值化操作,将得到的二值化图像记为winDownImg;
步骤7:以winLeftImg的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向,将坐标系中直线与x轴正方向的夹角记为θ,其中-90°≤θ≤-60°,在每一个θ方向上,对winLeftImg进行投影,将投影值最大处对应的角度θ记为θ1,并将投影值最大处对应的投影直线上的任意一点记为point1,根据θ1和point1计算该投影直线在原图image坐标系中对应的直线方程,记为l1;
其中原图image坐标系表示以原图image的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向的坐标系;
步骤8:以winRightImg的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向,将坐标系中直线与x轴正方向的夹角记为θ,其中60°≤θ≤90°,在每一个θ方向上,对winRightImg进行投影,将投影值最大处对应的角度θ记为θ2,并将投影值最大处对应的投影直线上的任意一点记为point2,根据θ2和point2计算该投影直线在原图image坐标系中对应的直线方程,记为l2;
步骤9:以winDownImg的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向,将坐标系中直线与x轴正方向的夹角记为θ,其中-10°≤θ≤10°,在每一个θ方向上,对winDownImg进行投影,将投影值最大处对应的角度θ记为θ3,并将投影值最大处对应的投影直线上的任意一点记为point3,根据θ3和point3计算该投影直线在原图image坐标系中对应的直线方程,记为l3;
步骤10:计算直线l1和l3的交点,记为leftPoint,计算直线l2和l3的交点,记为rightPoint;
步骤11:根据winCornerRectL和winCornerRectR的位置以及leftPoint和rightPoint的位置定义车窗上边缘检测区域winUpRect;
步骤12:在图像image中截取winUpRect区域部分,得到车窗上边缘检测区域图像,并对截取得到的车窗上边缘检测区域图像进行图像灰度化、Sobel水平边缘检测以及OTSU二值化操作,将最终得到的二值化图像记为winUpImg;
步骤13:以winUpImg的左上角为坐标系原点,水平向右为x轴正方向,垂直向下为y轴正方向,将坐标系中直线与x轴正方向的夹角记为θ,在θ=θ3方向上对winUpImg进行投影,在得到的投影值中从下向上扫描,直到扫描到某一位置的投影值大于threshProject则停止扫描,将该投影值处对应的投影直线上的任意一点记为point4,根据θ3和point4计算该投影直线在原图image坐标系中对应的直线方程,记为l4,如果没有扫描到投影值大于threshProject的位置,则直接令l4为:y=(leftPoint.y+rightPoint.y)/2-(rightPoint.x-leftPoint.x)/3,其中threshProject为预先设定的投影阈值,在本实施例中设为84,leftPoint.x为leftPoint的横坐标,leftPoint.y为leftPoint的纵坐标,rightPoint.x为rightPoint的横坐标,rightPoint.y为rightPoint的纵坐标;
步骤14:计算直线l1和l4的交点,记为leftPoint1,计算直线l2和l4的交点,记为rightPoint1;
步骤15:根据leftPoint、rightPoint、leftPoint1和rightPoint1的位置计算得到车窗在图像image中的位置winRect。
2.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤2中车窗左下角角点的检测区域detectRoiL以及车窗右下角角点的检测区域detectRoiR的定义如下:
2.1):detectRoiL.x=plateRect.x-plateRect.width×3;
2.2):detectRoiL.y=plateRect.y-plateRect.width×3.5;
2.3):detectRoiL.width=plateRect.x+plateRect.width/2-detectRoiL.x;
2.4):detectRoiL.height=plateRect.y-plateRect.width-detectRoiL.y;
2.5):detectRoiR.x=plateRect.x+plateRect.width/2;
2.6):detectRoiR.y=plateRect.y-plateRect.width×3.5;
2.7):detectRoiR.width=plateRect.width×3.5;
2.8):detectRoiR.height=plateRect.y-plateRect.width-detectRoiR.y;
其中plateRect.x为plateRect的左上角横坐标,plateRect.y为plateRect的左上角纵坐标,detectRoiL.x为detectRoiL的左上角横坐标,detectRoiL.y为detectRoiL的左上角纵坐标,detectRoiL.width为detectRoiL的宽度,detectRoiL.height为detectRoiL的高度,detectRoiR.x为detectRoiR的左上角横坐标,detectRoiR.y为detectRoiR的左上角纵坐标,detectRoiR.width为detectRoiR的宽度,detectRoiR.height为detectRoiR的高度。
3.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤5中车窗左边缘检测区域winLeftRect、车窗右边缘检测区域winRightRect以及车窗下边缘检测区域winDownRect的定义如下:
5.1):winLeftRect.x=winCornerRectL.x;
5.2):winLeftRect.y=winCornerRectL.y+winCornerRectL.height-plateRect.width/2;
5.3):winLeftRect.width=plateRect.width;
5.4):winLeftRect.height=plateRect.width/2;
5.5):winRightRect.x=winCornerRectR.x+winCornerRectR.width-plateRect.width;
5.6):winRightRect.y=winCornerRectR.y+winCornerRectR.height-plateRect.width/2;
5.7):winRightRect.width=plateRect.width;
5.8):winRightRect.height=plateRect.width/2;
5.9):winDownRect.x=winCornerRectL.x;
5.10):winDownRect.y=Top;
5.11):winDownRect.width=winCornerRectR.x+winCornerRectR.width–winCornerRectL.x;
5.12):winDownRect.height=(Buttom–Top+plateRect.width)/2。
其中winLeftRect.x为winLeftRect的左上角横坐标,winLeftRect.y为winLeftRect的左上角纵坐标,winLeftRect.width为winLeftRect的宽度,winLeftRect.height为winLeftRect的高度,winRightRect.x为winRightRect的左上角横坐标,winRightRect.y为winRightRect的左上角纵坐标,winRightRect.width为winRightRect的宽度,winRightRect.height为winRightRect的高度,winDownRect.x为winDownRect的左上角横坐标,winDownRect.y为winDownRect的左上角纵坐标,winDownRect.width为winDownRect的宽度,winDownRect.height为winDownRect的高度,Top=min(winCornerRectL.y,winCornerRectR.y),Buttom=max(winCornerRectL.y+winCornerRectL.height,winCornerRectR.y+winCornerRectR.height),min表示从两个数中取较小者。
4.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤7中根据θ1和point1计算投影直线在原图image坐标系中对应的直线方程l1的步骤如下:
7.1):令point1.x=winLeftRect.x+point1.x,point1.y=winLeftRect.y+point1.y;
7.2):若θ1=-90°,则令直线方程l1为:x=point1.x;
7.3):若-90°<θ1≤-60°,则令直线方程l1为:y=tan(θ1)×(x-point1.x)+point1.y。
其中point1.x为point1的横坐标,point1.y为point1的纵坐标。
5.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤8中根据θ2和point2计算投影直线在原图image坐标系中对应的直线方程l2的步骤如下:
8.1):令point2.x=winRightRect.x+point2.x,point2.y=winRightRect.y+point2.y;
8.2):若θ2=90°,则令直线方程l2为:x=point2.x;
8.3):若60°≤θ1<90°,则令直线方程l2为:y=tan(θ2)×(x–point2.x)+point2.y。
其中point2.x为point2的横坐标,point2.y为point2的纵坐标。
6.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤9中根据θ3和point3计算投影直线在原图image坐标系中对应的直线方程l3的步骤如下:
9.1):令point3.x=winDownRect.x+point3.x,point3.y=winDownRect.y+point3.y;
9.2):直线方程l3为:y=tan(θ3)×(x–point3.x)+point3.y。
其中point3.x为point3的横坐标,point3.y为point3的纵坐标。
7.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤11中车窗上边缘检测区域winUpRect的定义如下:
11.1):winUpRect.x=winCornerRectL.x;
11.2):winUpRect.y=(leftPoint.y+rightPoint.y)/2–(rightPoint.x-leftPoint.x)/3–
(rightPoint.x-leftPoint.x)/8×3;
11.3):winUpRect.width=winCornerRectR.x+winCornerRectR.width–winCornerRectL.x;
11.4):winUpRect.height=(rightPoint.x-leftPoint.x)/2。
其中winUpRect.x为winUpRect的左上角横坐标,winUpRect.y为winUpRect的左上角纵坐标,winUpRect.width为winUpRect的宽度,winUpRect.height为winUpRect的高度。
8.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤13中根据θ3和point4计算投影直线在原图image坐标系中对应的直线方程l4的步骤如下:
13.1):令point4.x=winUpRect.x+point4.x,point4.y=winUpRect.y+point4.y;
13.2):直线方程l4为:y=tan(θ3)×(x–point4.x)+point4.y。
其中point4.x为point4的横坐标,point4.y为point4的纵坐标。
9.如权利要求1所述的一种基于车窗角点检测和多方向投影的车窗精确定位方法,其特征在于:步骤15中车窗在图像image中的位置winRect的计算如下:
15.1):winRect.x=leftPoint.x;
15.2):winRect.y=(leftPoint1.y+rightPoint1.y)/2;
15.3):winRect.width=rightPoint.x-leftPoint.x;
15.4):winRect.height=(leftPoint.y+rightPoint.y)/2-(leftPoint1.y+rightPoint1.y)/2。
其中winRect.x为winRect的左上角横坐标,winRect.y为winRect的左上角纵坐标,winRect.width为winRect的宽度,winRect.height为winRect的高度,leftPoint1.y为leftPoint1的纵坐标,rightPoint1.y为rightPoint1的纵坐标。