陶鏞澤,郭天太,胡佳成,吳曉康,王雅婷
(中國計量大學(xué)計量測試工程學(xué)院,杭州 310018)
隨著自動化行業(yè)的發(fā)展和人工智能的崛起,計算機視覺實驗教學(xué)成為高校理工科專業(yè)必不可缺的一部分,它對學(xué)生編程及創(chuàng)造能力的提高起著重要的作用。在實際中,計算機視覺實驗資源無序分布、多元異構(gòu)、沒有統(tǒng)一標(biāo)準(zhǔn)的特點使實驗抽象難懂,不利于達到預(yù)期的教學(xué)效果[1]。如果單純從數(shù)字圖像處理角度出發(fā)優(yōu)化實驗內(nèi)容,很難提高學(xué)生的興趣、調(diào)動學(xué)生的積極性,可以說是治標(biāo)而不治本。
隨著虛擬現(xiàn)實技術(shù)的發(fā)展,在教育領(lǐng)域,利用虛擬現(xiàn)實技術(shù)可降低實驗器材所需的成本,并將教學(xué)過程與多媒體技術(shù)相融合,創(chuàng)造出動靜結(jié)合的三維環(huán)境[2],甚至在現(xiàn)實中危險性較大或難以實現(xiàn)的環(huán)境。虛擬實驗室的可移植性使學(xué)生不受時空限制,充分利用虛擬實驗軟件提供的便利,在自主學(xué)習(xí)中開拓思維[3],故虛擬實驗室被稱為“沒有圍墻的實驗室”[4]。
目前,虛擬實驗室在醫(yī)學(xué)圖像處理方面的應(yīng)用較為成熟。研發(fā)人員開發(fā)了基于VTK和ITK的VolView系統(tǒng)[5],建立了虛擬仿真實驗教學(xué)中心,以實現(xiàn)醫(yī)學(xué)圖像濾波、分割和三維可視化等功能[6],模擬真實工業(yè)環(huán)境,對機械零件和電子元件進行檢測[7]。通過在LabVIEW中嵌入Matlab 圖像處理程序[8]的方式建立計算機視覺虛擬實驗室。由于此類仿真的動態(tài)效果往往不及靜態(tài)效果,故有的高校開發(fā)了基于Unity3D 和3ds max的計算機視覺虛擬實驗室,創(chuàng)建可漫游的虛擬環(huán)境。
由于目前計算機視覺實驗側(cè)重于利用計算機對圖像進行處理,對計算機視覺中的“視覺”的關(guān)注度不及前者,提出了基于OpenCV 和OpenGL 的計算機視覺虛擬實驗室。其使用流程如圖1 所示,學(xué)生在圖形用戶界面中發(fā)出指令,進入虛擬環(huán)境,以虛擬相機的視角在虛擬環(huán)境中移動,獲取圖像,并通過數(shù)字圖像處理程序得到實驗結(jié)果,最后將其保存。

圖1 計算機視覺虛擬實驗室操作流程
計算機視覺虛擬實驗室開發(fā)包括5 個步驟:虛擬環(huán)境的創(chuàng)建、數(shù)字圖像處理模塊的設(shè)計、圖形用戶界面的開發(fā)、模塊聯(lián)立和系統(tǒng)測試。開發(fā)的虛擬實驗室結(jié)構(gòu)圖如圖2所示,其中,虛擬環(huán)境、圖形用戶界面和數(shù)字圖像處理模塊構(gòu)成了該實驗室的3 大組成模塊,與其對應(yīng)的第3 方庫分別為OpenGL、Qt 和OpenCV,開發(fā)環(huán)境為Pycharm+Anaconda。

