【実施例】
【0015】
次に、本発明の実施例について図面を参照して詳細に説明する。
図1は、第1の実施例に係る電子装置の構成を示すブロック図である。同図に示すように、電子装置10は、車両の前方または後方に搭載された撮像部20と、各種の信号等を入力する入力部30と、各種の信号等を出力する出力部40と、記憶部50と、制御部60とを含む。但し、この構成は一例であり、本発明の電子装置は、このような構成に限定されない。
【0016】
撮像部20は、自車の前方または後方の道路を撮像し、その撮像データを制御部60へ提供する。制御部60は、撮像データを画像処理等によって解析し、その解析結果から白線を検出する。白線の検出結果は、例えば、ナビゲーション機能、運転支援機能、あるいは自動運転機能などにおいて利用される。1つの例では、ナビゲーション機能の走行車線の判定に利用されたり、あるいは、自車のレーン逸脱判定に利用され、レーンを逸脱した場合には、出力部40から警告が発せられる。
【0017】
制御部60は、電子装置10が有する白線検出機能を実行する。制御部60は、好ましい態様では、ROM、RAMなどを含むマイクロコントローラ等から構成され、ROMまたはRAMは、種々のプログラムを格納することができる。本実施例では、制御部60は、白線検出プログラムを実行する。記憶部50は、例えば、種々のアプリケーションソフトウエアを記憶することができ、制御部60がそれらのソフトウエアを実行することで電子装置10に種々の機能が与えられる。
【0018】
図1(B)は、制御部60が実行する白線検出プログラムの機能的な構成を示している。
同図に示すように、白線検出プログラムは、撮像部20によって撮像された画像データからレーンマーク(白線)候補を抽出するレーンマーク候補抽出部100と、抽出されたレーンマークの中から、わだちやタイヤ痕等の非レーンマークを除去する非レーンマーク候補除去部110と、レーンマーク候補とレーンマーク推定位置から次のレーンマークを検出するレーンマーク検出部120と、検出されたレーンマークから次のレーンマーク位置を推定するレーンマーク位置推定部130とを含む。
【0019】
図2は、レーンマーク候補抽出部100の処理を示すフロー図である。レーンマーク候補抽出部100は、撮像部20によって撮像された画像データを受け取る。画像データが視野角の大きな魚眼レンズによって撮像されたものである場合には、画像データの歪みを補正する。レーンマーク候補抽出部100はさらに、画像データからグレースケールの輝度画像を取り出す(S100)。
【0020】
次に、レーンマーク候補抽出部100は、輝度画像を水平方向に走査することにより、正のエッジ点および負のエッジ点を含む水平ラインを取得する(S102)。水平ラインからの正のエッジ点および負のエッジ点の抽出方法を
図3に示す。
【0021】
図3(A)は、撮像画像を水平方向に走査したときに得られた輝度を表し、
図3(B)は、白線部分の輝度の拡大図である。正のエッジ点は、次のように抽出する。i番目(iは自然数)画素の輝度<i+1番目の画素の輝度の条件を満足する所定の画素数以内の画素列で、開始画素と最終画素の輝度差がしきい値以上となる画素列を抽出する。抽出された画素列の中で、i+1番目の画素の輝度−i番目の画素の輝度が最大となるi+1番目の画素を正のエッジ点とする。
【0022】
同様に負のエッジ点は、次のように抽出する。i番目の画素の輝度>i+1番目の画素の輝度の条件を満足する所定の画素数以内の画素列で、最終画素と開始画素の輝度差がしきい値以上となる画素列を抽出する。抽出された画素列の中で、i番目の画素の輝度−i+1番目の画素の輝度が最大となるi番目の画素を負のエッジ点とする。
【0023】
図3(B)の具体的を用いて示せば、画素bから画素eまでが正のエッジ点の画素列となり、隣り合う画素の輝度差が最も大きい画素dが正のエッジ点となる。この場合の輝度差は、画素eの最大輝度−画素bの最小輝度の差となる。また、画素hから画素kまでが負のエッジ点の画素列となり、隣り合う画素の輝度差が最も大きい画素iが負のエッジ点となる。この場合の輝度差は、画素hの最大輝度−画素kの最低輝度の差となる。
【0024】
同様に、画素g、hが正のエッジ点、画素e、fが負のエッジ点の画素列となるが、輝度差が小さく、しきい値よりも小さくなるため、エッジ点の画素列として取得されない。
【0025】
ここでは、輝度差を、例えば、正のエッジ点の場合、暗から明になる画素列の最小値と最大値を求めたが、明側として後出する水平ラインの平均値や中央値、暗側としてエッジ点から一定間隔離れた点や一定間隔離れたところの一定範囲の画素列の平均を求めて、これらから輝度差を算出しても良い。
【0026】
抽出された正のエッジ点と負のエッジ点の組で、正のエッジ点から負のエッジ点までの長さが、ある所定の長さ(白線幅)を満足する部分を水平ラインとして取り出す。このとき、正のエッジ点は、水平ラインの左エッジ点、負のエッジ点は右エッジ点になる。この水平ラインの取得を、決められた走査範囲の下から上方向に行うと、
図4に示すような複数の水平ラインが抽出される。
【0027】
水平ラインの取得で用いられるしきい値は、2重線や3重線の線間に生じ得る小さな輝度差、わだちやタイヤ痕によって生じ得る輝度差を抽出し得る小さな値に設定される。すなわち、水平ラインで取得された画像は、正のエッジ点および負のエッジ点を含む白線幅の部分、多重線の間の部分、およびわだちやタイヤ痕等の部分を包含し得る。但し、わだちやタイヤ痕等は、後述する非レーンマーク候補除去部110において除去される。
【0028】
次に、レーンマーク候補抽出部100は、水平ラインのグループ化を行う(S104)。レーンマーク候補抽出部100は、取得した水平ライン群に対して、X方向で重なった水平ライン群をグループ化する。グループ化では、後述する
図6に示す変数に、グループ数と各グループのデータを格納する。格納は、例えば記憶部50に記憶される。グループのデータは、水平ライン数とグループを構成する水平ラインデータ群から構成される。水平ラインデータは、Y座標が大きい値のものから小さい値の順で格納し、それぞれのデータは、Y座標、左エッジ点のX座標と輝度差、右エッジ点のX座標と輝度差から構成される。ここで格納するX座標、Y座標は、画素位置である。例えば、
図3に示す水平ラインの取得結果を表す
図4は、水平ライン群を2つのグループに分け、グループ[0]は、12個の水平ラインから構成され、グループ[1]は、13個の水平ラインから構成される。
【0029】
次に、レーンマーク候補抽出部100は、線分の抽出を行う(S106)。線分の抽出は、
図5に示すように、各グループの水平ラインを3次元座標の路面(Z=0)に投影して、その各水平ラインの中点、すなわち、左エッジ点と右エッジ点の中央値を求め、これらの値から最小二乗法でレーンマーク候補となる線分の直線式Y=aX+b(Z=0)の傾きaとY切片bを算出する。このときの原点は、好ましくは、車の中央位置であり、X軸上前方がプラス、Y軸上左側がプラスである。また、グループ毎に水平ラインの幅(左右エッジ点間の距離)の平均をとり、レーンマーク幅を算出する。例えば、3次元座標でのX座標、Y座標の単位は、m(メートル)である。線分の抽出の処理では、
図6に示す変数に、グループ毎に算出した線分データ(直線式の傾きaとY切片b)とレーンマークデータ(線幅)を格納する。
【0030】
次に、非レーンマーク候補除去部110について説明する。レーンマーク候補抽出部100による抽出では、小さなしきい値により輝度差が小さい多重線間の領域を抽出するため、同時に、わだちやタイヤ痕等のノイズデータも抽出する可能性がある。非レーンマーク候補除去部110は、二重線や三重線など多重線の水平ラインのグループから、輝度差の小さいわだちやタイヤ痕の水平ラインのグループを取り除く処理を行う。
図7Aないし
図7Cは、非レーンマーク候補除去部の動作フローである(Tは、True、Fは、Faultである)。
【0031】
まず、レーンマーク候補抽出部100で取得した水平ラインのグループ群を、グループの線分のY切片bを使用して降順にソートする(S301)。例えば、
図5のグループ[0]、[1]について処理が実行されると、そのグループ内の水平ラインがソートされる。更に、除去するグループを管理する除去対象グループを対象グループ無しに初期化する(S302)。次に、各グループに対して、除去するか否かを判定する。そのために、グループを示す変数iを0に初期化する(S303)。
【0032】
次に、iがグループ数(
図6でいえばmの値)未満か否かを判断し(S304)、グループ数以上ならば、対象グループがなくなったので、除去対象グループに登録したグループを削除して(S320)、終了する。iがグループ数未満であれば、グループ[i]が、除去対象か否かを判定する処理を行う。
図4の例で言えば、グループ[0]から、除去対象か否かの判定が行われる。
【0033】
この処理では、先ず、除去対象グループの左側および右側に隣接グループがあるか否かを示す変数「neighbor」を、両側に隣接グループ無しを示す値「0」に設定する(S305)。変数「neighbor」は、値が0のとき「隣接グループなし」、1のとき「左側に隣接グループあり」、2のとき「右側に隣接グループあり」、3のとき「両側に隣接グループあり」を示す。
【0034】
次に、グループ[i]の水平ライン群について、左エッジ点の輝度差の平均を求め、変数「posDiff」に格納する(S306)。同様に、グループ[i]の水平ライン群について、右エッジ点の輝度差の平均を求め、変数「negDiff」に格納する(S307)。グループ[i]の左右のエッジ点の輝度差の平均の算出は、
図6に示すグループ毎の水平ラインデータが用いられる。
【0035】
左右の輝度差平均の算出後、
図8に示す左側隣接グループ有無の判断処理(後述する)を行い、グループ[i]の左側に隣接グループがあるか否かを判定する(S308)。左側に隣接グループがあると判定された場合には、左側の輝度差が小さく出ている可能性があるので、左側の輝度差平均を示すposDiffを、隣接していなければ生成された値に近い右側の輝度差平均を示す変数negDiffに置き換え(S309)、neighborに1を設定する(S310)。
【0036】
同様に、
図9に示す右側隣接グループ有無の判断処理(後述する)を行い、グループ[i]の右側に隣接グループがあるか否かを判定する(S311)。右側に隣接グループがあると判定された場合には、右側の輝度差が小さくでている可能性があるので、右側の輝度差平均を示す変数negDiffを、隣接してなければ生成された値に近い左側の輝度差平均を示す変数posDiffで置き換え(S312)、neighborに2を加算する(S313)。
【0037】
左右の隣接グループの有無を判定後、変数neighborが3か否か、つまり、両側に隣接グループがあるか否かを判定する(S314)。両側に隣接グループがある場合は、両側とも輝度差が小さく出ている可能性があるので、左側の輝度差平均を示す変数posDiffと右側の輝度差平均を示す変数negDiffを、除去しきい値よりも大きい値、例えば、除去しきい値+1に設定して、除去対象グループにならないようにする(S315、S316)。両側に隣接グループが存在する場合は、例えば、3重線の真ん中の白線が該当する。
【0038】
隣接グループの判定後、グループ[i]が除去対象グループか否かの判定を行う(S317)。判定は、左右いずれか一方の輝度差平均が除去しきい値以下か否かを判定する。 この除去しきい値は、水平ラインの取得(S102)において、エッジ点を求めるしきい値よりも大きな値であり、単一の白線線のエッジ点と、わだちやタイヤ痕のエッジ点とを区別できる値である。
【0039】
除去対象グループと判定された場合には、グループ[i]を除去対象グループに登録し(S318)、次のグループの判定を行うために、グループを示す変数iを1加算する(S319)。S319後は、S304の判定に戻る。
【0040】
図10は、S308からS317の処理の一例を示す図である。
図10(A)に示すように、白線候補を抽出するためのしきい値(例えば、小さな値である2)を設定し、当該しきい値よりも輝度差の大きい水平ラインを取得する(S102)。白線L1、L2の二重線の輝度差P=10、およびその白線L1と白線L2の間の輝度差=5、白線L3、L4、L5の三重線の輝度差=10、および白線L3、L4、L5の間の輝度差=5、わだちやタイヤ痕Nの輝度差=3であるとき、二重線、三重線、わだちやタイヤ痕のすべてがしきい値よりも大きいため、レーンマーク候補として抽出される。
図10(B)は、全てのスキャン後の取得された水平ラインを示している。レーンマーク候補に含まれる、わだちやタイヤ痕のようなノイズNは、非レーンマーク候補除去部110によって除去される。
【0041】
例えば、白線L1のグループに対して非レーンマーク候補除去部110の処理が実行されるとき、白線L1の右側に白線L2の隣接グループが存在するため、白線L1の右側のエッジ点の輝度差が、左側のエッジ点の輝度差(平均)に置き換えられる。同様に、白線L2の左側には、隣接する白線L1が存在するため、白線L2の左側のエッジ点の輝度差は、水際のエッジ点の輝度差(平均)に置き換えられる。また、三重線の白線L3の右側のエッジには白線L4が隣接するため、右側のエッジ点は、左側のエッジ点の輝度差に置き換えられ、白線L5も同様に、左側のエッジ点の輝度差が右側のエッジ点の輝度差に置き換えられる。両側において隣接する白線L4に関しては、除去しきい値よりも大きな値、例えば、除去しきい値が7であるとき、左右の輝度差が8に設定される。但し、白線L4の左右のエッジ点を、白線L3の隣接する白線L4が存在しない左側のエッジ点の輝度差、あるいは白線L5の隣接する白線L4が存在しない右側のエッジ点の輝度差に置換するようにしてもよい。
【0042】
図10(C)は、白線の隣接する側のエッジ点の輝度差を補正した後の水冷ラインの輝度差を表している。輝度差の補正を行った後、除去対象グループの判定(S317)が行われ、いずれか一方に除去しきい値よりも大きな輝度差を有する白線L1、L2、L3、L5は、除去対象グループにならずに処理を終える。一方で、ノイズNであるわだちやタイヤ痕は、除去しきい値=7よりも小さな輝度差=3であるため、除去対象グループと判定され、非レーンマーク候補として除去される。
【0043】
ここで、除去しきい値は、次のように対応しても良い。線分の抽出処理(S106)において、例えば、
図11の241、242に示すように、原点に最も近い水平ラインまでの距離を求め、距離が大きくなるに従って、この除去しきい値を下げるように可変しても良い。これは、カメラの解像度や画像のひずみ補正などの影響により、遠い位置ほど輝度差が表れ難くなるためである。
【0044】
また、レーンマークの色が黄色の場合は、白に比べて輝度差が出にくいので、線分の色を求めて、色に応じて、除去しきい値を変えるようにしても良い。色の判定は、例えば、水平ラインの取得(S102)で各水平ラインの色、線分の抽出(S104)で水平ライン群の色の中で最も多い色を線分の色とすることができる。
【0045】
次に、上記した左側の隣接グループ有無の判断処理について説明する。
図8は、
図7BのS308で実行される処理である。まず、グループを示す変数iが1以上か否かを判定する(S3081)。iが1未満ならば、左側に隣接グループが存在しないので、結果を示す変数resultに「隣接グループ無し」を設定して(S3086)、その値を返して終了する。iが1以上ならば、
図12に示す2つのグループでY座標が同じ水平ラインで2つの水平ライン間の距離が所定の範囲にある水平ライン数を算出する関数neighborLinesを、1つ前のグループ(左側のグループ)と現在のグループを引数にして呼び出し、該当する水平ライン数を変数numLinesに設定する(S3082)。関数neighborLinesの詳細については後述する。
【0046】
該当する水平ライン数numLinesが現在のグループの水平ライン数の何%になるのかの割合を算出し、これを変数ratioに格納し(S3083)、ratio値が隣接しきい値以上か否かを判定する(S3084)。隣接しきい値未満の場合は、結果を示す変数resultに「隣接グループ無し」を設定して(S3086)、その値を返して終了する。隣接しきい値以上の場合は、結果を示す変数resultに「隣接グループ有り」を設定して(S3085)、その値を返して終了する。
【0047】
次に、
図9に示す右側隣接グループ有無の判断処理について説明する。最初に、グループを示す変数iがグループ数−1未満か否かを判断する(S3111)。グループ数−1以上ならば、右側に隣接グループはないので、結果を示す変数resultに「隣接グループ無し」を設定して(S3116)、その値を返して終了する。グループ数−1未満ならば、
図12に示す2つのグループでY座標が同じ水平ラインで2つの水平ライン間の距離が所定の範囲にある水平ライン数を算出する関数neighborLinesを、現在のグループと1つ後のグループ(右側のグループ)とを引数にして呼び出し、該当する水平ライン数を変数numLinesに設定する(S3112)。
【0048】
該当する水平ライン数numLinesが現在のグループの水平ライン数の何%になるかの割合を算出し、これを変数ratioに格納し(S3113)、ratio値が隣接しきい値以上か否かを判定する(S3114)。隣接しきい値未満の場合は、結果を示す変数resultに「隣接グループ無し」を設定して(S3116)、その値を返して終了する。隣接しきい値以上の場合は、結果を示す変数resultに「隣接グループ有り」を設定して(S3115)、その値を返して終了する。
【0049】
次に、関数neighborLinesの処理を、
図12Aないし
図12Cのフローを参照して説明する。neighborLinesは、2つのグループでY座標が同じ水平ラインで2つの水平ライン間の距離が所定の範囲にある水平ライン数を算出する関数であり、引数m、nは、それぞれグループ[m]、グループ[n]を示し、グループ[n]は、グループ[m]の右側にある値(m+1=n)で呼ばれる。
【0050】
まず、Y座標が同じ水平ラインで2つの水平ライン間の距離が所定の範囲にある水平ライン数を示す変数numLinesを0に初期化し(S3401)、グループ[m]の水平ラインを示す変数iを0に初期化し(S3402)、グループ[n]の水平ラインを示す変数jを0に初期化する(S3403)。
【0051】
次に、グループ[m]の水平ラインを示す変数iがグループ[m]の水平ライン未満か否かを判断する(S3404)。水平ライン数以上ならば、比較する水平ラインデータがないので、関数値として変数numLinesの値を返して処理を終了する。水平ライン数未満ならば、同様に、グループ[n]の水平ラインを示す変数jがグループ[n]の水平ライン数未満か否かを判断する(S3405)。水平ライン数以上ならば、比較する水平ラインデータがないので、関数値として変数numLinesの値を返して処理を終了する。
【0052】
水平ライン数未満ならば、グループ[m]の水平ライン[i]のY座標が、グループ[n]の水平ライン[j]のY座標と同じか否かを判断する(S3406)。Y座標が同じ場合は、2つの水平ライン間の距離が所定の範囲にあるか否かを判断する(S3407)。2つの水平ライン間の距離が所定の範囲にあるか否かの判断は、グループ[n]のj番目の水平ライン[j]の左エッジ点X座標とグループ[m]の水平ライン[i]の右エッジ点X座標間の距離(画素数)が範囲しきい値以下か否かを判断して行う。
【0053】
範囲しきい値以下の場合は、X座標が所定の範囲にあると判断して、X座標が所定の範囲にある水平ライン数を示す変数numLinesを1加算する(S3409)。次に、次の水平ラインの比較を行うために、グループ[m]の水平ラインを示す変数iを1加算し(S3410)、グループ[n]の水平ラインを示す変数jも1加算して(S3411)、次の水平ラインの比較を行う。
【0054】
S3406でY座標が異なると判断された場合は、グループ[m]の水平ライン[i]のY座標とグループ[n]の水平ライン[j]のY座標の値の比較を行い(S3408)、グループ[m]の水平ライン[i]のY座標が大きい場合、
図6で各グループの水平ラインはY座標が降順に格納されているので、Y座標の値を合わせるために、変数iを1加算して(S3412)、次の水平ラインの比較を行う。グループ[n]の水平ライン[j]のY座標が大きい場合、同様に、Y座標の値を合わせるために、変数jを1加算して(S3413)、次の水平ラインの比較を行う。
【0055】
図13は、関数neighborLinesの処理を具体的に説明する図である。
図13(B)は、左側レーンマークが2重線、右側レーンマークが単線からなるレーンの撮像画像
図13(A)に基づいて水平ラインを検出し、グループ化した状態を示す図である。なお、
図13(B)の方眼は、1マスが1画素を示すものとする。
【0056】
具体例として
図13(B)を用いて説明する。
図13(B)は、左側レーンマークが二重線、右側レーンマークが単線からなるレーンの撮像画像Dである
図13(A)から水平ラインを検出して、グループ化したものである。この画像で1マスが1画素を表す。
【0057】
関数neighborLinesの範囲しきい値を2画素と仮定すると、関数neighborLines(0,1)の結果は、グループ[0]とグループ[1]でY座標が同じ水平ラインが8本あり、この中でグループ[1]の左エッジ点X座標とグループ[0]の右エッジ点X座標の間隔が2画素以下の水平ライン数は8なので、変数numLinesの値は8となる。同様に、関数neighborLines(1,2)を算出すると、全ての左右エッジ間の距離が2以上なので、0となる。
【0058】
図8に示す左側隣接グループの有無の判断処理において、隣接しきい値を0.4と仮定すると、i=0(グループ[0])のとき隣接グループ無し、i=1(グループ[1])のとき隣接グループ有り、i=2(グループ[2])のとき隣接グループ無しとなる。この算出において、処理中の変数ratioの値は、i=1(グループ[1])のとき8/9=0.89、i=2(グループ[2])のとき0/17=0、となる。なお、i=0(グループ[0])のときは、左側に隣接グループはないので、変数ratioの値を算出せずに隣接グループ無しとなる。
【0059】
同様に、
図9に示す右側隣接グループ有無の判断処理において、隣接しきい値を0.4と仮定すると、i=0(グループ[0])のとき隣接グループ有り、i=1(グループ[1])のとき隣接グループ無し、i=2(グループ[2])のとき隣接グループ無しとなる。この算出において、処理中の変数ratioの値は、i=0(グループ[0])のとき8/18=0.44、i=1(グループ[2])のとき0/9=0、となる。なお、i=2(グループ[2])のときは、右側に隣接グループはないので、変数ratioの値を算出せずに隣接グループ無しとなる。
【0060】
レーンマーク検出部120は、非レーンマーク候補除去部110から出力されたグループ情報の線分データとレーンマーク位置推定部130から出力されるレーンマークの推定一からレーンマークを検出し、レーンマーク情報を出力する。レーンマーク位置推定部130は、検出したレーンマークの線分データと過去のレーンマークの線分データから、次の線分データを推定する。レーンマーク検出部120やレーンマーク位置推定部130の詳細は、例えば、特許文献3に開示されている。
【0061】
このように本実施例によれば、二重線や三重線のような多重線が撮像されたとき、白線候補が他の白線候補に隣接するか否かを判定し、隣接すると判定された場合には、隣接する側の白線側の輝度差を、ノイズ等の非白線候補を除去するときの除去しきい値よりも大きな輝度差に補正するようにしたので、多重線の白線候補の間隔とわだちやタイヤ痕のようなノイズをと識別することが可能となり、多重線を正確に検出しつつ不要なノイズを削除することができる。
【0062】
次に、本発明の第2の実施例について説明する。第1の実施例は、全ての水平ラインの走査を行った後に、隣接する側のエッジの輝度差を補正するものであるが、第2の実施例は、水平ラインを走査する毎に輝度差の補正を行うものである。
図14は、第2の実施例に係る白線検出プログラムの機能的な構成を示すブロック図であり、第1の実施例と同様のものについては同一参照番号を附す。
【0063】
レーンマーク候補抽出部100Aの動作フローを
図15に示す。レーンマーク候補抽出部100Aは、まず、撮像部20が撮像した画像からグレースケールの輝度画像を取り出し(S600)、撮像画像の走査位置を示す変数iを0に初期化する(S602)。次に、走査位置を示す変数iが走査数未満か否かを判断する(S604)。変数iが走査数未満ならば、水平方向に走査して水平ラインを取得し(S606)、取得した水平ラインの輝度差を補正する(S608)。次に、変数iに1を加算して(S610)、次の走査処理を行う。すなわち、第1の実施例が全ての水平ラインの取得後に輝度差を補正したのに対し、第2の実施例では、水平ラインを取得する毎に輝度差を補正する。変数iが走査数以上となったとき走査範囲の走査が終了し、第1の実施例のときと同様に、取得した水平ライン群がグループ化され(S612)、線分が抽出される(S614)。
【0064】
次に、水平ラインの取得処理(S606)について説明する。水平ラインの取得は、第1の実施例と同様の処理で、変数iの示した走査位置を水平方向(X方向)に走査して、正のエッジ点と負のエッジ点を抽出する。輝度差のしきい値は小さな値に設定され、2重線や3重線の多重線の間の輝度差や、わだちやタイヤ痕等のノイズの輝度差も抽出され得る。走査してエッジ点を抽出した結果は、
図16に示す変数の走査[i]に格納される。すなわち、走査したときのY座標、抽出した水平ライン数(n)、各水平ライン[k](k=0、1、2、・・・、n−1)の情報を格納する。水平ライン[k]のデータは、左右エッジ点のX座標と輝度差から構成される。水平ラインは走査方向で抽出した順、X座標が小さい順に格納される。
【0065】
次に、輝度差の補正処理(S608)について説明する。
図17Aおよび
図17Bは、輝度差の補正処理を示すフローである。まず、右エッジ点の隣接状態を示す変数preRightlsNearを0に初期化する(S6301)。この変数は、水平ラインの右エッジ点が次の水平ラインの左エッジ点と隣接しているとき1、隣接していないとき0である。次に、水平ラインのインデックスkを0に初期化する(S6302)。
【0066】
次に、水平ラインインデックスkが走査[i]の水平ライン数未満か否か判断する(S6303)。kが水平ライン数以上ならば、処理を終了する。水平ラインインデックスkが走査[i]の水平ライン数未満ならば、変数preRightlsNearが1か否かを判断することにより、1つ前の水平ライン[k−1]の右エッジ点X座標が現在の水平ライン[k]の左エッジ点X座標と隣接しているか否かを判断する(S6304)。
【0067】
1つ前の水平ライン[k−1]の右エッジ点X座標が現在の水平ライン[k]の左エッジ点X座標と隣接していることは、現在の水平ライン[k]の左エッジ点X座標が1つ前の水平ライン[k−1]の右エッジ点X座標と隣接していることになるので、走査[i]の水平ライン[k]の左エッジ点輝度差に隣接していなければ生成された値に近い右エッジ点の輝度差を設定する(S6305)。このように、第2の実施例では、走査[i]の単位で、輝度差の置き換え補正を行っている。
【0068】
次に、水平ラインインデックスkが走査[i]の水平ライン数−1未満か否か、つまり右側に水平ラインがあるか否かを判断する(S6306)。右側に水平ラインがない場合、右エッジ点の隣接状態を示す変数preRightlsNearを0(右側隣接なし)を設定し(S6308)、水平ラインインデックスkを1加算して(S6314)、次の水平ラインの処理を行う。
【0069】
右側に水平ラインがある場合、走査[i]の水平ライン[k]の右エッジ点X座標と右側の走査[i]の水平ライン[k+1]の左エッジ点X座標の距離(画素数)が範囲しきい値以下か否かを判断する(S6307)。差が範囲しきい値以下ならば、右エッジ点が隣接していると判断する。
【0070】
隣接していない場合、右エッジ点の隣接状態を示す変数preRightlsNearを0(右側隣接なし)に設定して(S6308)、水平ラインインデックスkを1加算して(S6314)、次の水平ラインの処理を行う。右エッジ点が隣接していると判断した場合、変数preRightlsNearの値により左エッジ点が隣接しているか否かを判断する(S6309)。左エッジ点も隣接している場合、両エッジ点の輝度差が小さく出ている可能性があるので、両エッジ点の輝度差を(除去しきい値+1)に設定する(S6310、S6311)。
【0071】
左エッジ点が隣接していない場合、走査[i]の水平ライン[k]の右エッジ点輝度差に隣接していなければ生成された値に近い左エッジ点の輝度差を設定する(S6312)。次に、右エッジ点の隣接状態を示す変数preRightlsNearに1(右側隣接あり)を設定し(S6313)、水平ラインインデックスkを1加算して(S6314)、次の水平ラインの処理を行う。
【0072】
次に、輝度差の補正の具体例を、
図13(B)を参照して説明する。ここで、範囲しきい値は、2と仮定する。グループ[2]は、隣接する水平ラインがないので、輝度差の補正はない。グループ[0]の水平ライン[k],(k=0、1、・・・、17)の左右エッジ点の輝度差(左エッジ点輝度差,右エッジ点輝度差)を水平ライン順(Y座標の降順)に、(120,22)、(118,20)、(116,18)、(114,18)、(112,14)、(110,18)、(108,18)、(106,20)、(104,80)、(102,102)、(104,102)、(100,100)、(98,100)、(100,100)、(102,100)、(100,102)、(96,98)、(100,100)、グループ[1]の水平ライン[m],m=0、1、・・・、8の左右エッジ点の輝度差を水平ライン順に、(88,140)、(28,138)、(20,136)、(22,134)、(20,132)、(18,132)、(22,130)、(24,128)、(22,126)、と仮定すると、輝度差の補正を行った後の結果は次の通りである。輝度差の補正後のグループ[0]の水平ライン[k],(k=0、1、・・・、17)の左右エッジ点の輝度差は、(120,120)、(118,118)、(116,116)、(114,114)、(112,112)、(110,110)、(108,108)、(106,106)、(104,80)、(102,102)、(104,102)、(100,100)、(98,100)、(100,100)、(102,100)、(100,102)、(96,98)、(100,100)、グループ[1]の水平ライン[m],m=0、1、・・・、8の左右エッジ点の輝度差は、(88,140)、(138,138)、(136,136)、(134,134)、(132,132)、(132,132)、(130,130)、(128,128)、(126,126)となる。
【0073】
水平ラインのグループ化は(S612)、第1の実施例のときの水平ラインのグループ化(S104)と同様の処理である。
図16に示す変数に、取り出した水平ラインに対してX方向で重なった水平ライン群をグループ化して、
図6に示す変数にグループ数と各グループの水平ラインデータを格納する。第2の実施例では、
図6に示す格納の時点で、既に置き換え処理が行われていることになる。線分を抽出(S614)は、第1の実施例のときの線分の抽出(S106)と同様の処理である。
図6に示すように格納した各グループの水平ラインのデータから線分データとレーンマークデータを算出して、
図6に示す変数に格納する。
【0074】
次に、非レーンマーク候補除去部110Aについて、
図18のフローを参照して説明する。この処理は、水平ラインのグループから輝度差が小さい水平ラインのグループを取り除く処理を行う。まず、グループを示す変数iを0に初期化する(S3801)。次に、iがグループ数未満か否かを判断し(S3802)、グループ数以上ならば除去対象グループがなくなったので終了する。グループ数未満ならば、グループ[i]が、除去対象か否かを判定する処理を行う。
【0075】
グループ[i]の水平ライン群について、左エッジ点の輝度差の平均を求め、変数posDiffに格納する(S3803)。同様に、グループ[i]の水平ライン群について、右エッジ点の輝度差の平均を求め、変数negDiffに格納する(S3804)。次に、グループ[i]が削除対象か否かの判定を行う(S3805)。判定は、左右いずれか一方の輝度差平均が除去しきい値以下か否かである。削除対象ならば、グループ[i]を削除する(S3806)。次に、グループを示す変数iに1加算して(S3807)、次の水平ラインのグループの処理を行う。
【0076】
本実施例では、水平ラインが取得される毎に、白線候補が隣接するか否かを判定し、隣接すると判定された場合には、隣接する側の白線側の輝度差を、ノイズ等の非白線候補を除去するときの除去しきい値よりも大きな輝度差に補正するようにしたので、第1の実施例の時と比較して処理時間を短縮することができる。
【0077】
以上、本発明の好ましい実施の形態について詳述したが、本発明は、特定の実施形態に限定されるものではなく、特許請求の範囲に記載された発明の要旨の範囲において、種々の変形、変更が可能である。