利用逆透視變換獲取車載圖象的鳥瞰圖

近年來在人工智能潮流下,各行各業對無人駕駛技術的發展投來了越來越多的關注。在智能駕駛系統的研究中,車道線檢測的研究是非常重要的一環;鑑於絕大多數城市道路交通環境特性和車道線本身特性,當前車道線檢測研究使用的絕大部分方法都是基於計算機視覺的方法,近幾年深度學習方法的發展非常迅猛,但是由於深度學習依賴巨量的訓練數據和其成本高昂的硬件需求,當前市場上使用的大多數智能駕駛產品都沒有引入基於深度學習的視覺解決方案,以結合基於圖象處理算法的視覺與雷達傳感器結合的智能駕駛產品居多。

逆透視變換是當前國內外車道線檢測研究使用得比較多的一個方法,逆透視變換從原理層面上與透視變換並沒有本質的區別,透視變換能夠將圖象投影到一個新的視平面,關於透視變換的原理網上有很多博客,這裏也就不多說了。Opencv中提供了透視變換的接口,通過在分別原圖和結果圖上設定4個點,這八個點就確定了原圖到透視圖的轉換矩陣,並且這兩組點在原圖和透視圖上是像素對應的

其實無論是透視變換還是逆透視變換,最重要的還是兩組對應點的選取,這兩組四個點,總共八個點關係透視變換的最終效果。這裏使用的是車載攝像頭的標定信息來選取對應點。

車載攝像頭的標定信息

下面的代碼是智能駕駛系統項目中的源碼,這裏把Opencv中的接口稍微封裝了一下,其中有些與透視變換無關的參數,可以忽略不管;比較重要的一點是:這裏的原圖的四個點是通過車載攝像頭的標定信息計算出來的,可以通過車載攝像頭的標定信息計算出車載攝像頭的消失點,找到消失點之後,四個點的選取就比較容易了;透視圖的四個點就更好選取了,只要需要保證四個點構成一個正矩形就行了,四個點之間的像素距離可以根據標定信息計算,這樣能夠最大程度上讓鳥瞰圖的尺寸比例更接近現實世界的尺寸比例關係。

//參數爲原圖像、透視圖、四個原圖上的對應點
bool IpmTransform::executeipm(Mat& img,Mat& dst,Point2d P1,Point2d P2,Point2d P3,Point2d P4)
{
    if (img.data)
    {
        Point2f corners[4];//原圖四個點
        Point2f corners_trans[4];//逆透視圖四個點

        //**車載場景圖象的其他參數**//
        float roi_x0=0;
        float roi_y0=228;
        float ROI_HEIGHT=30000;
        float ROI_WIDTH=3750;
        //************************//

        corners[0] = P2;
        corners[1] = P3;
        corners[2] = P1;
        corners[3] = P4;

        //設定逆透視圖的寬度
        float IPM_WIDTH=500;
        float N=5;
        //保證逆透視圖的寬度大概爲N個車頭寬
        float sacale=(IPM_WIDTH/N)/ROI_WIDTH;
        float IPM_HEIGHT=ROI_HEIGHT*sacale;

        //逆透視圖初始化
        dst=Mat::zeros(IPM_HEIGHT+50,IPM_WIDTH,img.type());

        corners_trans[0] = Point2f(IPM_WIDTH/2-IPM_WIDTH/(2*N),0);  //P2
        corners_trans[1] = Point2f(IPM_WIDTH/2+IPM_WIDTH/(2*N),0);  //P3
        corners_trans[2] = Point2f(IPM_WIDTH/2-IPM_WIDTH/(2*N),IPM_HEIGHT);   //P1
        corners_trans[3] = Point2f(IPM_WIDTH/2+IPM_WIDTH/(2*N),IPM_HEIGHT);   //P4

        //計算原圖到逆透視圖和逆透視圖到原圖的變換矩陣
        warpMatrix_src2ipm = getPerspectiveTransform(corners, corners_trans);
        warpPerspective(img, dst, warpMatrix_src2ipm, dst.size());
        //標出兩組點
        for(int i=0;i<4;i++)
            circle(img,corners[i],5,Scalar(0,255,255),4);
        for(int i=0;i<4;i++)
            circle(dst,corners_trans[i],5,Scalar(0,255,255),4);

        imshow("img",img);
        imshow("dst",dst);
    }
    else
    {
        cout << "NO IMAGE!!!" << endl;
        return false;
    }

    return true;
}

這裏的變換截取了車載圖象的一部分作爲ROI區域來進行逆透視變換,這裏在原圖以及透視圖上將兩組對應點都用黃色點標了出來:

原圖及對應四個點

經過逆透視變換之後的圖:(在鳥瞰圖上的車道線遠近粗細一樣,這樣爲車道線檢測提供了一個非常重要的特徵

逆透視圖及對應四個點

同樣在彎道的車道上也可以應用這種變換方法:

原圖及對應四個點

逆透視圖:

逆透視圖及對應四個點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章