圖2 計算機視覺虛擬實驗室結(jié)構(gòu)圖
虛擬環(huán)境創(chuàng)建的重點在于理解相機是如何實現(xiàn)人的雙目功能以及如何將真實相機轉(zhuǎn)換為虛擬相機。利用OpenGL對3D模型創(chuàng)建和渲染,將虛擬場景轉(zhuǎn)化為虛擬相機里的三維世界,再將虛擬相機里的三維世界轉(zhuǎn)化為平面圖形。
計算機視覺就是讓機器跟人一樣,通過視覺獲取信息,感知外部場景,此處的機器可以理解為相機。對于計算機視覺虛擬實驗室而言,相機和相機觀察到的事物都是虛擬的,即利用OpenGL 創(chuàng)建虛擬相機和虛擬場景,以模擬真實相機觀察外界事物,達到逼真的效果。在虛擬環(huán)境中,虛擬場景保持靜止;虛擬相機不斷運動,通過鼠標(biāo)/鍵盤控制虛擬相機,實現(xiàn)移動、旋轉(zhuǎn)和鏡頭縮放等功能。
OpenGL是開源的圖形庫,用戶可通過OpenGL創(chuàng)建交互式程序產(chǎn)生運動的三維圖形對象,如使用計算機圖形學(xué)技術(shù)產(chǎn)生真實圖像,或通過虛構(gòu)的方式產(chǎn)生虛擬圖像[9]。同時,OpenGL 允許用戶直接使用現(xiàn)有模型,較為有效地節(jié)省了建模時間[10]。
OpenGL具有豐富的圖形加工功能,能實現(xiàn)模型繪制、顏色模式指定、光照、圖像效果增強、紋理映射、實時動畫及人機交互。OpenGL 被廣泛應(yīng)用于工業(yè)、建筑等領(lǐng)域的靜態(tài)和動態(tài)仿真。
相機生成圖像時,將穿過鏡頭的光線投射到圖像傳感器上來捕捉場景,使三維場景投影到二維平面上。場景和它的圖像之間以及同一場景的不同圖像之間都有著重要的關(guān)聯(lián)。
如圖3 所示,光線從被攝場景發(fā)出后穿過前置孔徑,被相機捕獲,捕獲到的光線觸發(fā)相機后面的成像平面(即圖像傳感器)。

圖3 相機成像原理圖
在圖3 中:do為透鏡到被攝物體的距離;di為透鏡到成像平面的距離;f 為透鏡焦距。這些數(shù)據(jù)的關(guān)系就是透鏡成像公式:

因為大多數(shù)情況下do?di,故可通過成像平面處于焦點位置來簡化這一相機模型。根據(jù)成像原理,成像平面上的圖像是反轉(zhuǎn)的。因此,只要把成像平面放在鏡頭前面,就能得到跟原來幾乎一樣但未反轉(zhuǎn)的圖像。該簡化模型即為針孔照相機模型,如圖4 所示。

圖4 針孔照相機模型
圖中:ho為物體高度;hi為圖像高度;do為物體到相機的距離。由該模型和相似三角形的性質(zhì),可得出表示場景和圖像關(guān)系的投影方程:

式(2)表明:hi與do成反比,這個關(guān)系決定了三維坐標(biāo)在成像平面上的投影位置。若坐標(biāo)系位于透鏡焦點上,則點(X,Y,Z)處的三維坐標(biāo)在成像平面的投影點(x,y)=(fX/Z,fY/Z)。Z 方向的值取決于點的深度,即式(2)中的do。引入齊次坐標(biāo)后,上述關(guān)系可用矩陣表示(即二維坐標(biāo)用3 個向量表示,三維坐標(biāo)用4 個向量表示):

式中:s為可任意縮放的因子;3 ×4 矩陣為投影矩陣。若坐標(biāo)系未與焦點對齊,則需引入旋轉(zhuǎn)量r 和偏移量t。引入后即可把被投影的三維點表示為一個以相機為中心的坐標(biāo)系:

式(4)中的3 ×3 矩陣中含有相機焦距等內(nèi)部參量,3 ×4 矩陣中含有相機位置等外部參量,即相機與外部環(huán)境相關(guān)的參量。
在同一設(shè)備上安裝兩臺相機,讓它們觀察同一場景,并且二者間有固定的基線(相機中心點的連線),就構(gòu)成了一個立體視覺裝置,如圖5 所示。

圖5 兩臺相機觀察同一個場景
沿三維坐標(biāo)X和相機中心點的連線,可在成像平面上得到對應(yīng)坐標(biāo)x。為從成像平面中的坐標(biāo)找到另一個成像平面中的對應(yīng)坐標(biāo),需對第2 個成像平面上虛線的投影進行搜索,虛線的投影即x的對極線。
在雙目系統(tǒng)幾何形狀中,所有對極線的公共點即為極點。極點是一個相機中心點在另一個相機上的投影(圖5 中的e和e′)。
記點x的坐標(biāo)為(x,y),X在另一成像平面的對應(yīng)坐標(biāo)為(x′,y′)。成像平面上的坐標(biāo)和其對極線之間的關(guān)系,可以用3 ×3 矩陣F表示:

