童雨輝,李萬彬,王巾銓,陳飛揚(yáng),許淑萍
(華北電力大學(xué),北京,102206)
乒乓球這項(xiàng)運(yùn)動(dòng)在社區(qū)、高校、公園中的出現(xiàn)十分頻繁。我們想設(shè)計(jì)出一種簡(jiǎn)便的智能計(jì)分系統(tǒng),作為輔助設(shè)備輔助裁判計(jì)分。以視頻檢測(cè)的方法跟蹤球的軌跡在其他運(yùn)動(dòng)中已有使用,譬如在大型網(wǎng)球場(chǎng)使用的“鷹眼”。同時(shí),乒乓球智能計(jì)分在國(guó)內(nèi)外有不同的研究與設(shè)計(jì)。美國(guó)佐治亞學(xué)院的王中林設(shè)計(jì)出一種木基摩擦電傳感器應(yīng)用于乒乓球臺(tái)的乒乓球檢測(cè)系統(tǒng);哈爾濱工程大學(xué)的馬丞浩設(shè)計(jì)了以加速度傳感器和單片機(jī)芯片為主體的智能計(jì)分系統(tǒng)[1]。目前,OpenCV在圖像處理、模式識(shí)別、目標(biāo)檢測(cè)與跟蹤方面較為突出,我們通過OpenCV處理得出目標(biāo)圖像并分析出乒乓球的運(yùn)動(dòng)軌跡。本文所提出的計(jì)分系統(tǒng)使用OpenCV技術(shù)對(duì)初始圖像進(jìn)行一系列處理得出目標(biāo)圖像,將目標(biāo)圖像輸入編寫的計(jì)分程序中進(jìn)行計(jì)分。
我們對(duì)解幀后得到的一組圖像進(jìn)行讀取,把每一幀圖像進(jìn)行分析和處理,進(jìn)行灰度化處理和去噪處理將視頻圖像進(jìn)行簡(jiǎn)化和降低模糊,在經(jīng)過幀間拆分法以及二值化變換之后,我們就可以將圖像中的輪廓提取并除去背景的干擾,最后在腐蝕膨脹等形態(tài)學(xué)處理后,我們就得到了初階段的目標(biāo)圖像。
對(duì)運(yùn)動(dòng)目標(biāo)的檢測(cè)和乒乓球臺(tái)的檢測(cè)即感興趣區(qū)的提取。在計(jì)分中,乒乓球臺(tái)區(qū)域就是我們的感興趣區(qū)。我們通過矩陣運(yùn)算來定義此區(qū)域,然后利用函數(shù)將區(qū)域外的非感興趣區(qū)設(shè)定為像素為0,只保留感興趣區(qū)的像素值。這樣就得出了局限于乒乓球臺(tái)區(qū)域的圖像。
在上述處理完成后的圖像上建系,通過幀間拆分法分析出目標(biāo)輪廓,再基于乒乓球圓形的形狀,以形狀閾值分割準(zhǔn)確提取出圓形的乒乓球區(qū)域。提取出乒乓球區(qū)域后,再通過矩陣算法計(jì)算出圓形區(qū)域的質(zhì)心并輸出坐標(biāo)。
在得到質(zhì)心坐標(biāo)的變化曲線后,就可以設(shè)置邏輯算法,分析出乒乓球的碰案、觸網(wǎng)等特征動(dòng)作,再結(jié)合發(fā)球方、接球方判斷得分方。
我們利用操作符:capture>>frame對(duì)視頻進(jìn)行讀取,將視頻按幀展開進(jìn)行讀取。
攝像機(jī)傳輸?shù)囊曨l圖像是彩色圖像,每一個(gè)像素有R(紅)、G(綠)、B(藍(lán))三個(gè)通道,像素值介于0-255之間,而灰度圖像只會(huì)占用一個(gè)通道,極大地減少了計(jì)算機(jī)的計(jì)算量,提高系統(tǒng)的運(yùn)行速度,故將視頻圖像灰度化處理十分必要。
我們用下面的OpenCV函數(shù)進(jìn)行灰度化處理:
void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0)
其中InputArray src為輸入圖像,OutputArray dst為輸出圖像,int code是顏色轉(zhuǎn)換空間標(biāo)志符,int dstCn=0為目標(biāo)圖像的通道數(shù),如果該參數(shù)為0,通道數(shù)就會(huì)取原圖像的通道數(shù)[2]?;叶然幚頃r(shí),Code參數(shù)為CV_RGB2GRAY。
由于中值濾波更適用于處理椒鹽噪聲和脈沖噪聲,我們選取中值濾波去噪。
我們利用如下的OpenCV函數(shù):
其中:src——輸入圖像;
dst——輸出圖像, 與src同類型;
ksize——內(nèi)核大?。ㄓ捎谖覀冞x取正方形窗口,只用到一個(gè)值),為奇數(shù)[3]。
幀差法是對(duì)兩幀圖像運(yùn)算,得到圖像相應(yīng)位置像素值差的絕對(duì)值,判定它是否大于某一閾值,分析圖像序列中目標(biāo)物體的運(yùn)動(dòng)特性。其數(shù)學(xué)公式描述如下:
其中,In指視頻序列中第n幀圖像在像素位置的像素值,In-k指同一視頻序列中第n-k 幀圖像的像素值,Dn指兩幀圖像的像素差值,k即幀間隔,F(xiàn)n指統(tǒng)計(jì)前、背景區(qū)域的二值圖,1為前景,0是背景;T指系統(tǒng)設(shè)定的閾值。我們使用改進(jìn)于相鄰幀差法的三幀差法。
圖像的二值化可以簡(jiǎn)化圖像,使圖像的輪廓更清晰。
按圖像的灰度值,可以把圖像分成背景和前景。方差是判斷灰度分布均勻性的一種度量,類間方差越大說明形成圖像的背景與前景的差別越大,它們之間的錯(cuò)分都會(huì)導(dǎo)致它們之間的差別變小。因此,使類間方差最大的分割方法同時(shí)就是使前景和背景錯(cuò)分最小的方法。
在OpenCV中,我們使用如下函數(shù):
Double threshold(InputArray src,OutputArray dst,double maxval,int type)
其中src為輸入組(單通道,8或32位浮點(diǎn)類型的Mat),dst用于存放輸出結(jié)果,且和第一個(gè)參數(shù)中的Mat變量尺寸類型一致,thresh為二值化的閾值,maxval為type取THRESH_BINARY或THRESH_BINARY_INV時(shí)的最大值,type為閾值類型。
二值圖像的形態(tài)學(xué)操作有:腐蝕、膨脹、開運(yùn)算、閉運(yùn)算[6]。
腐蝕圖像可以對(duì)邊界進(jìn)行清除,使圖像的邊界向內(nèi)部收縮,從而達(dá)到縮小目標(biāo)圖像的目的,主要用于把邊界上無用的點(diǎn)消除。公式如下:
其中,用B代表卷積核,A代表原圖像
膨脹與腐蝕的目的相反,膨脹就是合并邊界點(diǎn),使目標(biāo)邊界向邊界點(diǎn)外擴(kuò)張。主要用來填充目標(biāo)區(qū)域中的可能出現(xiàn)的漏點(diǎn),也可以在一定程度上消除目標(biāo)區(qū)域中的噪聲。公式如下:
開、閉運(yùn)算是腐蝕和膨脹的組合操作,區(qū)別就在于膨脹與腐蝕的操作順序。開運(yùn)算是先腐蝕圖像,然后再對(duì)圖像進(jìn)行膨脹操作,一般用于清除小粒的噪音,消除圖像的離散點(diǎn)。閉運(yùn)算則與開運(yùn)算相反,先膨脹再腐蝕,閉運(yùn)算可以填充圖像里的微小空洞,連接位置靠近的多個(gè)目標(biāo)。開、閉運(yùn)算將腐蝕和膨脹組合使用,在對(duì)目標(biāo)區(qū)域進(jìn)行處理的同時(shí)又不明顯改變圖像區(qū)域的面積。
在拍攝時(shí),由于拍攝視角廣,會(huì)捕捉到其他背景區(qū)域,而這些背景會(huì)干擾乒乓球捕捉。為了降低背景干擾,我們?cè)O(shè)置了一個(gè)對(duì)應(yīng)乒乓球臺(tái)區(qū)域的感興趣區(qū)。
在拍攝角度看,球桌形狀為梯形,我們利用矩陣定義該區(qū)域,把對(duì)圖像進(jìn)行的操作轉(zhuǎn)換成對(duì)矩陣的操作。矩陣運(yùn)算時(shí)一般習(xí)慣上依次用高度、寬度的順序?qū)?yīng)矩陣中的行與列。那么,我們可以利用圖像矩陣運(yùn)算來定義這個(gè)梯形區(qū)域。我們通過img.shape()函數(shù)獲取視頻序列的寬度和高度,則左下角的點(diǎn)可表示為[width*a,height*b],其中a,b小于1。據(jù)此表示出四角的坐標(biāo)。接著,生成掩膜圖像。掩膜可以對(duì)原圖像進(jìn)行遮擋過濾[5],我們對(duì)非感興趣區(qū)域進(jìn)行遮擋,將感興趣區(qū)設(shè)置為白色,將不相關(guān)區(qū)域設(shè)定為黑色。最終只會(huì)保留感興趣區(qū)的像素值,而非感興趣區(qū)像素值為0,被黑色遮掩。
我們采用兩臺(tái)攝像機(jī),在水平側(cè)邊以及球臺(tái)上方兩個(gè)位置分別放置。側(cè)邊攝像機(jī)可以捕捉到乒乓球在空中的曲線,頂部則可以捕捉到乒乓球的落點(diǎn),結(jié)合兩部攝像設(shè)備就可以較為準(zhǔn)確地恢復(fù)出乒乓球的三維軌跡。
側(cè)視角度:以球網(wǎng)與臺(tái)面交點(diǎn)為中心點(diǎn)建立z坐標(biāo)系。俯視角度:以球桌中心為原點(diǎn)建立xy坐標(biāo)系。
設(shè)圖形的半徑為r,則其的周長(zhǎng)為C=2πr,面積為S=πr2,那其形狀就可以描述為一個(gè)相對(duì)不發(fā)生變化的值:
4.4.1 質(zhì)心定位
本文利用輪廓的矩計(jì)算乒乓球區(qū)域質(zhì)心。計(jì)算方式如下:
一階矩為:
質(zhì)心的橫縱坐標(biāo)公式為:
由于像素點(diǎn)的灰度值都為1,則M00為輪廓點(diǎn)的個(gè)數(shù),M10為所有點(diǎn)的行坐標(biāo)數(shù)值和,M01為所有點(diǎn)列坐標(biāo)的數(shù)值和。
設(shè)球從左向右飛行,桌面長(zhǎng)為a,寬為b,設(shè)圓心坐標(biāo)為(x0,y0,z0),球半徑為 r,球網(wǎng)高h(yuǎn)。
當(dāng)x0≥ a/2或y0≤-b/2或y0≥b/2且z0>r且5秒內(nèi)圖像中無乒乓球出現(xiàn)時(shí),球出界。
當(dāng) -a/2<x0<a/2 且 -b/2<y0<b/2 且 z0=r 時(shí),球碰案。
當(dāng) z0<h 且下一幀 x0<0 時(shí),球打網(wǎng)。
假設(shè)球碰案的次數(shù)為n,假設(shè)左方得分為L(zhǎng),右方得分為R,球心坐標(biāo)為(x,y,z)。
當(dāng)比賽開始時(shí),首先進(jìn)行發(fā)球方的判斷:當(dāng)乒乓球首次出現(xiàn)在畫面中時(shí)x<0為左方發(fā),x>0為右方發(fā);然后進(jìn)行擦網(wǎng)判斷:(當(dāng)x在[-r,r]區(qū)間內(nèi)時(shí),z在[h-r,h+r]區(qū)間內(nèi)時(shí),即為擦網(wǎng))。
重發(fā)判定:當(dāng)已判定為擦網(wǎng)時(shí),若球下一次碰案所對(duì)應(yīng)的x2坐標(biāo)與前一次碰案所對(duì)應(yīng)的x1坐標(biāo)符號(hào)相反,則判斷為“發(fā)球擦網(wǎng)”,發(fā)球方重新發(fā)球。(當(dāng)n>2后不再判斷是否重發(fā))。
得分判斷:現(xiàn)在假設(shè)是左方發(fā)球、當(dāng)右方發(fā)球時(shí)結(jié)果互換。當(dāng)已判斷為左方發(fā)球后,如果在5秒內(nèi)n的值依舊為0,即發(fā)球未上案,右方直接得分;當(dāng)某一次碰案所對(duì)應(yīng)的xn與上一次碰案所對(duì)應(yīng)的xn-1的正負(fù)號(hào)相同時(shí),判斷n的奇偶性,如果n是奇數(shù)即為右方擊球失誤,左方得分、如果n是偶數(shù)那么表明左方擊球失誤,右方得分;在n≥1時(shí)判斷,若在5秒內(nèi)n的值沒有變化,則為某一方擊球失誤,如果n是奇數(shù)則為左方失誤,右方得分,如果n是偶數(shù)則為右方失誤,左方得分[7]。
終局判斷:若L=11,且0≤R≤10,則為左方贏下本局;若R=11,且0≤L≤10,則為右方贏下本局;若L=R=10時(shí),只要在此后|L-R|=2,則本局結(jié)束,若L>R左方贏、若R>L右方贏。
本文設(shè)計(jì)的乒乓球智能計(jì)分系統(tǒng)主要依靠圖像處理得出乒乓球軌跡,并通過設(shè)定的算法將軌跡化為數(shù)字信號(hào),在對(duì)數(shù)字信號(hào)的整合分析后就可以判定出乒乓球的特征動(dòng)作,最后結(jié)合發(fā)球與接球判斷得分。在整個(gè)系統(tǒng)上來看,乒乓球軌跡的得出及其數(shù)字化是計(jì)分的核心工作。
攝像的角度、拍攝場(chǎng)所的光線、拍攝設(shè)備的清晰度等影響成像的因素都會(huì)對(duì)本文的計(jì)分系統(tǒng)產(chǎn)生干擾。在視頻獲取時(shí),均勻的光線、攝像設(shè)備的高速捕捉能力等都會(huì)利于乒乓球軌跡的提取進(jìn)而提高分值判斷的準(zhǔn)確度。在實(shí)際應(yīng)用中,可以把計(jì)分系統(tǒng)當(dāng)做裁判的輔助工具來使用。