《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于OpenCV的高壓傳輸線位置檢測
基于OpenCV的高壓傳輸線位置檢測
2015年微型機(jī)與應(yīng)用第11期
張鵬展1,劉堂友1,樊 帥2
(1.東華大學(xué) 信息學(xué)院,上海 201620; 2.遼寧石油化工大學(xué) 信息與控制工程學(xué)院,遼寧 撫順 113001)
摘要: 高壓傳輸線的智能檢測一直以來都是計(jì)算機(jī)視覺識別的熱點(diǎn)。本文打破傳統(tǒng)的人工檢測方式,利用無人機(jī)搭載開源硬件Arduino和相機(jī)模塊采集高壓傳輸線的數(shù)據(jù),對采集回來的高壓傳輸線圖片用OpenCV和C++進(jìn)行加載、灰度處理、二值化、邊緣檢測、直線檢測、設(shè)計(jì)函數(shù)等系列處理,最終得到一幅只有傳輸線邊界的直線檢測圖像,同時(shí)過濾掉復(fù)雜圖背景,從而達(dá)到良好的識別效果。
Abstract:
Key words :

  張鵬展1,劉堂友1,樊 帥2

 ?。?.東華大學(xué) 信息學(xué)院,上海 201620;

  2.遼寧石油化工大學(xué) 信息與控制工程學(xué)院,遼寧 撫順 113001)

  摘  要: 高壓傳輸線的智能檢測一直以來都是計(jì)算機(jī)視覺識別的熱點(diǎn)。本文打破傳統(tǒng)的人工檢測方式,利用無人機(jī)搭載開源硬件Arduino和相機(jī)模塊采集高壓傳輸線的數(shù)據(jù),對采集回來的高壓傳輸線圖片用OpenCV和C++進(jìn)行加載、灰度處理、二值化、邊緣檢測、直線檢測、設(shè)計(jì)函數(shù)等系列處理,最終得到一幅只有傳輸線邊界的直線檢測圖像,同時(shí)過濾掉復(fù)雜圖背景,從而達(dá)到良好的識別效果。

  關(guān)鍵詞傳輸線檢測;計(jì)算機(jī)視覺識別;圖像處理

0 引言

  隨著市場競爭愈來愈激烈,以及人民生活水平的提高,架空線路也在全國各地迅速崛起,雖然擺脫了以往的斷電、缺電情況,但同時(shí)也給電力工作人員帶來了不小的麻煩,每年都要到人跡罕至的地方攀巖檢測傳輸線的損壞情況,不僅增大了工作人員的負(fù)擔(dān),也帶來了一定的戶外風(fēng)險(xiǎn)。基于這種情況,人們更熱衷于一種簡便的方式來實(shí)現(xiàn)高壓傳輸線的智能檢測,不再是利用人工自駕飛機(jī)的檢測方式,而是利用無人機(jī)導(dǎo)航巡檢,通過識別出來的高壓傳輸線與x軸的角度和圖像中心像素點(diǎn)到傳輸線的距離,從而控制無人飛行航向來完成巡檢,大大降低了電力員工作量,提高了安全性,并更加的智能化。

1 設(shè)計(jì)流程圖

  基于OpenCV的高壓傳輸線位置檢測流程圖如圖1所示。