式(5)中的l′1、l′2和l′3滿足約束條件:

因為式(6)為x 的對極線方程,且二維直線可由三維向量表示,故式(5)中的F 相當(dāng)于把一個視圖上的坐標(biāo)映射到另一個視圖上的對極線上。當(dāng)F 確定后,由兩個成像平面上的坐標(biāo)可得三維坐標(biāo)的深度。
虛擬圖形加工使圖形在視覺上呈現(xiàn)立體化,產(chǎn)生逼真的效果,包括正方體貼圖和光照渲染等環(huán)節(jié)。
正方體貼圖等價于對紋理對象投影,如同“木板”將紋理對象包圍,最終在視覺上形成“木箱”,如圖6(a)、(b)所示。

圖6 木箱的“2D”和“3D”圖形
根據(jù)光照和反射原理,分別如圖7(a)、(b)所示,對“木板”和“木箱”進行光照渲染。

圖7 光照渲染后的“木箱”和“木板”
用戶通過鍵盤控制虛擬相機平移,更新相機位置。平移前后效果分別如圖8(a)、(b)所示。

圖8 相機平移前后的效果圖
用戶通過鼠標(biāo)按鍵控制虛擬相機自由旋轉(zhuǎn),更新相機視角。旋轉(zhuǎn)前后的效果分別如圖9(a)、(b)所示。

圖9 相機旋轉(zhuǎn)前后的效果圖
用戶通過鼠標(biāo)滾輪控制虛擬相機鏡頭縮放,改變虛擬場景在相機中所成像的大小。縮放前后的效果分別如圖10(a)、(b)所示。

圖10 相機鏡頭縮放前后的效果
本章將設(shè)計合理的實驗內(nèi)容,完成圖像處理程序的編寫。在設(shè)計實驗內(nèi)容時,結(jié)合學(xué)校實際教學(xué)情況,并充分考慮學(xué)生的能力差異。在進行數(shù)字圖像處理時,主要調(diào)用OpenCV庫,結(jié)合輸入圖像的特點完成程序設(shè)計,達到實驗預(yù)期的效果。
數(shù)字圖像處理的定義是通過計算機來處理數(shù)字圖像,其過程可大致分為圖像預(yù)處理和特征提取兩個環(huán)節(jié)。其中,圖像預(yù)處理是特征提取的基礎(chǔ),對特征提取的質(zhì)量和圖像分析的結(jié)果有很大的影響。
OpenCV是一個開源的計算機視覺庫。1999 年,Gary Bradski對其啟動研發(fā)工作。OpenCV庫涵蓋計算機視覺各個領(lǐng)域,兼容多種操作系統(tǒng)。它旨在提供一個簡潔而高效的接口,幫助開發(fā)人員快速構(gòu)建視覺應(yīng)用[11]。
OpenCV庫擁有豐富的資源,如opencv_features2d用于興趣點檢測、描述和匹配;opencv_calib3d 用于相機標(biāo)定、和立體視覺[12]等。OpenCV 在計算機視覺研發(fā)人員中很流行,被用作主要開發(fā)工具[13]。
在計算機視覺教學(xué)中,側(cè)重點在于圖像預(yù)處理環(huán)節(jié)。為了適應(yīng)課堂教學(xué),在設(shè)計實驗內(nèi)容時,以圖像預(yù)處理為主,同時補充少量特征提取實驗結(jié)果。圖像預(yù)處理內(nèi)容分為顏色空間轉(zhuǎn)換、幾何變換、形態(tài)學(xué)轉(zhuǎn)換、直方圖、傅里葉變換、圖像濾波、自適應(yīng)閾值處理和Canny邊緣檢測等部分;特征提取內(nèi)容為Harris 角點檢測。
在數(shù)字圖像處理中,為減少計算機運算時間并使結(jié)果不受自然光照的影響,將彩色圖像轉(zhuǎn)換為灰度圖像,如圖11 所示。

