凃 洋,劉春晶,曹文洪,王向東
(中國(guó)水利水電科學(xué)研究院,北京 100048)
基于OpenCV實(shí)現(xiàn)金字塔光流法對(duì)表面流場(chǎng)的計(jì)算
凃 洋,劉春晶,曹文洪,王向東
(中國(guó)水利水電科學(xué)研究院,北京 100048)
本文基于OpenCV視覺函數(shù)庫和VisualStudio2010平臺(tái),采用C++編程語言開發(fā)了基于金字塔光流法的PTV(Particle Track Velocimetry)表面流場(chǎng)測(cè)量程序。程序計(jì)算結(jié)果顯示:基于金字塔光流法實(shí)現(xiàn)PTV技術(shù),需要在金字塔光流法對(duì)示蹤粒子角點(diǎn)跟蹤匹配的基礎(chǔ)上進(jìn)一步實(shí)現(xiàn)示蹤粒子的質(zhì)心匹配,該過程可使金字塔光流法準(zhǔn)確、合理地應(yīng)用于PTV技術(shù),實(shí)現(xiàn)對(duì)示蹤粒子運(yùn)動(dòng)速度的正確計(jì)算,同時(shí)還可剔除掉金字塔光流法對(duì)非匹配關(guān)系的角點(diǎn)產(chǎn)生的錯(cuò)誤匹配。
OpenCV;金字塔光流;PTV;角點(diǎn)匹配;質(zhì)心匹配
粒子跟蹤測(cè)速技術(shù)PTV(Particle Track Velocimetry)是表面流場(chǎng)測(cè)量的重要方法,其主要實(shí)現(xiàn)途徑是通過攝像機(jī)記錄帶有示蹤粒子運(yùn)動(dòng)的流場(chǎng)情況,再通過計(jì)算機(jī)程序?qū)崿F(xiàn)對(duì)視頻圖像中多個(gè)運(yùn)動(dòng)目標(biāo)的跟蹤與匹配,屬于計(jì)算機(jī)視覺與圖像處理技術(shù)在水利領(lǐng)域的應(yīng)用。在計(jì)算機(jī)視覺研究領(lǐng)域中,目標(biāo)跟蹤主要包括[1]基于匹配的目標(biāo)跟蹤算法(CamShift法、Kalman濾波法等)、基于運(yùn)動(dòng)檢測(cè)的目標(biāo)跟蹤算法(光流法)、基于對(duì)比度分析的目標(biāo)跟蹤算法(邊緣跟蹤法、重心跟蹤法等)等幾大類。其中光流法應(yīng)用廣泛、跟蹤效果較好,與其他方法相比,光流法又具備跟蹤多運(yùn)動(dòng)目標(biāo)的能力。與以往PTV跟蹤匹配算法不同(如最鄰近法、匹配幾率法、PCSS法等)[2],光流法是通過計(jì)算圖像像素信息的表觀的運(yùn)動(dòng)(運(yùn)動(dòng)目標(biāo)的像素運(yùn)動(dòng)速度)來實(shí)現(xiàn)對(duì)運(yùn)動(dòng)目標(biāo)的跟蹤。在光流算法中,以Horn-Schunck法[3]、Lucas-Kanade方法(L-K法)[4]及金字塔光流法Pyramid Lucas-Kanade方法(PyrLK法)[5]為典型代表。其中PyrLK法是目前應(yīng)用較廣的方法,屬于稀疏光流法,相較于其他兩種方法具有計(jì)算速度快、可應(yīng)用于大位移的目標(biāo)跟蹤計(jì)算[6]。因此將PyrLK法引入到PTV技術(shù),通過對(duì)圖像像素信息變化的檢測(cè)計(jì)算來實(shí)現(xiàn)對(duì)流場(chǎng)中示蹤粒子運(yùn)動(dòng)的跟蹤進(jìn)而實(shí)現(xiàn)流場(chǎng)速度的求解,這是一個(gè)全新的角度。然而,PyrLK法作為稀疏光流法,實(shí)現(xiàn)的是對(duì)示蹤粒子角點(diǎn)(特征點(diǎn))的跟蹤,事實(shí)上角點(diǎn)速度往往并不能準(zhǔn)確地代表示蹤粒子的運(yùn)動(dòng)速度,因此還需解決通過PyrLK法計(jì)算出示蹤粒子質(zhì)心的速度的問題。
基于視頻圖像的運(yùn)動(dòng)目標(biāo)識(shí)別與跟蹤,需要編寫計(jì)算機(jī)程序?qū)崿F(xiàn)。如果所有需要的底層算法和圖像處理函數(shù)都從頭編寫,則需要較大的工作量,且難以保證程序的魯棒性和通用性。OpenCV、Matlab等圖像處理開發(fā)平臺(tái)恰好可以解決上述問題,其作用正是可以為用戶提供函數(shù)庫以高效解決計(jì)算機(jī)視覺和圖像處理中的一些問題。但Matlab提供的計(jì)算函數(shù)在Matlab環(huán)境下的運(yùn)行速度較慢,將m文件轉(zhuǎn)化為C代碼后,C代碼的執(zhí)行效率和可讀性存在較大問題。因此本研究選擇OpenCV視覺庫作為開發(fā)平臺(tái),在VisualStudio2010開發(fā)環(huán)境下采用C++語言實(shí)現(xiàn)PyrLK法的PTV表面流場(chǎng)測(cè)量過程。
OpenCV(Open Source Computer Vision Library)由Intel公司開發(fā),是一款可以免費(fèi)下載、開源、跨平臺(tái)的視覺庫,實(shí)現(xiàn)了計(jì)算機(jī)視覺與圖像處理方面的很多通用算法,目前已在特征檢測(cè)與跟蹤、目標(biāo)識(shí)別、目標(biāo)運(yùn)動(dòng)分析及3D重建等方面得到了廣泛應(yīng)用。OpenCV視覺庫有以下特點(diǎn):可跨平臺(tái),不依賴于操作系統(tǒng)和硬件環(huán)境,可以運(yùn)行于Linux、W indows和Mac OS操作系統(tǒng);輕量級(jí)且高效,由一系列C函數(shù)和少量C++類構(gòu)成,同時(shí)Intel公司在OpenCV庫函數(shù)的設(shè)計(jì)和匯編方面針對(duì)英特爾處理器做了相應(yīng)優(yōu)化;可擴(kuò)展性好,接口主要為C++語言,但也同時(shí)保留了C語言接口,此外還有大量的Python、Java、Matlab等的接口。與我們所熟悉的計(jì)算機(jī)視覺與圖像處理的工具M(jìn)atlab相比,OpenCV有以下優(yōu)越性[7]。
表1 計(jì)算機(jī)視覺與圖像處理工具特性
程序的目的是根據(jù)拍攝的流場(chǎng)中示蹤粒子運(yùn)動(dòng)的連續(xù)圖像,通過光流計(jì)算獲得表面流場(chǎng)。整個(gè)目的的實(shí)現(xiàn)需要依次完成3個(gè)模塊:文件導(dǎo)入,攝像機(jī)標(biāo)定,流場(chǎng)計(jì)算,見圖1。即導(dǎo)入圖像文件后,需要對(duì)圖像進(jìn)行圖像畸變校正以及攝像機(jī)標(biāo)定,以校正后的圖像作為流場(chǎng)計(jì)算的圖像輸入從而得到示蹤粒子的像素位移,再通過攝像機(jī)標(biāo)定所得到的圖像與三維空間中的物體之間的轉(zhuǎn)化參數(shù)將像素位移轉(zhuǎn)化成實(shí)際位移,進(jìn)而得到流場(chǎng)中的示蹤粒子運(yùn)動(dòng)速度。每個(gè)模塊的開發(fā)均以O(shè)penCV視覺庫作為開發(fā)平臺(tái),在實(shí)現(xiàn)具體功能時(shí)直接調(diào)用平臺(tái)內(nèi)函數(shù)。本研究將詳細(xì)介紹各模塊的實(shí)現(xiàn)過程與實(shí)現(xiàn)過程中所調(diào)用的平臺(tái)函數(shù),并在各模塊的關(guān)鍵部分輔以真實(shí)實(shí)驗(yàn)圖片的相應(yīng)計(jì)算結(jié)果用以分析和檢驗(yàn),選取的兩幀圖像見圖2。
圖1 程序流程圖
圖2 原始圖像
3.1 文件導(dǎo)入 通常情況下,在圖像文件的計(jì)算中有兩種需求:一種是從含有整個(gè)流場(chǎng)過程的圖像中選擇特定圖像進(jìn)行計(jì)算以觀察結(jié)果和分析;一種是針對(duì)含有整個(gè)流場(chǎng)的所有圖像進(jìn)行前后兩幀的連續(xù)計(jì)算。因此,根據(jù)兩種不同的需要設(shè)置了兩種不同的文件導(dǎo)入方式,即打開文件與打開文件夾。打開文件可實(shí)現(xiàn)特定圖像文件的手動(dòng)輸入,打開文件夾可實(shí)現(xiàn)一個(gè)文件夾的所有圖像文件的自動(dòng)輸入。
3.2 攝像機(jī)標(biāo)定 由于透鏡的結(jié)構(gòu)特點(diǎn),攝像機(jī)在成像過程中會(huì)產(chǎn)生畸變。此外,為了將圖像中的像素位移轉(zhuǎn)化成世界坐標(biāo)系下的實(shí)際物體位移,需要計(jì)算出相機(jī)坐標(biāo)系與世界坐標(biāo)系之間的轉(zhuǎn)化參數(shù)。本文基于OpenCV平臺(tái)函數(shù)庫采用張正友標(biāo)定法對(duì)攝像機(jī)進(jìn)行標(biāo)定[8],通過張正友標(biāo)定法計(jì)算出攝像機(jī)的內(nèi)部參數(shù)(包括圖像中心、焦距、鏡頭畸變等)和外部參數(shù)(即相對(duì)于世界坐標(biāo)系的攝像機(jī)坐標(biāo)的三維位置和方向),進(jìn)而可以根據(jù)其內(nèi)部參數(shù)和外部參數(shù)對(duì)拍攝出的圖像進(jìn)行攝像機(jī)標(biāo)定與圖像畸變校正。校正后圖像見圖3。
圖3 校正后圖像
攝像機(jī)標(biāo)定部分基于OpenCV平臺(tái)的實(shí)現(xiàn)步驟如下:(1)采用想要進(jìn)行標(biāo)定的攝像機(jī),從不同角度對(duì)黑白格標(biāo)定板進(jìn)行拍攝。為保證計(jì)算精度,應(yīng)至少拍攝10張圖像,用于作為標(biāo)定模板圖像。(2)采用im read函數(shù)循環(huán)讀入每一張標(biāo)定模板圖像,并采用findChessboardCorners函數(shù)對(duì)標(biāo)定模板圖像上的角點(diǎn)進(jìn)行檢測(cè),獲取角點(diǎn)在圖像像素坐標(biāo)系中的像素坐標(biāo);為提高角點(diǎn)坐標(biāo)的精度,采用corner-SubPix函數(shù)進(jìn)一步計(jì)算各角點(diǎn)的亞像素坐標(biāo),然后存入Point2f類型的二維動(dòng)態(tài)數(shù)組中。(3)可選擇采用drawChessboardCorners函數(shù)在圖像中將識(shí)別出來的角點(diǎn)進(jìn)行繪制,并采用imshow函數(shù)展示。該步為可選步驟。(4)以黑白格標(biāo)定板中左上角第一個(gè)角點(diǎn)位置為坐標(biāo)系的原點(diǎn),沿水平向右為x軸,豎直向下為y軸建立世界坐標(biāo)系,并計(jì)算出各角點(diǎn)在世界坐標(biāo)系中的坐標(biāo),并存入Point3f類型的二維動(dòng)態(tài)數(shù)組中。(5)將角點(diǎn)在世界坐標(biāo)系中的坐標(biāo)數(shù)組和在圖像像素坐標(biāo)系的坐標(biāo)數(shù)組代入calibrateCamera函數(shù),求出攝像機(jī)的內(nèi)部參數(shù)和外部參數(shù)。(6)將計(jì)算獲得的內(nèi)部參數(shù)和需要進(jìn)行校正的圖像代入undistort函數(shù)中,即可實(shí)現(xiàn)圖像的畸變校正。(7)可選擇將計(jì)算獲得的內(nèi)部參數(shù)存入xm l或ym l格式的文件中,以便于下次進(jìn)行圖像畸變校正時(shí)直接使用。
3.3 流場(chǎng)計(jì)算 PyrLK法屬于稀疏光流法,需要在計(jì)算前提取出圖像中的角點(diǎn)(包含示蹤粒子角點(diǎn))作為PyrLK法的計(jì)算輸入,可實(shí)現(xiàn)對(duì)示蹤粒子的角點(diǎn)跟蹤。本研究選用Shi-Tomasi方法提取角點(diǎn)[9]。以圖像校正后的實(shí)驗(yàn)圖像作為PyrLK法的輸入,其對(duì)示蹤粒子位移矢量的計(jì)算結(jié)果見圖4,示蹤粒子位移區(qū)間設(shè)為[1~30]pix,金字塔層數(shù)為3層,計(jì)算窗口為5×5(pix)。圖4的結(jié)果顯示該方法對(duì)示蹤粒子的角點(diǎn)均可以實(shí)現(xiàn)正確的跟蹤匹配。但由于示蹤粒子各角點(diǎn)位置處在流場(chǎng)中的流速不完全相同,相同的角點(diǎn)在前后兩幀圖像中的像素信息也會(huì)產(chǎn)生變化。因此角點(diǎn)的位移并不等于整個(gè)示蹤粒子的實(shí)際位移,只有通過示蹤粒子質(zhì)心位移計(jì)算出的速度才是該示蹤粒子所在流場(chǎng)的真實(shí)速度,因此需要將示蹤粒子的角點(diǎn)匹配轉(zhuǎn)化為示蹤粒子的質(zhì)心匹配。
本文實(shí)現(xiàn)示蹤粒子角點(diǎn)匹配向示蹤粒子質(zhì)心匹配的具體方法是:對(duì)圖像進(jìn)行二值化并提取出示蹤粒子輪廓;確定每個(gè)被匹配的角點(diǎn)所屬的示蹤粒子輪廓;計(jì)算示蹤粒子輪廓的質(zhì)心;示蹤粒子的質(zhì)心匹配。該過程實(shí)現(xiàn)后的示蹤粒子像素位移矢量圖見圖5,圖像二值化分割閾值為130,其余計(jì)算參數(shù)與PyrLK法計(jì)算時(shí)選用的參數(shù)一致。圖5的結(jié)果顯示,該方法可成功完成示蹤粒子角點(diǎn)匹配向示蹤粒子質(zhì)心匹配的轉(zhuǎn)化,進(jìn)而實(shí)現(xiàn)對(duì)示蹤粒子位移的正確計(jì)算。圖4與圖5中選取同一個(gè)粒子(圖4中方形標(biāo)識(shí)),并對(duì)其角點(diǎn)像素位移與質(zhì)心像素位移進(jìn)行分析,可發(fā)現(xiàn)同一示蹤粒子的角點(diǎn)的像素位移與質(zhì)心像素位移并不一致,進(jìn)一步說明角點(diǎn)位移求出的示蹤粒子運(yùn)動(dòng)速度并不能代表示蹤粒子的真實(shí)運(yùn)動(dòng)速度,見表2。
表2 同一示蹤粒的角點(diǎn)像素位移與質(zhì)心像素位移
圖4 PyrLK法示蹤粒子位移矢量圖
圖5 角點(diǎn)匹配向質(zhì)心匹配轉(zhuǎn)化后的示蹤粒子位移矢量圖
從圖4及圖5的計(jì)算結(jié)果可看出,除示蹤粒子外,有部分的錯(cuò)誤匹配(見圖4及圖5中的橢圓形標(biāo)識(shí))。其原因是由于光照變化和圖像噪聲等問題,使一些實(shí)際靜止的圖像區(qū)域的角點(diǎn)出現(xiàn)了位移(這些產(chǎn)生了位移的角點(diǎn)并無匹配關(guān)系),并且計(jì)算值對(duì)應(yīng)的前后兩幀角點(diǎn)查找到的所屬輪廓的質(zhì)心位置也出現(xiàn)了差別,從而產(chǎn)生錯(cuò)誤計(jì)算。將圖4與圖5中的非示蹤粒子錯(cuò)誤匹配結(jié)果進(jìn)行對(duì)比可發(fā)現(xiàn):PyrLK“角點(diǎn)-質(zhì)心”法的對(duì)非示蹤粒子的錯(cuò)誤匹配要明顯少于PyrLK法。這是由于除示蹤粒子以外的圖像一般靜止不變的,因此在兩幀圖像二值化后所提取出的非示蹤粒子的輪廓是靜止不變的。在PyrLK“角點(diǎn)-質(zhì)心”法的角點(diǎn)匹配轉(zhuǎn)化為質(zhì)心匹配的過程中,大部分沒有匹配關(guān)系卻產(chǎn)生匹配的角點(diǎn)被轉(zhuǎn)化為同一個(gè)輪廓的同一質(zhì)心,這時(shí)轉(zhuǎn)化后的位移計(jì)算值為0??梢娊屈c(diǎn)匹配向質(zhì)心匹配的過程轉(zhuǎn)化可自動(dòng)剔除掉PyrLK法對(duì)非匹配關(guān)系的角點(diǎn)產(chǎn)生的部分錯(cuò)誤匹配。
流場(chǎng)計(jì)算部分基于OpenCV平臺(tái)的實(shí)現(xiàn)過程如下:(1)首先依據(jù)Shi-Tomasi方法,采用goodFeaturesTo Track函數(shù)提取出圖像中的角點(diǎn),這些角點(diǎn)一般位于示蹤粒子的邊緣;(2)采用cornerSubPix函數(shù)進(jìn)一步計(jì)算各角點(diǎn)的亞像素坐標(biāo),以提高角點(diǎn)坐標(biāo)的精度;(3)依據(jù)PyrLK法,采用calcOptical-FlowPyrLK函數(shù)對(duì)示蹤粒子角點(diǎn)進(jìn)行跟蹤;(4)完成示蹤粒子角點(diǎn)跟蹤之后,開始進(jìn)一步實(shí)現(xiàn)示蹤粒子的質(zhì)心匹配:①采用cvThreshold函數(shù)對(duì)圖像進(jìn)行二值化分割處理;②采用cvFindContours函數(shù)提取出圖像中所有示蹤粒子的輪廓;③依據(jù)幾何矩法采用cvMoments和cvGetSpatialMoment函數(shù)計(jì)算出粒子輪廓的質(zhì)心;④采用cvPointPolygonTest函數(shù),循環(huán)判斷任一被跟蹤的角點(diǎn)和所有輪廓之間的位置關(guān)系,找到該角點(diǎn)所屬的輪廓(即與該角點(diǎn)位置最近的輪廓),即可找到各粒子角點(diǎn)所對(duì)應(yīng)的粒子質(zhì)心,進(jìn)而實(shí)現(xiàn)角點(diǎn)跟蹤到質(zhì)心匹配的轉(zhuǎn)化,通過匹配質(zhì)心的像素坐標(biāo)可計(jì)算出質(zhì)心位移,從而獲得示蹤粒子的運(yùn)動(dòng)速度(見圖6)。
圖6 表面流場(chǎng)計(jì)算實(shí)現(xiàn)過程
采用PyrLK法對(duì)示蹤粒子進(jìn)行跟蹤,并在此基礎(chǔ)上提取有匹配關(guān)系粒子的質(zhì)心進(jìn)行匹配,這種角點(diǎn)匹配向質(zhì)心匹配轉(zhuǎn)化的處理過程不僅可實(shí)現(xiàn)對(duì)示蹤粒子運(yùn)動(dòng)速度的正確計(jì)算,還可剔除掉部分PyrLK法對(duì)非匹配關(guān)系的角點(diǎn)產(chǎn)生的錯(cuò)誤匹配,使光流理論能夠合理、準(zhǔn)確地應(yīng)用于PTV技術(shù)。
以O(shè)penCV視覺函數(shù)庫為基礎(chǔ),在VisualStudio2010開發(fā)環(huán)境下采用C++語言實(shí)現(xiàn)PyrLK對(duì)示蹤粒子的跟蹤匹配和表面流場(chǎng)計(jì)算,程序運(yùn)行穩(wěn)定,滿足計(jì)算要求。通過對(duì)OpenCV庫函數(shù)的調(diào)用,減少了程序開發(fā)的工作量,提高了工作效率。采用OpenCV和C++的混合開發(fā)模式進(jìn)行開發(fā)環(huán)境的配置較為簡(jiǎn)便,并具有較高的運(yùn)算速度,是計(jì)算機(jī)視覺與圖像處理方面程序開發(fā)的一個(gè)很好選擇。
[1] 蔡榮太,吳元昊,王明佳,等.視頻目標(biāo)跟蹤算法綜述[J].電視技術(shù),2010,34:135-138.
[2] 胡濤.PTV匹配算法的對(duì)比分析[D].北京:清華大學(xué),2010.
[3] Horn B K,Schunck BG.Determining optical flow[J].Artificial Intelligence,1981,17(81):185-203.
[4] Lucas B D,Kanade T.An Iterative Image Registration Technique with an Application to Stereo Vision[C]//International Joint Conference on Artificial Intelligence(IJCAI),1981:674-679.
[5] Bouguet J Y.Pyramidal implementation of the lucas kanade feature tracker description of the algorithm[J].Intel Corporation,2001(5):1-10.
[6] BradskiGary,Kaehler Adrian.學(xué)習(xí)OpenCV[M].于仕琪,劉瑞幀譯.北京:清華大學(xué)出版社,2009.
[7] 李振偉,陳種,趙有.基于OpenCV的運(yùn)動(dòng)目標(biāo)跟蹤及其實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2008,31(20):128-130.
[8] 高文娟,李健.基于OpenCV的攝像機(jī)標(biāo)定問題研究[J].計(jì)算機(jī)與數(shù)字工程,2008,36(12):128-130.
[9] Jianboshi,Carlo Tomasi.Good Features to Track[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition,1994:593-600.
[10] 禹明忠.PTV技術(shù)和顆粒三維運(yùn)動(dòng)規(guī)律的研究[D].北京:清華大學(xué),2002.
Realization of the surface flow field measurement by Pyram id LK method based on OpenCV
TU Yang,LIU Chunjing,CAO Wenhong,WANG Xiangdong
(China Institute of Water Resources and Hydropower Research,Beijing 100048,China)
This research adopts the Pyramid LK optical flow method for PTV surface flow field measurement.Program is developed using C++language,based on OpenCV vision function library and VisualStudio 2010 platform in this paper.Program app lication results show that the application of Pyram id LK optical flow method in PTV technology needs to further realize the centroid matching of trace particles based on the corner matching,which can make Pyram id LK optical flow method be well applied to the PTV technique,be able to obtain good results of the tracer particles,and automatically remove the error tracking of corners which do not have matching relationships in the Pyramid LK optical flow method.
OpenCV;Pyramid LK optical flow method;PTV;corner matching;centroid matching
TP391.41
A
10.13244/j.cnki.jiwhr.2016.03.011
1672-3031(2016)03-0224-05
(責(zé)任編輯:祁 偉)
2015-11-10
國(guó)家自然科學(xué)基金項(xiàng)目(11472310);國(guó)家國(guó)際科技合作專項(xiàng)項(xiàng)目(2015DFR70980)
凃洋(1986-),女,黑龍江齊齊哈爾人,博士生,主要從事水力學(xué)及河流動(dòng)力學(xué)研究。E-mail:tyiwhr@126.com