基于圖像處理的車道線識(shí)別算法研究
基于圖像處理的車道線識(shí)別算法研究摘要為了提高車道線識(shí)別算法的實(shí)時(shí)性和準(zhǔn)確性,提出了一種基于改進(jìn)Hough變換的車道線檢測(cè)方法。在車道線的預(yù)處理階段,首先確定圖像中的感興趣區(qū)域,然后對(duì)圖像進(jìn)行平滑處理、自適應(yīng)閾值分割、邊緣檢測(cè),從而減少了后期的處理數(shù)據(jù)量,排除了大部分的干擾因素。在車道線的識(shí)別階段,根據(jù)圓和橢圓的性質(zhì),對(duì)傳統(tǒng)的霍夫變換進(jìn)行改進(jìn),極大減小了在檢測(cè)圓和橢圓時(shí)的計(jì)算量,并提高了檢測(cè)的準(zhǔn)確性。最后使用OpenCV圖像處理庫編寫程序,證明了新算法的正確性,得到了理想的結(jié)果。關(guān)鍵詞:車道線識(shí)別 橢圓檢測(cè) 霍夫變換 Study on Lane Mark Identification Algorithm Based on Image ProcessingAbstractIn order to improve the real-time and accuracy of lane recognition algorithm, presents a method of lane detection based on improved Hough transform. The preprocessing stage in the lane line, first determine the image of the region of interest, and then smoothing, adaptive threshold segmentation, edge detection of image, thereby reducing the amount of data processing stage, most of the interference factors. The recognition phase in the lane line, according to the nature of the circle and ellipse, improvement of the Hof transform to the traditional, greatly reduces the amount of computation in the detection of circle and ellipse, and improve the accuracy of detection. Finally, the use of OpenCV image processing library program, proved the correctness of the new algorithm, and the desired result.Key Words:lane mark identification;ellipse detection;hough transform目錄摘要IAbstractII目錄III第1章緒論11.1研究背景12.1國內(nèi)外研究現(xiàn)狀21.2.1國外研究現(xiàn)狀21.2.2國內(nèi)研究現(xiàn)狀33.1論文主要內(nèi)容3第2章車道線的預(yù)處理52.1認(rèn)識(shí)車道線52.1.1車道線的基本分類52.1.2車道線的標(biāo)劃區(qū)分62.1.3車道線的基本形狀62.2感興趣區(qū)域62.3平滑濾波72.3.1均值濾波72.3.2中值濾波82.3.3高斯濾波92.3.4平滑濾波總結(jié)102.4二值化102.4.1二值化的基本概念102.4.2大津法自適應(yīng)閾值分割102.5邊緣提取112.5.1Sobel算子122.5.2Canny算子132.5.3Sobel算子和Canny算子的比較14第3章Hough變換直線和橢圓的檢測(cè)153.1Hough變換直線檢測(cè)153.1.1Hough變換直線檢測(cè)的基本原理153.1.2Hough變換的缺陷和改進(jìn)163.2Hough變換圓檢測(cè)173.2.1Hough變換圓檢測(cè)的基本原理173.2.2對(duì)hough變換圓檢測(cè)算法的改進(jìn)183.2.3最小二乘法求曲線上一點(diǎn)的切線183.3Hough變換橢圓檢測(cè)19第4章車道線的識(shí)別22結(jié)論25參考文獻(xiàn):26致謝28附錄129第1章 緒論1.1 研究背景車道線的識(shí)別是圖像處理和交通智能化領(lǐng)域的一個(gè)重要分支,特別是近年來,隨著只能汽車、自動(dòng)識(shí)別的發(fā)展和應(yīng)用,車道線識(shí)別的研究得到了長足的發(fā)展,并且會(huì)在未來隨著人們對(duì)識(shí)別精度、速度的要求越來越高,車道線識(shí)別領(lǐng)域的研究將會(huì)愈發(fā)火熱,可以說這是一個(gè)方興未艾的研究領(lǐng)域。車道線識(shí)別的研究成果很大程度上得益與數(shù)字圖象處理和計(jì)算機(jī)技術(shù)的發(fā)展。數(shù)字圖像處理最早出現(xiàn)于20世紀(jì)50年代,當(dāng)時(shí)的電子計(jì)算機(jī)已經(jīng)發(fā)展到一定水平,人們開始利用計(jì)算機(jī)來處理圖形和圖像信息。數(shù)字圖像處理作為一門學(xué)科大約形成于20世紀(jì)60年代初期。早期的圖像處理的目的是改善圖像的質(zhì)量,它以人為對(duì)象,以改善人的視覺效果為目的。圖像處理中,輸入的是質(zhì)量低的圖像,輸出的是改善質(zhì)量后的圖像,常用的圖像處理方法有圖像增強(qiáng)、復(fù)原、編碼、壓縮等。首次獲得實(shí)際成功應(yīng)用的是美國噴氣推進(jìn)實(shí)驗(yàn)室(JPL)。他們對(duì)航天探測(cè)器徘徊者7號(hào)在1964年發(fā)回的幾千張?jiān)虑蛘掌褂昧藞D像處理技術(shù),如幾何校正、灰度變換、去除噪聲等方法進(jìn)行處理,并考慮了太陽位置和月球環(huán)境的影響,由計(jì)算機(jī)成功地繪制出月球表面地圖,獲得了巨大的成功。隨后又對(duì)探測(cè)飛船發(fā)回的近十萬張照片進(jìn)行更為復(fù)雜的圖像處理,以致獲得了月球的地形圖、彩色圖及全景鑲嵌圖,獲得了非凡的成果,為人類登月創(chuàng)舉奠定了堅(jiān)實(shí)的基礎(chǔ),也推動(dòng)了數(shù)字圖像處理這門學(xué)科的誕生。在以后的宇航空間技術(shù),如對(duì)火星、土星等星球的探測(cè)研究中,數(shù)字圖像處理技術(shù)都發(fā)揮了巨大的作用。隨著圖像處理技術(shù)的深入發(fā)展,從70年代中期開始,隨著計(jì)算機(jī)技術(shù)和人工智能、思維科學(xué)研究的迅速發(fā)展,數(shù)字圖像處理向更高、更深層次發(fā)展。人們已開始研究如何用計(jì)算機(jī)系統(tǒng)解釋圖像,實(shí)現(xiàn)類似人類視覺系統(tǒng)理解外部世界,這被稱為圖像理解或計(jì)算機(jī)視覺。很多國家,特別是發(fā)達(dá)國家投入更多的人力、物力到這項(xiàng)研究,取得了不少重要的研究成果。其中代表性的成果是70年代末MIT的Marr提出的視覺計(jì)算理論,這個(gè)理論成為計(jì)算機(jī)視覺領(lǐng)域其后十多年的主導(dǎo)思想。圖像理解雖然在理論方法研究上已取得不小的進(jìn)展,但它本身是一個(gè)比較難的研究領(lǐng)域,存在不少困難,因人類本身對(duì)自己的視覺過程還了解甚少,因此計(jì)算機(jī)視覺是一個(gè)有待人們進(jìn)一步探索的新領(lǐng)域。2.1 國內(nèi)外研究現(xiàn)狀在過去幾十年中,國內(nèi)外許多專家學(xué)者在車道線識(shí)別和跟蹤系統(tǒng)方面已經(jīng)做出了很多積極有意義的探索。國外一些關(guān)于智能車輛輔助駕駛系統(tǒng)的研究成果已經(jīng)比較成熟,有些已經(jīng)投入到商業(yè)化應(yīng)用中,相對(duì)國外的研究水平,國內(nèi)的研究起步比較晚,但是發(fā)展速度比較快,相信在未來的幾年里,國內(nèi)的一些研究成果應(yīng)該能夠快速跟上國際版步伐,逐漸發(fā)展完善起自己的應(yīng)用體系,盡快的投入到實(shí)際生產(chǎn)應(yīng)用中。1.2.1 國外研究現(xiàn)狀國外一些關(guān)于車道線識(shí)別的研究成果已經(jīng)比較成熟,目前,有些方法已經(jīng)投入到了實(shí)際的商業(yè)化應(yīng)用中。其中,具有代表性的系統(tǒng)主要由:意大利帕爾瑪大學(xué)開發(fā)的GOLD系統(tǒng)20;美國密歇根州立大學(xué)人工智能實(shí)驗(yàn)室開發(fā)的LOIS系統(tǒng);美國卡內(nèi)基梅隆大學(xué)開發(fā)的RALPH系統(tǒng);美國卡內(nèi)基梅隆大學(xué)機(jī)器人學(xué)院NavLab實(shí)驗(yàn)室和Vision&Autonomous System Center聯(lián)合開發(fā)的SCARF系統(tǒng)和ALVINN系統(tǒng)。GOLD系統(tǒng):該系統(tǒng)采用立體視覺技術(shù),根據(jù)目前車道線的油漆顏色特征來定位車道線所處位置,但是立體視覺技術(shù)面臨圖像匹配以及運(yùn)行時(shí)間長等問題,因而該系統(tǒng)有設(shè)計(jì)了并行SIMD硬件結(jié)構(gòu)來滿足實(shí)時(shí)性要求。LOIS系統(tǒng):該系統(tǒng)利用一種可變型的道路模板技術(shù),將道路的彎曲度和智能車輛在行駛過程中所處道路的位置問題轉(zhuǎn)換成多維參數(shù)空間的最優(yōu)化問題,通過得到的最優(yōu)解來解決車道偏離預(yù)警中出現(xiàn)的問題。RALPH系統(tǒng):該系統(tǒng)首先根據(jù)車輛速度的變化情況,建立了與之相對(duì)應(yīng)的一系列梯形窗口,通過對(duì)梯形窗口內(nèi)的視頻圖像通過逆透視變換來確定道路的彎曲度,然后計(jì)算智能車輛偏離車道中心線的距離,判斷車道線偏離情況,最后通過跟蹤逆透視變換得到的道路平行線,從而實(shí)現(xiàn)道路車道線的追蹤。該系統(tǒng)在實(shí)驗(yàn)開始的時(shí)候進(jìn)行了道路結(jié)構(gòu)化假設(shè),在很大程度上提高了車道線檢測(cè)識(shí)別的魯棒性。SCARF系統(tǒng):該系統(tǒng)利用雙目視覺原理,在圖像中設(shè)置的梯形窗口內(nèi),利用霍夫變換來估計(jì)車道線可能出現(xiàn)的ROI區(qū)域,然后反投影到真實(shí)的道路平面,通過控制車輛的方向沿著ROI中心線方向行駛來確保車輛不會(huì)偏離車道線。ALVINN系統(tǒng):采用基于BP神經(jīng)網(wǎng)絡(luò)的方法,通過對(duì)不同天氣狀況下的車道線特征進(jìn)行訓(xùn)練,來得到一個(gè)參數(shù)訓(xùn)練模型,從而根據(jù)訓(xùn)練得到的參數(shù)模型來預(yù)測(cè)不同天氣狀況下的車道線位置。1.2.2 國內(nèi)研究現(xiàn)狀今年來,我國在該領(lǐng)域也做了一些積極的探索和研究,但是與其他發(fā)達(dá)國家相比起步比較晚,因此,國內(nèi)在該領(lǐng)域的研究和探索還存在一定的改進(jìn)空間。國內(nèi)的研究成果主要有以下幾個(gè):清華大學(xué)計(jì)算機(jī)智能技術(shù)與系統(tǒng)國家重點(diǎn)實(shí)驗(yàn)室研制的THMR系統(tǒng):該項(xiàng)目采用的道路模型是直線模型,利用多窗口的雙閾值二值化進(jìn)行特征提取,在后續(xù)處理中采用增強(qiáng)轉(zhuǎn)移網(wǎng)絡(luò)來完成,在算法實(shí)時(shí)性方面做得比較好,但由于道路模型首先,因此只能對(duì)直線車道進(jìn)行檢測(cè)和識(shí)別。吉林工業(yè)大學(xué)研制的JUTIV系統(tǒng):該項(xiàng)目采用3D回旋曲線為道路模型,用最大類方差方法來設(shè)定閾值提取道路邊緣,利用隨即采用的LmedSquare方法進(jìn)行車道線曲線擬合,同時(shí)結(jié)合了駕駛員穩(wěn)態(tài)預(yù)瞄原理,建立了車道線擬合的預(yù)測(cè)區(qū)域,并進(jìn)一步利用多傳感器信息融合技術(shù)對(duì)復(fù)雜環(huán)境下的車道線檢測(cè)識(shí)別與跟蹤等關(guān)鍵技術(shù)做了系統(tǒng)研究。3.1 論文主要內(nèi)容一種車道線識(shí)別方法,包括以下步驟:從在繪有不同車道標(biāo)志圖案 的車道上行駛的汽車中,通過圖像傳 感器拍攝汽車前方視野; 從上 述步驟中拍攝的圖像中選取汽車左、右車道邊界的數(shù)據(jù),通過將對(duì)所述選取的車道邊界數(shù)據(jù)進(jìn)行處理,完成車道線的識(shí)別,確定車輛所在區(qū)域的車道線類型。論文中主要分以下部分對(duì)車道線識(shí)別算法進(jìn)行分析和描述:第2章:介紹了車道線的基本知識(shí),分析討論了車道線預(yù)處理的過程和用到的相關(guān)算法;第3章:具體分析霍夫變換算法,并根據(jù)圓和橢圓的性質(zhì)對(duì)霍夫變換算法進(jìn)行改進(jìn)第4章:在對(duì)所使用的算法和車道線特征進(jìn)行分析綜合的基礎(chǔ)上,使用C語言結(jié)合OpenCV圖像處理庫編寫程序?qū)崿F(xiàn)算法,并對(duì)算法進(jìn)行驗(yàn)證,得到最終的車道線識(shí)別結(jié)果。第2章 車道線的預(yù)處理預(yù)處理是車道線識(shí)別過程中一個(gè)十分重要的一環(huán)。良好的預(yù)處理能使排除各種干擾,使運(yùn)算量大大下降,大大提高車道線識(shí)別的實(shí)時(shí)性和準(zhǔn)確性,反之,則不僅會(huì)使識(shí)別效率降低,甚至導(dǎo)致得到錯(cuò)誤的結(jié)果。預(yù)處理的過程主要分為車道線的設(shè)置感興趣區(qū)域、平滑濾波、閾值分割、邊緣檢測(cè)。本章首先簡要介紹車道線的基本知識(shí),然后對(duì)感興趣區(qū)域的原理和應(yīng)用進(jìn)行分析,并針對(duì)車道線的具體特征和要得到的目標(biāo)選擇合適的預(yù)處理方法,進(jìn)而對(duì)每種預(yù)處理過程中的算法進(jìn)行分析討論,得出適合的預(yù)處理算法。2.1 認(rèn)識(shí)車道線2.1.1 車道線的基本分類車道分界線是用來分隔同方向行駛的交通流的交通標(biāo)志線,凡同方向車行道有兩條或兩條以上車道時(shí),均應(yīng)劃車道分界線。車道分界線有兩種,即車道分界虛線和導(dǎo)向車道分界實(shí)線。車道分界虛線,在保證安全的原則下,準(zhǔn)許車輛越線超車或變更車道行駛;導(dǎo)向車道分界實(shí)線,不準(zhǔn)車輛越線或變更車道。圖(2-1)所示為各種車道線:圖2-1 各種車道線2.1.2 車道線的標(biāo)劃區(qū)分白色虛線:劃于路段中時(shí),用以分隔同向行駛的交通流或作為行車安全距離識(shí)別線;劃于路口時(shí),用以引導(dǎo)車輛行進(jìn);白色實(shí)線:劃于路段中時(shí),用以分隔同向行駛的機(jī)動(dòng)車和非機(jī)動(dòng)車或指示車行道線;劃于路口時(shí),用作導(dǎo)向車道線或停車線;黃色虛線:劃于路段中時(shí),用以分隔對(duì)向行駛的交通流,劃于路側(cè)或緣石上時(shí),用以禁止車輛長時(shí)在路邊停放。黃色實(shí)線:劃于路段中時(shí),用以分隔對(duì)向行駛的交通流;劃于路側(cè)或緣石上時(shí),用以禁止車輛長時(shí)或臨時(shí)在路邊停放。雙白虛線:劃于路口時(shí)作為減速讓行線;劃于路段中時(shí),作為行車方向隨時(shí)間改變之可變車道線;雙黃實(shí)線:劃于路段中時(shí),用以分隔對(duì)向行駛的交通流;黃色虛實(shí)線:劃于路段中時(shí),用以分隔對(duì)向行駛的交通流。黃色實(shí)線一側(cè)禁止車輛超車、跨越或回轉(zhuǎn),黃色虛線一側(cè)在保證安全的情況下準(zhǔn)許車輛超車、跨越或回轉(zhuǎn);雙白實(shí)線:劃于路口時(shí),作為停車讓行線。2.1.3 車道線的基本形狀通過對(duì)各種車道線的比較,我們可以法線,車道線基本分為兩種形狀:直線和圓,其他的形狀還包括三角形等,但它們的基本組成元素仍然是直線,所以我們同樣能對(duì)其運(yùn)用直線的方式處理。但是必須注意的是,由于圖像采集設(shè)備與道路之間有一定的傾角,所以道路中的圓出現(xiàn)在圖像中時(shí)將會(huì)變?yōu)闄E圓。通過將基本的識(shí)別目標(biāo)固定在直線和橢圓的范圍中,我們便將車道識(shí)別的問題抽象為直線和橢圓的識(shí)別,研究方向進(jìn)一步固定。2.2 感興趣區(qū)域感興趣區(qū)域簡稱為ROI(region of interest)是將圖像中的重要區(qū)域進(jìn)行標(biāo)記,隨后的各種算法和分析將主要針對(duì)ROI。這樣做的好處是不僅使處理的數(shù)據(jù)量變少,而且也排除了非重點(diǎn)區(qū)域的潛在干擾。觀察采集到的圖像,如圖所示,我們可以發(fā)現(xiàn),圖像中的上部是天空和較遠(yuǎn)處的信息,這一部分信息是不需要的,而且可能會(huì)對(duì)處理結(jié)果造成干擾。所以,在圖像的處理中我們應(yīng)當(dāng)適當(dāng)選取ROI,對(duì)于以后的處理有莫大裨益。如圖(2-2)所示,其中下部較暗的區(qū)域即為我們的感興趣區(qū)域:圖2-2 感興趣區(qū)域2.3 平滑濾波各類圖像處理系統(tǒng)在圖像的采集、獲取、傳送和轉(zhuǎn)換(如成像、復(fù)制掃描、傳輸以及顯示等)過程中,均處在復(fù)雜的環(huán)境中,光照、電磁多變,所有的圖像均不同程度地被可見或不可見的噪聲干擾。噪聲源包括電子噪聲、光子噪聲、斑點(diǎn)噪聲和量化噪聲。如果信噪比低于一定的水平,噪聲逐漸變成可見的顆粒形狀,導(dǎo)致圖像質(zhì)量的下降。除了視覺上質(zhì)量下降,噪聲同樣可能掩蓋重要的圖像細(xì)節(jié),因此,在對(duì)采集到的原始圖像做進(jìn)一步的處理時(shí),需要對(duì)圖像進(jìn)行必要的濾波降噪處理。2.3.1 均值濾波均值濾波是典型的線性濾波算法,它是指在圖像上對(duì)目標(biāo)像素給一個(gè)模板,該模板包括了其周圍的臨近像素,模板大小一般為33、55、或77 ,用其臨近區(qū)域像素值的均值來替代目標(biāo)像素。均值濾波的原理如圖(2-3)所示,其中a)圖中1-8為像素點(diǎn)的臨近區(qū)域,b)圖為的權(quán)系數(shù)矩陣:a)b)圖2-3 均值濾波原理均值濾波方法如公式(2-1)所示:(2-1)均值濾波具有算法簡單,計(jì)算速度快的優(yōu)點(diǎn),但它的缺點(diǎn)也很明顯:降低噪聲的同時(shí)使圖像產(chǎn)生模糊,特別是景物的邊緣和細(xì)節(jié)部分。2.3.2 中值濾波中值濾波是一種非線性數(shù)字濾波器技術(shù),經(jīng)常用于去除圖像或者其它信號(hào)中的噪聲。中值濾波的思想是將一個(gè)像素替換為其臨近區(qū)域的所有像素的中值,臨近區(qū)域一般選以此像素為中心的奇數(shù)大小的窗口,常用的為33、55、77等。中值濾波的計(jì)算方法如公式(2-2)所示:(2-2)中值濾波法對(duì)消除椒鹽噪聲非常有效,在光學(xué)測(cè)量條紋圖象的相位分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大.中值濾波在圖像處理中,常用于保護(hù)邊緣信息,是經(jīng)典的平滑噪聲的方法。圖(2-4)為中值濾波效果圖:圖2-4 中值濾波效果圖2.3.3 高斯濾波高斯濾波是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應(yīng)用于圖像處理的減噪過程。通俗的講,高斯濾波就是對(duì)整幅圖像進(jìn)行加權(quán)平均的過程,每一個(gè)像素點(diǎn)的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過加權(quán)平均后得到。高斯濾波的思想是:用一個(gè)模板(或稱卷積、掩模)掃描圖像中的每一個(gè)像素,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點(diǎn)的值。高斯濾波的效果圖如圖2-5所示:圖2-5 高斯濾波效果圖2.3.4 平滑濾波總結(jié)通過比較以上三種濾波方法,可以看出三者的區(qū)別和適用范圍。均值濾波算法簡單,但會(huì)造成圖像的模糊,中值濾波對(duì)椒鹽噪聲有非常好的去除效果,并且能夠保存邊緣信息,高斯濾波則對(duì)高斯噪聲具有很好的處理效果。圖像邊緣的信息對(duì)于本論文中的車道線識(shí)別算法有重要作用,所以在選擇濾波算法上應(yīng)優(yōu)先選用中值濾波和高斯濾波。2.4 二值化2.4.1 二值化的基本概念圖像的二值化就是將一副灰度圖像轉(zhuǎn)換為二值圖像,例如設(shè)定一個(gè)閾值K,像素值小于K的置為0,反之則置為255,如公式(2-3)所示:(2-3)2.4.2 大津法自適應(yīng)閾值分割雖然通過給定一個(gè)閾值能實(shí)現(xiàn)圖像的二值化,但在很多時(shí)候并不能給出一個(gè)合適的閾值,為了解決這個(gè)問題,人們提出了許多自適應(yīng)的閾值分割方法,以適應(yīng)不同灰度分布的圖像,其中應(yīng)用廣泛的有大津法自適應(yīng)閾值等。大津法也叫最大類間方差法,是一種自適應(yīng)的閾值確定的方法,簡稱OTSU。它是按圖像的灰度特性,將圖像分成背景和目標(biāo)2部分。背景和目標(biāo)之間的類間方差越大,說明構(gòu)成圖像的2部分的差別越大,當(dāng)部分目標(biāo)錯(cuò)分為背景或部分背景錯(cuò)分為目標(biāo)都會(huì)導(dǎo)致2部分差別變小。因此,使類間方差最大的分割意味著錯(cuò)分概率最小。對(duì)于圖像,前景(即目標(biāo))和背景的分割閾值記作T,屬于前景的像素點(diǎn)數(shù)占整幅圖像的比例記為,其平均灰度;背景像素點(diǎn)數(shù)占整幅圖像的比例為,其平均灰度為。圖像的總平均灰度記為,類間方差記為。假設(shè)圖像的背景較暗,并且圖像的大小為,圖像中像素的灰度值小于閾值T的像素個(gè)數(shù)記作,像素灰度大于閾值T的像素個(gè)數(shù)記作,則有(2-4)(2-5)(2-6)(2-7)(2-8)(2-9)經(jīng)計(jì)算后,得到等價(jià)公式(2-10):(2-10) 采用遍歷的方法得到使類間方差最大的閾值T,即為所求。大津法閾值分割如圖2-6所示:圖2-6 大津法自適應(yīng)閾值分割2.5 邊緣提取圖象的邊緣是指圖象局部區(qū)域亮度變化顯著的部分,該區(qū)域的灰度剖面一般可以看作是一個(gè)階躍,既從一個(gè)灰度值在很小的緩沖區(qū)域內(nèi)急劇變化到另一個(gè)灰度相差較大的灰度值。圖象的邊緣部分集中了圖象的大部分信息,圖象邊緣的確定與提取對(duì)于整個(gè)圖象場(chǎng)景的識(shí)別與理解是非常重要的,同時(shí)也是圖象分割所依賴的重要特征,邊緣檢測(cè)主要是圖象的灰度變化的度量、檢測(cè)和定位。2.5.1 Sobel算子Sobel算子主要用作邊緣檢測(cè)。在技術(shù)上,它是一離散性差分算子,用來運(yùn)算圖像亮度函數(shù)的梯度之近似值。在圖像的任何一點(diǎn)使用此算子,將會(huì)產(chǎn)生對(duì)應(yīng)的梯度矢量或是其法矢量。Sobel算子包含兩個(gè)的矩陣,如圖(2-7)所示,用這兩個(gè)矩陣與圖像進(jìn)行卷積,便可分別得到橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經(jīng)橫向及縱向邊緣檢測(cè)的圖像,其計(jì)算方法如公式(2-11)和(2-12):(2-11)(2-12)圖像的每一個(gè)像素的橫向及縱向梯度值可用公式(2-13)來計(jì)算梯度的大小。(2-13)通常,也使用一個(gè)近似計(jì)算的公式(2-14)來提高計(jì)算速度:(2-14)可用以下公式計(jì)算梯度方向:(2-15)如果角度等于零,即代表圖像該處擁有縱向邊緣,左方較右方暗。Sobel算子邊緣提取效果如圖(2-8)所示,a)圖為源圖像,b)圖為X方向邊緣檢測(cè)結(jié)果,c)圖為Y方向邊緣檢測(cè)結(jié)果c)b)a)圖2-8 Sobel算子邊緣檢測(cè)效果圖2.5.2 Canny算子Canny邊緣檢測(cè)算子是一個(gè)多級(jí)邊緣檢測(cè)算法,它的目標(biāo)為實(shí)現(xiàn)最優(yōu)的邊緣檢測(cè)算法。Canny算子的處理過程分為幾個(gè)步驟,首先要對(duì)輸入圖像進(jìn)行高斯平滑處理,然后使用一個(gè)二維一階導(dǎo)數(shù)算子作用與平滑處理后的圖像,用于突出圖像中高一空間導(dǎo)數(shù)的圖像區(qū)域,這樣我們就從原始圖像生成了圖像中每個(gè)點(diǎn)亮度梯度圖以及亮度梯度的方向。隨后Canny跟蹤這些亮度梯度并且保留局部最大值而把其他值設(shè)為0,即非極大值抑制,最后使用雙閾值算法檢測(cè)和連接邊緣。對(duì)圖(2-8)中圖像進(jìn)行Canny邊緣檢測(cè)效果如圖(2-9)所示: 圖2-9 Canny算子邊緣檢測(cè)效果圖2.5.3 Sobel算子和Canny算子的比較Sobel算子通過對(duì)圖像進(jìn)行卷積運(yùn)算,算法簡單且計(jì)算速度相對(duì)較快,缺點(diǎn)是Sobel算子并沒有將圖像的主題與背景嚴(yán)格地區(qū)分開來,換言之就是Sobel算子并沒有基于圖像灰度進(jìn)行處理,由于Sobel算子并沒有嚴(yán)格地模擬人的視覺生理特征,所以提取的圖像輪廓有時(shí)并不能令人滿意。算子是一個(gè)具有濾波增強(qiáng)檢測(cè)的多階段的優(yōu)化算子,在進(jìn)行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法采用一階偏導(dǎo)的有限差分來計(jì)算梯度幅值和方向,在處理過程中,Canny算子還將經(jīng)過一個(gè)非極大值抑制的過程,最后Canny算子還采用兩個(gè)閾值來連接邊緣??梢钥闯鯟anny算子的處理過程比較復(fù)雜,但它的處理結(jié)果是比較好的。第3章 Hough變換直線和橢圓的檢測(cè)3.1 Hough變換直線檢測(cè)3.1.1 Hough變換直線檢測(cè)的基本原理Hough變換的核心思想是將圖像空間轉(zhuǎn)化到參數(shù)空間進(jìn)行分析。在平面直角坐標(biāo)系中,一條直線可以用方程來表示,其中和是參數(shù),分別是斜率和截距。過某一點(diǎn)的所有直線的參數(shù)都會(huì)滿足方程,即點(diǎn)確定了一族直線。方程在參數(shù)平面上是一條直線。這樣,圖像平面上的一個(gè)前景像素點(diǎn)就對(duì)應(yīng)到參數(shù)平面上的一條直線,同理,直線上的其他點(diǎn)也對(duì)應(yīng)一條參數(shù)空間的直線,最終,在參數(shù)空間中的這些直線將會(huì)交于一點(diǎn),很顯然,這個(gè)點(diǎn)就是。但是方程無法表示這樣的直線(斜率無窮大),所以在實(shí)際應(yīng)用中使用直線的法線式方程來表示直線:此時(shí),圖像空間中的一點(diǎn)將對(duì)應(yīng)參數(shù)空間的一條正弦曲線,這樣圖像空間中的一條直線就對(duì)應(yīng)參數(shù)空間中的一點(diǎn)。如圖(3-1)所示:圖3-1 直線上點(diǎn)在參數(shù)空間的映射圖(3-2)為霍夫變換直線檢測(cè)的效果(已設(shè)置感興趣區(qū)域):圖3-2 霍夫變換直線檢測(cè)3.1.2 Hough變換的缺陷和改進(jìn)Hough變換具有顯而易見的優(yōu)點(diǎn),但它也有一些不可忽視的缺點(diǎn):1、運(yùn)算量大。傳統(tǒng)的Hough變換需要對(duì)每個(gè)點(diǎn)進(jìn)行計(jì)算,不僅運(yùn)算量大,而且會(huì)產(chǎn)生大量冗余數(shù)據(jù),并且運(yùn)用Hough變換進(jìn)行圓或其他圖像的檢測(cè)時(shí),由于參數(shù)的增多(如圓需要3個(gè)參數(shù)),計(jì)算量將會(huì)急劇增加,所以,Hough變換的實(shí)時(shí)性不高;2、雖然Hough變換能得到直線的參數(shù)方程,但它無法確定直線的起止點(diǎn),即無法確定直線是否是連續(xù)的;3、圖像中的噪聲點(diǎn)會(huì)對(duì)Hough變換的結(jié)果產(chǎn)生較大的影響。針對(duì)以上缺陷,需要對(duì)Hough變換進(jìn)行一定的改進(jìn),以更好地完成期望的工作:1、對(duì)圖像進(jìn)行合適的預(yù)處理,盡力排除噪聲點(diǎn)的干擾;2、對(duì)圖像進(jìn)行邊緣提取、區(qū)域分割等,提取出有用的信息,再根據(jù)統(tǒng)計(jì)學(xué)的一些原理來應(yīng)用Hough變換,減少Hough變換的運(yùn)算量3、對(duì)于Hough變換以上缺陷中的第二點(diǎn),可以設(shè)計(jì)特殊的數(shù)據(jù)結(jié)構(gòu)記錄Hough變換過程中的數(shù)據(jù),從而解決探測(cè)直線等起止點(diǎn)的問題。3.2 Hough變換圓檢測(cè)3.2.1 Hough變換圓檢測(cè)的基本原理Hough變換直線檢測(cè)中是將圖像空間中的一條直線映射為參數(shù)空間中的一個(gè)點(diǎn),對(duì)圓的檢測(cè)同樣如此,這也是Hough變換的核心思想所在。但是直線檢測(cè)需要兩個(gè)參數(shù),而圓檢測(cè)需要三個(gè)參數(shù)(為圓心坐標(biāo),r為圓的半徑)。在平面直角坐標(biāo)系中,圓用方程來表示,將圓上的一點(diǎn)映射到參數(shù)空間,對(duì)應(yīng)的方程為由于圓的半徑r不確定,所以參數(shù)空間是一個(gè)三維空間,每一點(diǎn)在參數(shù)空間映射為一個(gè)圓錐,如圖(3-3)所示:圖3-3 圓上一點(diǎn)在參數(shù)空間的映射因此,Hough變換圓檢測(cè)的計(jì)算量會(huì)是相當(dāng)大的,這是傳統(tǒng)Hough變換最大的缺陷之一。3.2.2 對(duì)hough變換圓檢測(cè)算法的改進(jìn)由于傳統(tǒng)的Hough變換圓檢測(cè)算法計(jì)算量太大,所以需要對(duì)其進(jìn)行改進(jìn)以增強(qiáng)其實(shí)時(shí)性。對(duì)于圓,有如下性質(zhì):圓上一點(diǎn)的法線必過圓心。根據(jù)這一性質(zhì),隨機(jī)選取圓上若干各點(diǎn),求得其法線,法線的交點(diǎn)便是圓心,進(jìn)而也可以很容易地計(jì)算出圓的半徑。那么如何求一個(gè)點(diǎn)的法線呢?對(duì)于圖像中的一個(gè)點(diǎn),其法線方向便是其梯度變換最大的方向,且法線與切線呈垂直關(guān)系,那么我們可以先求一點(diǎn)的切線,進(jìn)而得到這一點(diǎn)的法線。3.2.3 最小二乘法求曲線上一點(diǎn)的切線最小二乘法(又稱最小平方法)是一種數(shù)學(xué)優(yōu)化技術(shù)。它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳匹配函數(shù)。利用最小二乘法可以簡便地求得未知的數(shù)據(jù),并使得這些求得的數(shù)據(jù)與實(shí)際數(shù)據(jù)之間誤差的平方和為最小。最小二乘法還可用于曲線擬合等初中應(yīng)用領(lǐng)域。假設(shè)圖像中存在處于一條直線附近的幾個(gè)點(diǎn),那么設(shè)這條直線的方程為:為直線斜率,為截距。為求得和,根據(jù)最小二乘法原理,將實(shí)測(cè)值與的離差的平方和最小作為最優(yōu)判據(jù)。令(3-1)當(dāng)最小時(shí),分別對(duì)和求偏導(dǎo),令這兩個(gè)偏導(dǎo)數(shù)等于0:(3-2)(3-3)兩個(gè)偏導(dǎo)數(shù)等于0,即得:(3-4)(3-5)將和的結(jié)果代入原直線方程,即得擬合所得的直線方程為:nXkYXXXnYXYXnYiiiiiiii-+-=22)(同樣,在圖像中圓上某一點(diǎn)的切線方程也可用同樣的方法求得。雖然最小二乘法能比較方便的得出圓上一點(diǎn)的切線,但要知道其正確性與點(diǎn)的樣本大小有很大關(guān)系,如果樣本太小,則計(jì)算誤差變大,很可能得不到正確的結(jié)果,若樣本太大,則計(jì)算量也將隨之增大,所以樣本大小的選取是一個(gè)不可忽視的問題。圖(3-4)展示了根據(jù)最小二乘法原理得到的曲線上一點(diǎn)的切線:圖3-4 最小二乘法得到曲線上一點(diǎn)的切線3.3 Hough變換橢圓檢測(cè)根據(jù)前面的分析,道路車道線經(jīng)過圖像采集設(shè)備采集后,其原本的圓將會(huì)變化為橢圓,所以我們更應(yīng)該關(guān)注橢圓的檢測(cè)。根據(jù)Hough變換圓檢測(cè)的算法,進(jìn)一步討論橢圓的檢測(cè),由于橢圓上一點(diǎn)的法線并不過橢圓的中心,所以上面的圓檢測(cè)算法不能直接用于橢圓的檢測(cè),需要進(jìn)一步的改進(jìn)。根據(jù)橢圓的性質(zhì):橢圓上兩點(diǎn)法線的交點(diǎn)與這兩點(diǎn)中點(diǎn)所確定的直線過橢圓中心。我們自然而然便能對(duì)圓檢測(cè)算法加以改進(jìn)以適應(yīng)橢圓的檢測(cè)。橢圓檢測(cè)的過程描述為:第一步:在目標(biāo)圖形上選取隨機(jī)的三個(gè)點(diǎn)分別記為、和,并求得他們各自的切線,分別記為、和他們兩兩間的中點(diǎn),分別記為、和(即為和的中點(diǎn));第二步:找到這三條切線兩兩相交的交點(diǎn),分別記為、和(即為和的交點(diǎn),以此類推);第三步:將對(duì)應(yīng)的交點(diǎn)與中點(diǎn)連接,即與、與、與,將得到的直線分別記為、和;第四步:求得這三條連線兩兩相交的交點(diǎn),根據(jù)一定的距離準(zhǔn)則,判斷這三點(diǎn)是否足夠接近,如果足夠接近,說明此時(shí)的形狀可能是一個(gè)橢圓,否則則說明不是;第五步:在目標(biāo)圖形上另選一點(diǎn),求其切線,并將其與其他三點(diǎn)中的一點(diǎn)重新配對(duì),得到兩切線交點(diǎn)與中點(diǎn)的直線方程;第六步:根據(jù)同樣的距離準(zhǔn)則,判斷新得到的直線與其他直線的交點(diǎn)是否足夠接近,如果是,那么目標(biāo)圖形是一個(gè)橢圓,如果不是,則說明目標(biāo)圖形不是橢圓。圖(3-5)為根據(jù)此方法對(duì)橢圓進(jìn)行檢測(cè)的結(jié)果:圖3-5 橢圓檢測(cè)由圖可以看出,該方法能正確的檢測(cè)出圖像中的橢圓,說明了此方法的正確性和可靠性。第4章 車道線的識(shí)別綜合分析前面章節(jié)中的處理過程和算法,總結(jié)出車道線識(shí)別的流程,如圖(4-1)所示:圖4-1 車道線識(shí)別流程圖在Linux平臺(tái)上,使用C語言和Gtk+結(jié)合OpenCV圖像處理庫編寫程序,進(jìn)行車道線的識(shí)別,如圖(4-2)所示:圖4-2 車道線識(shí)別程序界面車道線的識(shí)別結(jié)果如圖(4-3)所示:圖4-3 車道線的識(shí)別結(jié)果從識(shí)別的結(jié)果可以看出,算法能對(duì)車道線進(jìn)行準(zhǔn)確的識(shí)別,達(dá)到了預(yù)期的目的和理想的效果。結(jié)論從以上的算法分析和實(shí)驗(yàn)結(jié)果,可以看出,本論文中的算法能對(duì)車道線較好較準(zhǔn)確的進(jìn)行識(shí)別,算法的主要優(yōu)點(diǎn)有:1、算法的準(zhǔn)確性高。相比傳統(tǒng)的識(shí)別算法,本論文中的算法經(jīng)過優(yōu)化處理,提高了識(shí)別的準(zhǔn)確性;2、算法的實(shí)時(shí)性好,特別是經(jīng)過對(duì)Hough變換等算法的一定的改進(jìn),大大減少了計(jì)算量,提高了計(jì)算速度;3、算法能檢測(cè)多種車道線,適應(yīng)范圍廣;4、算法結(jié)構(gòu)清晰,魯棒性好,方便擴(kuò)展和改進(jìn);當(dāng)然,在實(shí)際的應(yīng)用中也發(fā)現(xiàn)了一些問題,主要有:1、對(duì)于復(fù)雜路況和天氣條件欠佳時(shí),算法的適應(yīng)性還不夠高;2、對(duì)于一些現(xiàn)實(shí)中存在的干擾因素如馬路沿等,不能進(jìn)行有效的排除。這些存在的問題,也指出了下一階段改進(jìn)的方向和思路,以后的時(shí)間里還有更多的工作要做。對(duì)于未來,隨著人工智能、機(jī)器學(xué)習(xí)等的不斷發(fā)展,將這些技術(shù)應(yīng)用于車道識(shí)別中,必將能極大的提高車道線識(shí)別的精確性和適應(yīng)性,并且伴隨著智能汽車的進(jìn)一步發(fā)展,新的技術(shù)不斷得到應(yīng)用,車道線的識(shí)別技術(shù)一定會(huì)迎來一個(gè)大的發(fā)展。特別是國內(nèi),隨著中國的科技水平不斷提高,市場(chǎng)需要持續(xù)增大,對(duì)于車道線的自動(dòng)識(shí)別的需求也將更加迫切。所以未來是光明的,但更需要我們腳踏實(shí)地,不斷取得新的突破。參考文獻(xiàn):1魯曼,蔡自興,李儀.道路區(qū)域分割的車道線檢測(cè)方法J.智能系統(tǒng)學(xué)報(bào),2010,5(6):505-5092金輝,吳樂林,陳慧巖,龔建偉 .結(jié)構(gòu)化道路車道線識(shí)別的一種改進(jìn)算法J.北京理工大學(xué)學(xué)報(bào),2007,27(6):502-5053朱桂英,張瑞林 .基于Hough變換的圓檢測(cè)方法J.計(jì)算機(jī)工程與設(shè)計(jì),2008,29(6)4郭磊,王建強(qiáng),李克強(qiáng).基于點(diǎn)集優(yōu)化和干擾點(diǎn)模糊化的車道線識(shí)別J.中國機(jī)械工程,18(15):1872-18765楊喜寧,段建民,高德芝,鄭榜貴.基于改進(jìn)Hough變換的車道線檢測(cè)技術(shù)J.計(jì)算機(jī)測(cè)量與控制,2010,18(2):292-2986莫建文,范楷,張順嵐.基于擴(kuò)散性搜索區(qū)域的車道線檢測(cè)與跟蹤算法J.桂林電子科技大學(xué)學(xué)報(bào),2011,31(6):464-4687王曉云,王永忠.基于線性雙曲線模型的車道線檢測(cè)算法J.杭州電子科技大學(xué)學(xué)報(bào),2010,30(6):64-678徐巖,雷濤.基于形態(tài)學(xué)方法的車道線檢測(cè)算法研究J.鐵道學(xué)報(bào),2009,31(1):107-1109秦開懷,王海潁,鄭輯濤.一種基于Hough變換的圓和矩形的快速檢測(cè)方法J.中國圖像圖形學(xué)報(bào),2010,15(1):110-11510段汝嬌,趙偉,黃松嶺,稱建業(yè).一種基于改進(jìn)Hough變換的直線快速檢測(cè)算法J.儀器儀表學(xué)報(bào),2010,31(12):2774-278011李若皓,丁冬花.一種基于掃描線的車道線識(shí)別算法J.微計(jì)算機(jī)信息,2008,24(6):244-24612劉富強(qiáng),張姍姍,朱文紅,李志鵬.一種基于視覺的車道線檢測(cè)與跟蹤算法J,2010,38(2):223-22913黃永林,葉玉堂,陳鎮(zhèn)龍,喬鬧生.一種新的快速Hough變換圓檢測(cè)方法J,2010,24(9):837-84114陳洪波,王強(qiáng),徐曉蓉,陳真誠,湯井田.用改進(jìn)的Hough變換檢測(cè)交通標(biāo)志圖像的直線特征J,2009,17(5):1111-111815K ast rinaki V , Zervakis M , K alait zakis K . A survey of video pr oces sing t echniques f or t raf fi c appli cat ions J .Image and programming f or V is ion Com put ing, 2003, 21( 1) : 359. 16Lee J W. A machin e vi sion s yst em f or lane depart u re det ect ion J . C om put er V ision Image U nderst , 2002, 86 17Isard M A , Blake. Condensat ion con diti on al den sit y propagat ion f or vi sual track ing J . Int ern at ional Journal of Computer Vision,1998,29(1):5 18Adrian Kaehler, Dr. Gary Rost Bradski.Learnint OpenCVM.ORELILY,200819D.Pomerleau,RALPH:Rapidly Adapting Lateral Position Handler,Proc.IEEE Symposium on Intelligent Vehicles,Detroit,USA,1995:506-51120M.Bertozzi and A.Broggi.GOLD:A Parallel Real Time Stereo Vision System for Generic Obstacle and Lane Detection,IEEE Trans.On Image Proc.1998,7(1):62-8121You Feng.Intelligent vehicle automatically change the way and automatic control method of overtakingD.JiLin university.2005:44-4622Guan xin.High-speed car lane departure warning system algorithms.Jilin university Phd.paper.2004:12-23致謝本論文的工作實(shí)在景文博老師的悉心指導(dǎo)下完成的。景老師嚴(yán)謹(jǐn)?shù)膶W(xué)風(fēng)、教書育人的敬業(yè)精神和對(duì)事業(yè)的執(zhí)著追求,對(duì)我影響至深,是我受益匪淺。在算法的研究過程中,景老師給了我特別大的幫助,如算法的選擇、圖像的選取和相關(guān)的參考資料等,節(jié)省了我很多時(shí)間,也讓我的理論知識(shí)得到了極大的提高。在此。我向景老師表達(dá)我最誠摯的感謝和致意!同時(shí),也感謝Debian Linux和OpenCV社區(qū)給我提供的幫助,對(duì)于OpenCV編程環(huán)境的搭建以及OpenCV在Linux操作系統(tǒng)上的應(yīng)用,他們給我提供了許多寶貴的意見,在此,為他們樂于分享、樂于助人的精神獻(xiàn)上我深深地感謝。當(dāng)然,也要感謝學(xué)校提供給我們的便利的學(xué)習(xí)條件,特別是圖書館提供給我們的便利的查閱資料的條件,讓我接觸到了許多有用的資料。最后,感謝我的朋友們,在我迷惑不解時(shí)和我討論問題幫我找到思路,謝謝他們的支持和幫助!附錄1車道線識(shí)別程序源代碼,編譯要求:Linux Kernel2.6或以上,Glibc2.13或以上,OpenCV2.1或以上,Gcc4.7或以上版本。#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#include <opencv/highgui.h>#include <opencv/cv.h>#define RED cvScalar(0,0,255,0)#define GREEN cvScalar(0,255,0,0)#define BLUE cvScalar(255,0,0,0)#define ROI cvRect(0,(int)src->height / 3,src->width,src->height)#define LOW_THRESH 80#define HIGH_THRESH 255#define MAXDISTANCE 10/img為加載的源圖像,src為處理過程中所用的灰度圖像/temp為臨時(shí)需要時(shí)的中轉(zhuǎn)圖像,out為最后輸出的三通道圖像IplImage *img,*src,*temp,*out;CvMemStorage *storage;CvSeq *lines;CvSeq *contours;typedef structfloat a;float b;float c;int is_vertical;Line;Line *get_tangent(CvSeq *seq,int n);Line get_line_func(CvPoint p1,CvPoint p2);CvPoint *get_join(CvPoint *p1,Line l1,CvPoint *p2,Line l2);CvPoint get_center(CvPoint p1,CvPoint p2);double points_distance(CvPoint p1,CvPoint p2);int is_ellipse(CvSeq *);int main(int argc,char *argv)/圖像的加載過程if (argc != 2)puts("Usage : ./mark filename");exit(1);if (img = cvLoadImage(argv1,CV_LOAD_IMAGE_UNCHANGED) = NULL)printf("can not load image %s.n",argv1);exit(1);src = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);temp = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);out = cvCreateImage(cvGetSize(img),img->depth,3);if (img->nChannels >= 3)cvCvtColor(img,src,CV_RGB2GRAY);cvCopy(img,out,NULL);elsecvCopy(img,src,0);cvCvtColor(img,out,CV_GRAY2RGB);storage = cvCreateMemStorage(0);/設(shè)置ROIcvSetImageROI(src,ROI);/濾波cvSmooth(src,src,CV_MEDIAN,5,5,0,0);cvSmooth(src,src,CV_GAUSSIAN,5,5,0,0);/大津法閾值分割cvThreshold(src,src,LOW_THRESH,HIGH_THRESH,CV_THRESH_OTSU);/邊緣檢測(cè)cvSetImageROI(temp,ROI);cvCanny(src,temp,LOW_THRESH,HIGH_THRESH,3);cvResetImageROI(src);cvResetImageROI(temp);cvCopy(temp,src,0);cvSetImageROI(src,ROI);/hough直線檢測(cè)lines=cvHoughLines2(src,storage,CV_HOUGH_PROBABILISTIC,0.5,CV_PI / 180,5,10,5);/繪制檢測(cè)到的直線int i;cvSetImageROI(out,ROI);for (i = 0;i < lines->total;i+)CvPoint *endpoints = (CvPoint *)cvGetSeqElem(lines,i);cvLine(out,endpoints0,endpoints1,RED,2,8,0);/邊緣提取int sum_of_area = 0;sum_of_area=cvFindContours(src,storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0);for (i = 0;i < sum_of_area;contours = contours->h_next,i+)if (contours->total <= 50) continue;if (is_ellipse(contours) puts("OK");cvDrawContours(out,contours,BLUE,GREEN,LOW_THRESH,2,8,cvPoint(0,0);cvResetImageROI(out);cvRectangle(out,cvPoint(0,(int)out->height / 3),cvPoint(out->width,out->height),GREEN,2,8,0);cvNamedWindow("IMG",0);cvNamedWindow("OUT",0);cvShowImage("IMG",img);cvShowImage("OUT",out);cvWaitKey(0);return 0;Line *get_tangent(CvSeq *seq,int n)Line *result = (Line *)malloc(sizeof(Line);if (n >= seq->total | n < 4) return (Line *)NULL;CvPoint *p = (CvPoint *)cvGetSeqElem(seq,n);double sum_of_xy = 0.0,sum_of_x = 0.0,sum_of_y = 0.0,sum_of_x2 = 0.0;int i;for (i = n - 4;i <= n + 4;i+)CvPoint *temp = (CvPoint *)cvGetSeqElem(seq,i);sum_of_xy += (double)(temp->x * temp->y);sum_of_x += (double)temp->x;sum_of_y += (double)temp->y;sum_of_x2 += (double)(temp->x * temp->x);#ifndef SIZEOFTANGENTAREA#define SIZEOFTANGENTAREA 9result->a = (SIZEOFTANGENTAREA * sum_of_xy - sum_of_x * sum_of_y) / (SIZEOFTANGENTAREA * sum_of_x2 - sum_of_x * sum_of_x);result->c = sum_of_y / SIZEOFTANGENTAREA - result->a * sum_of_x / SIZEOFTANGENTAREA;result->b = -1.0;result->is_vertical = 0;#endifreturn result;Line get_line_func(CvPoint p1,CvPoint p2)Line result;if (p1.x = p2.x) result.is_vertical = 1;elseresult.a = p2.y - p1.y;result.b = p1.x - p2.x;result.c = -(result.a * p1.x + result.b * p1.y);result.is_vertical = 0;return result;CvPoint *get_join(CvPoint *p1,Line l1,CvPoint *p2,Line l2)CvPoint *p = (CvPoint *)malloc(sizeof(CvPoint);if (l1.is_vertical != 1 && l2.is_vertical != 1)if (fabs(l1.a / l1.b - l2.a / l2.b) >= 0.000001)p->x = (l1.b * l2.c - l2.b * l1.c) / (l2.b * l1.a - l1.b * l2.a);p->y = (l1.a * l2.c - l1.c * l2.a) / (l1.b * l2.a - l1.a * l2.b);return p;else return NULL;else if (l1.is_vertical && l2.is_vertical != 1)p->x = p1->x;p->y = p1->x * l2.a / (-l2.b) + l2.c / (-l2.b);return p;else if (l2.is_vertical && l1.is_vertical != 1)p->x = p2->x;p->y = p2->x * l1.a / (-l1.