圖11 彩色圖像轉(zhuǎn)換為灰度圖像
RGB 是一種被廣泛接受的顏色空間,也是一種在電子成像系統(tǒng)中采集和顯示顏色的有效方法,但它并不直觀,也不符合人對于顏色的感知方式。為直觀地描述顏色,可采用HSV顏色空間,即色調(diào)、飽和度和亮度。原始圖像的HSV圖像如圖12 所示。

圖12 彩色圖像轉(zhuǎn)換為HSV圖像
幾何變換是將一幅圖像映射到另外一幅圖像的操作,可視為矩陣的線性變換。OpenCV 提供了多個與映射相關(guān)的函數(shù),這些函數(shù)使用起來方便靈活,能快速完成圖像的映射。如圖13、14 所示,分別為對圖像進行仿射變換和透視變換后的效果圖。

圖13 映射變換效果圖

圖14 透視變換效果圖
形態(tài)學(xué)用于分析和處理離散圖像,從圖像內(nèi)提取描述圖像形狀的分量信息,通常是理解圖像時使用的本質(zhì)形狀特征。形態(tài)學(xué)定義了一系列運算,用預(yù)先定義的形狀元素探測圖像,實現(xiàn)圖像的轉(zhuǎn)換。形狀元素與像素領(lǐng)域的相交方式?jīng)Q定了運算的結(jié)果。如圖15、16 所示,分別為對圖像進行腐蝕操作和膨脹操作后的效果圖。

圖15 腐蝕操作效果圖

圖16 膨脹操作效果圖
直方圖是數(shù)字圖像處理中典型的分析方法,從圖像灰度級的角度對圖像進行描述,包含豐富而重要的信息。從直方圖的角度對圖像進行處理,可達到增強圖像顯示效果的目的。在數(shù)字圖像處理中,一般會統(tǒng)計一幅圖像中具有某個值的像素的數(shù)量,產(chǎn)生一個簡單的圖標(biāo),如圖17 所示。

圖17 灰度圖像的直方圖
直方圖均衡化通過均衡所有像素強度值的使用頻率讓圖像的直方圖盡可能地平穩(wěn),改善圖像對比度,提高圖像質(zhì)量,如圖18 所示。

圖18 直方圖均衡化后的灰度圖像
圖像平滑是在保留圖像原有信息的情況下,過濾掉圖像的噪聲。5 ×5 中值濾波獲得5 ×5 結(jié)果像素鄰域內(nèi)像素值的中位數(shù),其效果如圖19 所示。

圖19 中值濾波效果圖
傅里葉變換將圖像從時域轉(zhuǎn)換到頻域,如圖20 所示,高亮度區(qū)域表示低頻分量,低亮度區(qū)域表示高頻分量。對頻域圖像高通濾波可去除低頻分量,保留高頻分量,最后由逆傅里葉變換得到二值圖像,如圖21 所示。結(jié)果表明:高通濾波能對圖像進行邊緣檢測。

圖20 傅里葉變換后的頻域圖像

圖21 逆傅里葉變換后的二值圖像
當(dāng)圖像色彩不均衡時,使用某個確定閾值的閾值化處理很難得到令人滿意的閾值處理結(jié)果,采用自適應(yīng)閾值處理,處理后的效果如圖22 所示。結(jié)果表明:自適應(yīng)閾值處理能對圖像進行邊緣檢測。

圖22 自適應(yīng)閾值處理效果圖
Canny邊緣檢測能有效消除檢測結(jié)果中邊緣厚度過大的問題,并且檢測到重要邊緣,排除無關(guān)邊緣。Canny邊緣檢測分為去噪、計算梯度、非極大值抑制和確定邊緣4 個步驟,效果如圖23 所示。

圖23 Canny邊緣檢測效果圖
在提取圖像的局部特征時,可選擇角點作為局部特征。角點很容易被精確地檢測到。Harris角點檢測將灰度圖像轉(zhuǎn)換為浮點數(shù)型輸出圖像,輸出圖像中的每個像素值表示角點強度。之后對輸出圖像閾值處理,獲得角點,如圖24 所示。