001.jpg

  1.1 加載圖像

  利用OpenCV里的Mat來加載一幅圖像。它是一個(gè)類,表示一個(gè)n維的密集數(shù)值單通道或多通道數(shù)組[1-2]。簡單來說可以把它理解成一個(gè)存放數(shù)據(jù)的矩陣,可以用來存儲實(shí)數(shù)或復(fù)數(shù)值的向量和矩陣、灰度或彩色圖像。Mat數(shù)組布局是由陣列M.step[]定義的,元素的地址(i0,…,iM.dim-1)(其中0<ik<M.size[k]),可以表示為:addr(Mi0;…;iM.dims-1)=M.data+M.step[0]i0+M.step[1]i1+…+M.step[M:dims-1]iM:dims-1,那么二維數(shù)組就可以寫成如下形式:

  addr(Mi,j)=M.data+M.step[0]i+M.step[1]j[2]

  Mat加載一幅圖像形式如下:

  Mat in_img=cvLoadImage(char*filename,int flags=CV_LOAD_IMAGE_COLOR)

  其中,filename:圖像所在的路徑;flags如下:

  #define CV_LOAD_IMAGE_COLOR1(彩色三通道圖像)

  #define CV_LOAD_IMAGE_GRAYSCALE 0(灰色單通道圖像)

  #define CV_LOAD_IMAGE_UNCHANGED-1(圖像顏色不變)

  1.2 灰度處理

  加載完圖像之后,下一步要做的就是進(jìn)行灰度變換。圖像處理著重強(qiáng)調(diào)的是在圖像之間進(jìn)行各種變換,對圖像進(jìn)行加工以改善圖像的視覺效果。圖像灰度處理中,增強(qiáng)操作、直方圖及圖像間的變換是實(shí)現(xiàn)點(diǎn)操作的增強(qiáng)方式,又稱灰度變換[3]。通過改變圖像的灰度來達(dá)到一種很好的視覺效果,這是圖像增強(qiáng)的一種手段?;叶葓D像的目的是為了改善畫質(zhì),使得圖像顯示效果更加清晰,有選擇地突出圖像中感興趣的特征或者抑制圖像中某些不顯著的特征[4]。在計(jì)算機(jī)圖形學(xué)與圖像處理中,數(shù)字圖像的灰度是進(jìn)行圖像識別與處理的基礎(chǔ),掌握一定的灰度處理技術(shù)對提升自己的計(jì)算機(jī)應(yīng)用能力有很大幫助。

  RGB色彩空間中,根據(jù)色彩與深度的映射關(guān)系主要有真彩色、偽彩色和調(diào)配色三種。真彩色是指在組成一幅圖像的像素值中有R,G,B三個(gè)基色分量,每個(gè)基色分量直接決定圖像的基色強(qiáng)度[5]。偽彩色圖像的每個(gè)像素值實(shí)際上是一個(gè)索引值或代碼,此代碼值作為色彩查找表中CLUT某一項(xiàng)的入口地址,根據(jù)地址查找R,G,B的強(qiáng)度值。調(diào)配色的獲取是通過每個(gè)像素點(diǎn)的R,G,B分量作為單獨(dú)的索引值進(jìn)行變換,然后經(jīng)相應(yīng)的色彩變換表找出各自的基色強(qiáng)度,是用變換后的R,G,B強(qiáng)度值產(chǎn)生的色彩。

  灰度是描述灰度圖像最直接的特征。指的是黑白圖像中的像素點(diǎn)的深度,通常為0~255,黑色為0,白色為255,因此黑白圖像也稱灰度圖像[5]。0表示純黑色,255表示純白色,中間的顏色表示過渡色,即可以表示不同的灰度等級。

  cvtColor(const CvArr*src,CvArr*dst,int code)

  此函數(shù)為OpenCV里面的顏色空間轉(zhuǎn)換函數(shù),可以實(shí)現(xiàn)RGB向HSV和HIS等顏色空間轉(zhuǎn)換,當(dāng)然也可以轉(zhuǎn)換為灰度圖像。

  cvtColor()函數(shù)的參數(shù)說明如下:

  第一個(gè)參數(shù)為原始圖像src,輸入的8 bit、16 bit或32 bit單倍精度浮點(diǎn)數(shù)影像。

  第二個(gè)參數(shù)為目標(biāo)圖像dst,輸出的8 bit、16 bit或32 bit單倍精度浮點(diǎn)數(shù)影像。

  第三個(gè)參數(shù)為轉(zhuǎn)換模式,比如CV_BGR2GRAY表示彩色圖像轉(zhuǎn)化為灰度圖像。

  1.3 二值化

  二值圖像指只有兩個(gè)灰度級的圖像。它具有處理速度快、存儲空間小等優(yōu)點(diǎn),既保留了原始圖像的主要特征,也使圖像的信息量得到了極大壓縮,更重要的是在圖像經(jīng)過二值化后,可以進(jìn)一步進(jìn)行處理得到一些幾何特征及其他更重要的特征[6]。二值化也是圖像處理的一項(xiàng)基本技術(shù),是整個(gè)圖像處理過程的預(yù)處理階段,如果二值化過程中閾值取得不當(dāng)會丟失圖像的重要信息。二值化處理主要包括全局閾值法和局部閾值法。

  全局閾值法指的是整個(gè)二值化處理過程中只使用一個(gè)閾值T。它將圖像的每個(gè)像素值與其進(jìn)行比較,大于T則取前景色,否則為背景色。局部閾值法是根據(jù)像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值[7],例如若圖像光照不均勻、噪聲突發(fā)、背景灰度變換較大時(shí),采用局部閾值法,實(shí)現(xiàn)圖像的局部自適應(yīng)閾值[8]。

  cvThreshold(const CvArr*src,CvArr*dst,double threshold,double max_value,int threshold_type)

  cvThreshold是OpenCV的庫函數(shù),其典型應(yīng)用就是對灰度圖像進(jìn)行閾值操作從而得到二值圖像。

  cvThreshold()函數(shù)的參數(shù)說明如下:

  第一和第二個(gè)參數(shù)同cvtColor()。

  threshold:閾值。

  max_value:CV_THRESH_BINARY和CV_THRESH_BINARY_INV的最大值。

  threshold_type:閾值類型。

  threshold_type=CV_THRESH_BINARY

  若src(x,y)>threshold,則dst(x,y)=max_value;否則dst(x,y)=0。

  threshold_type=CV_THRESH_BINARY_INV

  若src(x,y)>threshold,則dst(x,y)=0;否則dst(x,y)=max_value。

  threshold_type=CV_THRESH_TRUNC

  若src(x,y)>threshold,則dst(x,y)=threshold;否則dst(x,y)=src(x,y)。

  threshold_type=CV_THRESH_TOZERO

  若src(x,y)>threshold,則dst(x,y)=src(x,y);否則dst(x,y)=0。

  threshold_type=CV_THRESH_TOZERO_INV

  若src(x,y)>threshold,則dst(x,y)=0;否則dst(x,y)=src(x,y)。

  1.4 邊緣檢測

  圖像的邊緣是指圖像局部區(qū)域亮度變化較大的部分,此區(qū)域的灰度值在很小的緩沖區(qū)內(nèi)可以變換到另一個(gè)相差較大的灰度值,圖像的邊緣包含了圖像的大部分信息[9],由此對圖像的邊緣檢測顯得尤為重要。

  Canny算法同拉普拉斯算法的不同之處在于在Canny算法中,首先在x,y方向求一階導(dǎo)數(shù),然后組成四個(gè)方向的導(dǎo)數(shù),這些方向?qū)?shù)達(dá)到局部最大值的點(diǎn)就是組成圖像邊緣的候選點(diǎn)[10]。顯然,此算法最大的一個(gè)優(yōu)點(diǎn)在于能將獨(dú)立邊的候選像素拼裝成輪廓,較高的亮度梯度比較有可能是邊緣,但是沒有一個(gè)確切的值來限定多大的亮度梯度是邊緣多大又不是,所以Canny使用了滯后閾值。滯后閾值需要兩個(gè)閾值,即上限閾值與下限閾值。如果一個(gè)像素的梯度大于上限閾值,則被認(rèn)為是邊緣像素,保留下來,若梯度低于下限閾值則被丟棄,介于二者之間,只有當(dāng)與其高于上限閾值的像素緊緊相連時(shí)才會被選中[11]。Canny推薦的上下限閾值比為2:1到3:1之間,此函數(shù)運(yùn)用時(shí)需要輸入的圖像為灰度圖像,輸出也為灰度圖,實(shí)際上為布爾圖像。

  cvCanny(const CvArr*img,CvArr*edges,double lowThresh,double highThresh,int apertureSize=3)

  小的閾值用來控制邊緣連接,大的閾值用來控制邊緣分割,apertureSize為內(nèi)核算子。主要分為四個(gè)步驟:

  (1)濾波。邊緣檢測基于導(dǎo)數(shù)計(jì)算,但受噪聲影響,所以去噪是很必要的。

 ?。?)增強(qiáng)。增強(qiáng)算法把鄰域中灰度變化突出的點(diǎn)顯現(xiàn)出來,通常通過計(jì)算梯度幅值完成。

 ?。?)檢測。最簡單的邊緣檢測是梯度幅值閾值判斷。

 ?。?)定位。精確確定邊緣位置。

  1.5 直線檢測

  霍夫變換是圖像處理中的一種特征提取方法。它經(jīng)過投票算法檢測具有特征形狀的物體,此過程是在一個(gè)參數(shù)空間中通過累計(jì)計(jì)算結(jié)果的局部最大值而得到符合該特定性狀的集合作為霍夫變換的結(jié)果。霍夫變換是一種在圖像中尋找直線、圓和其他簡單幾何形狀的方法,原始的霍夫變換是一種直線變換,簡單來說就是在二值圖像中尋找直線的一種相對較快的算法,變換后可以推廣到其他普通情況,而不僅僅是直線。它的基本理論是基于二值圖像中任何像素點(diǎn)都可能是一些候選直線集合的一部分[12],它有標(biāo)準(zhǔn)和累加概率霍夫變換兩種,只是參數(shù)不同。下面介紹標(biāo)準(zhǔn)霍夫變換:

  cvHoughLines(CvArr*img,lines,double rho,double theta,int threshold)

  經(jīng)典霍夫變換用來檢測直線,lines是一個(gè)向量,用來存放rho和theta,通過設(shè)定的閾值來確定返回的線段,大于該閾值則返回一條線段。

  1.6 設(shè)計(jì)算法

  經(jīng)過霍夫變換可以得到傳輸線與圖片上邊沿的夾角theta與rho(OpenCV中的圖像原點(diǎn)在左上頂點(diǎn)),接著就要計(jì)算出圖像的原點(diǎn)到高壓傳輸線的距離d,傳統(tǒng)意義上會先計(jì)算出傳輸線的直線方程,然后用公式點(diǎn)到直線的距離求得結(jié)果,但要分情況討論,因?yàn)閭鬏斁€與x抽(圖像的上邊沿)的夾角不確定,大致要分四種情況,顯然比較麻煩,也不利于進(jìn)行檢驗(yàn),最好的辦法是只用一種格式就把所有的情況都包括進(jìn)來,熟練運(yùn)用平面幾何的向量與復(fù)數(shù)之間的轉(zhuǎn)換來實(shí)現(xiàn)算法。

  假設(shè)下圖2的中心點(diǎn)像素坐標(biāo)為C(u0,v0),左邊灰色高壓傳輸線上有任意兩個(gè)像素點(diǎn)即P和Q,Q是距離P一個(gè)單位的像素點(diǎn),則P點(diǎn)坐標(biāo)可以表示為(ρcos_`E0`_DNE%H7451_B`}Q$UH.jpg, ρsin_`E0`_DNE%H7451_B`}Q$UH.jpg),那么Q點(diǎn)坐標(biāo)為((ρcos_`E0`_DNE%H7451_B`}Q$UH.jpg+iρsin_`E0`_DNE%H7451_B`}Q$UH.jpg),(-icos_`E0`_DNE%H7451_B`}Q$UH.jpg+sin_`E0`_DNE%H7451_B`}Q$UH.jpg)),有向線段CP、CQ分別用向量a、b表示,最后把復(fù)數(shù)轉(zhuǎn)換為向量表示,即:

  E~KSF8F(TN~VIXLAL$L4Q{Y.png

  1.7 顯示結(jié)果

002.jpg

  圖2是房屋圖片原圖,上面有兩根高壓傳輸線,左邊一根灰色的為舊傳輸線,右邊白色的為新傳輸線,圖3為圖2基礎(chǔ)上的二值化結(jié)果,圖4為圖3基礎(chǔ)上的房屋邊緣檢測結(jié)果圖,圖5是提取高壓傳輸線的邊緣圖,同時(shí)過濾掉了復(fù)雜的房屋背景,只顯示傳輸線的邊緣直線,圖6顯示了PC機(jī)的運(yùn)行結(jié)果,包括整個(gè)過程的處理時(shí)間,圖片中心像素點(diǎn)到每一根邊緣直線的距離以及該邊緣直線與x抽的夾角,從而順利地控制無人機(jī)的飛行航向,完成高壓傳輸線的檢測。

2 總結(jié)

  通過上面的方法可以初步得到預(yù)期的結(jié)果,但算法并不是很完善,還需要改進(jìn),比如在設(shè)定閾值方面可以進(jìn)一步做得更優(yōu)化,不用手動去調(diào)閾值,而是通過設(shè)置自動選取閾值來達(dá)到更好的預(yù)期結(jié)果。

參考文獻(xiàn)

  [1] 方玫,喻擎蒼,李華強(qiáng).C++Builder下基于OpenCV的數(shù)字圖像處理[J].計(jì)算機(jī)工程與設(shè)計(jì),2008(4):43-46.

  [2] 劉潔,馮貴玉,張汗靈.一種圖像處理和計(jì)算機(jī)視覺的開發(fā)工具[J].計(jì)算機(jī)仿真,2006(11):56-59.

  [3] 黎松,平西建,丁益洪.開放源代碼的計(jì)算機(jī)視覺類庫OpenCV的應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2005(8):38-40.

  [4] 陰法明.基于OpenCV的圖像處理[J].科技信息,2009(32):67-70.

  [5] 陳毅.基于灰度圖像和彩色圖像的瑕疵膠囊識別算法研究[D].武漢:武漢科技大學(xué),2014.

  [6] 馬超玉.光照不均勻條件下圖像增強(qiáng)算法研究[D].長春:長春理工大學(xué),2014.

  [7] 吳辰夏.二值化圖像特征及其應(yīng)用[D].杭州:浙江大學(xué),2013.

  [8] 李書茉.非均勻光照下文本圖像二值化方法的研究[D].秦皇島:燕山大學(xué),2012.

  [9] 林化武,王慶麟,陳心海.一種新的圖象邊緣檢測算法[J].山東工業(yè)大學(xué)學(xué)報(bào),1990(3):51-53.

  [10] CANNY J.A computational approach to edge detection[J]. IEEE Transactions on Pattern Analysis and Ma-chine Intelligence, 1986 (12):47-49.

  [11] Wang Zhiqian, JEZEKIEL B A. Detection and seg-mentation of generic shapes based on affine modeling energy eigenspace[J]. IEEE Transactions on Im-age Processing,2001(27):35-39.

  [12] 劉春閣.基于Hough變換的直線提取與匹配[D].沈陽:遼寧工程技術(shù)大學(xué),2009.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。