圖24 Harris角點檢測效果圖
圖形用戶界面的開發(fā)主要調(diào)用Qt,在設(shè)計上應(yīng)滿足人性化、易于上手等條件,并充分考慮用戶的特點和實驗教學(xué)的需要。
Qt是GUI設(shè)計類庫和可視化應(yīng)用程序開發(fā)類庫,它提供了設(shè)計現(xiàn)代GUI 和開發(fā)應(yīng)用程序的API。Qt由許多模塊組成,如Qt Charts 用于二維圖表顯示;Qt Data Visualization 用于數(shù)據(jù)三維顯示等[14]。Qt 在國防、移動設(shè)備、后端管理系統(tǒng)等領(lǐng)域廣泛應(yīng)用[15]。
初始化后圖形用戶界面將顯示文本框,如圖25 所示。文本框顯示和圖像顯示之間的切換通過交替調(diào)用setParent函數(shù)和addWidget函數(shù)實現(xiàn)。

圖25 初始化的圖形用戶界面
在圖形用戶界面中,第1 行的按鍵實現(xiàn)基礎(chǔ)功能,點擊“原始圖像”將實驗結(jié)果與輸入圖像進行對比;點擊“保存圖像”按鍵保存實驗結(jié)果,如圖26 所示。第2~5 行的按鍵用于數(shù)字圖像處理。在第6 行的按鍵中,點擊“使用說明”獲取軟件使用說明書;點擊“數(shù)字圖像處理程序”查看實現(xiàn)代碼和原理。

圖26 保存圖像
程序的編譯環(huán)境使用Pycharm,并選用Anaconda作為Python語言,以調(diào)用各種第3 方庫。在開發(fā)圖形用戶界面時,采用clicked.connect 函數(shù)將按鍵與實現(xiàn)功能的函數(shù)連接。從圖形用戶界面進入虛擬環(huán)境時,采用subprocess.run 函數(shù)啟動虛擬環(huán)境程序;從虛擬環(huán)境提取圖像時,使用glReadBuffer 函數(shù)和glReadPixels函數(shù)獲取虛擬環(huán)境的窗口信息。
由于不同第3 方庫采用的標(biāo)準(zhǔn)不同,如OpenCV對圖像采用BGR格式,OpenGL和Qt對圖像采用RGB格式;OpenCV 采用標(biāo)準(zhǔn)像素大小,OpenGL 和Qt 采用相對像素大小,因此,在編寫程序時,采取了必要的優(yōu)化,從而排除此類問題對最終效果的影響。
模塊聯(lián)立完成后,采用pyinstaller 打包工具將編寫好的.py文件轉(zhuǎn)化為.exe 文件,并將.exe 文件移植到多臺計算機上進行測試。在檢測.exe 文件是否能正常啟動時發(fā)現(xiàn),該軟件適用于64 bit Windows 操作系統(tǒng)。
測試過程中,計算機視覺虛擬實驗室運行過程流暢,在按下按鍵時均能迅速生成相應(yīng)結(jié)果,不會因為點擊按鍵頻率過高而導(dǎo)致程序崩潰。為獲得數(shù)字圖像處理程序執(zhí)行時間,在代碼中使用getTickCount 函數(shù)進行測試,測試結(jié)果見表1。

表1 數(shù)字圖像處理程序執(zhí)行時間測試結(jié)果
表1 結(jié)果表明:數(shù)字圖像處理程序執(zhí)行速度較快,處于ms 量級。當(dāng)執(zhí)行時間小于100ms 時,用戶會認(rèn)為顯示實驗結(jié)果和按下按鍵是同時發(fā)生的。但是,第7、9、10 組的實驗執(zhí)行時間均超過100ms,相比于其他組而言慢了很多,原因是這3 組實驗的程序中調(diào)用了matplotlib,在圖片格式轉(zhuǎn)換上較為復(fù)雜。
因此,該計算機視覺虛擬實驗室可以投入到實際教學(xué)中,滿足目前計算機視覺實驗教學(xué)需求。
本文結(jié)合虛擬現(xiàn)實技術(shù)和計算機視覺技術(shù),進行了基于OpenCV和OpenGL的計算機視覺虛擬實驗室的開發(fā)。計算機視覺虛擬實驗室建立后,學(xué)生可以不受臺套數(shù)和時空的限制,隨時、多次、全方位地進行計算機視覺實驗,深刻理解計算機視覺的內(nèi)涵,掌握數(shù)字圖像處理的過程和原理;教師則可以通過這一渠道降低計算機視覺實驗的教學(xué)難度,讓學(xué)生輕松地學(xué)習(xí)計算機視覺,把原來乏味的實驗變得生動有趣,從而改善課堂氛圍。