關(guān)鍵詞: 圖像處理 五子棋落棋檢測 位置識別 MATLAB
中圖分類號: TP242 文獻(xiàn)標(biāo)識碼: A 文章編號: 1672-3791(2023)16-0057-06
人機(jī)對弈一直是機(jī)器視覺、人工智能研究與應(yīng)用的熱點(diǎn),棋子落棋的圖像檢測和識別是其中的重要環(huán)節(jié)[1-3]。五子棋落子識別,常用方法是先識別棋盤上各行列線位置進(jìn)行棋盤建模,再應(yīng)用模板匹配確定棋盤中所有棋子位置,并與上一次的棋子位置作差分,從而得到新落棋子的位置,環(huán)節(jié)和復(fù)雜計(jì)算較多。本文提出一種改進(jìn)的五子棋落棋位置識別方法,首先通過圖像差分,得到每步的人落棋位置圖像,并對落棋位置進(jìn)行灰度增強(qiáng),然后再進(jìn)行落棋位置識別,既簡便了每步落棋位置的檢測,又不用對棋盤中已有棋子位置重復(fù)識別,提高了人落棋位置的識別效率和準(zhǔn)確性。
1 基于全局?jǐn)z像頭的棋盤圖像獲取
1.1 基于全局?jǐn)z像頭的棋盤圖像采集
采用全局固定攝像頭的方式,采集五子棋棋盤圖像,具體如圖1 所示。人機(jī)對弈時,棋盤和攝像頭固定,所以每次采集的棋盤圖像的大小固定,而每個落子點(diǎn)在圖像中的坐標(biāo)位置,也不會因每次的圖像采集而改變。圖2 是基于全局?jǐn)z像頭采集的棋盤圖像。
棋盤為13行13列,共169個落子點(diǎn),第7行7列(7,7)為中心落子點(diǎn)。棋盤背景為淺黃色,棋子為黑白兩色。
1.2 基于MATLAB 的棋盤圖像讀取
將圖2 在MATLAB 中讀取并轉(zhuǎn)換為灰度圖像,具體如圖3 所示。通過工作變量可知,每幅棋盤圖像像素均為600 ′ 800像素。
2 五子棋落棋位置的識別
人機(jī)對弈,只需通過圖像識別確定人的落棋位置,機(jī)器的落棋位置是通過博弈算法自動生成的。人落棋位置識別,常用方法是首先通過霍夫直線變換得到棋盤上各行列線位置,然后進(jìn)行棋盤建模,得到棋盤上每個落子點(diǎn)位置,再應(yīng)用模板匹配和計(jì)算,確定棋盤中所有棋子位置,并與上次的棋子位置作差分,從而得到新落子的棋子位置。此種方法要通過多次地檢測和復(fù)雜計(jì)算,才能確定全盤棋子位置,并且每次新落子計(jì)算,要把已有棋子全部再次匹配檢測,在人機(jī)實(shí)時對弈時,占用時間過多。
2.1 人落棋位置的識別
五子棋棋子的特點(diǎn)是大小基本一致,只有兩種顏色的圓形棋子。落子時,雙方輪流落棋,并且不可以吃棋,即棋盤中的棋子每次落棋后雙方輪流增加1 個。因此,本文提出一種改進(jìn)的五子棋落棋位置識別方法,首先通過圖像差分,得到每步的人落棋位置圖像,并對落棋位置進(jìn)行灰度增強(qiáng);然后再進(jìn)行落棋位置識別,既簡便了每步落棋位置的檢測,又不用對棋盤中已有棋子位置進(jìn)行重復(fù)識別,提高了人落棋位置的識別效率和準(zhǔn)確性。改進(jìn)的人落棋位置識別流程具體見圖4。
2.1.1 差分求取第n步人落棋圖像
五子棋只增加棋子,不減少棋子,所以用圖像差分法,可以簡便地檢測出本步人落棋位置。
如果人執(zhí)黑色棋子,棋子像素值接近0,用第n-1步的機(jī)器落棋圖像,減去第n 步的人落棋圖像,得到人落棋位置圖像,如圖5 所示。
如果人執(zhí)白色棋子,棋子像素值接近200,用第n步的人落棋圖像,減去第n-1 步的機(jī)器落棋圖像,得到人落棋位置圖像,如圖6 所示。
2.1.2 人落棋位置的識別
利用MATLAB 中的imfindcircles 函數(shù),對五子棋落子檢測圖像進(jìn)行霍夫圓識別[4]。其中,輸入?yún)?shù)Objectpolarity,是判別識別的圓形對象比背景亮或暗,如果亮,則輸入“ObjectPolarity”“bright”[5]。
因此,本文為了提高棋子的霍夫圓識別正確率,在識別前,利用圖像乘法,先對人落棋圖像進(jìn)行灰度增強(qiáng),再進(jìn)行棋子圓形識別。對圖像5 中人執(zhí)黑棋落棋位置圖像進(jìn)行灰度增強(qiáng),如圖7 所示。
圖7(a)中對圖像灰度值乘以10,落棋區(qū)域的圓形對象,相對背景亮度得到提高,但圖像中的行列線亮度也過于突出。通過測試比較,乘法系數(shù)設(shè)為3 時,圓形區(qū)域亮度提高而行列線亮度不明顯,如圖7(b)所示。
同理,對圖像6 中人執(zhí)白棋落棋位置圖像,進(jìn)行灰度增強(qiáng),如圖8 所示。
在MATLAB 中,對圖像7(b)和8(b)進(jìn)行霍夫圓識別,如圖9 所示,代碼如下:
[centerswhite, radiiwhite, metric] = imfindcircles(Imageb1,[18,28],ObjectPolarity','bright','Sensitivity',0.96);
viscircles(centerswhite,radiiwhite,'EdgeColor','b');
圖9 說明人執(zhí)白棋或者執(zhí)黑棋,都可以利用改進(jìn)的五子棋落棋位置識別方法,確定落棋位置。
2.1.3 人落棋位置的保存
人落棋位置的值,保存在imfindcircles 函數(shù)的輸出參數(shù)centerswhite 中。centerswhite 是一個1 ′ 2 的矩陣,保存所識別的圓在圖像中的x、y 坐標(biāo),即第n 步人落棋位置的列坐標(biāo)值和行坐標(biāo)值[6]。其中,圖9(a)中棋子的列和行的位置值是[369.8871,366.1103],圖9(b)中棋子的列和行的位置值是[326.5157,269.6242]。
通過MATLAB 中的矩陣追加方法A=[A;B],可將每次的人落棋位置值B,加入已有的人落棋位置值矩陣A 中,得到棋盤中所有的人落棋位置值。
2.2 人落棋位置的列行數(shù)計(jì)算
為了便于五子棋博弈算法計(jì)算,模擬人下棋方式,將人落棋的位置值轉(zhuǎn)換為人落棋的列行數(shù)。表1、表2為圖9(b)和圖10(a)中的黑棋白棋通過imfindcircles 函數(shù)識別的位置值,及其對應(yīng)的實(shí)際列行數(shù)。其中,imfindcircles函數(shù)識別得到的棋子位置值順序,是根據(jù)棋子圓形度進(jìn)行的排序。
根據(jù)表1、表2 可知,將每列的位置和每行的位置求平均,得到棋盤中心位置第7 列第7 行對應(yīng)的檢測位置值為(415.461 1,316.792 2);再對列間距和行間距求平均,得到棋盤列間距為45,行間距為43。因此,將棋子識別位置轉(zhuǎn)換為識別的列行數(shù),計(jì)算式如式(1)和式(2)。
式(1)、式(2)中,l 為識別的列位置值;h 為識別的行位置值;L 為識別列位置對應(yīng)的列數(shù);H為識別行位置對應(yīng)的行數(shù)。
對表1 和表2 中棋子進(jìn)行列行數(shù)計(jì)算,與實(shí)際列行數(shù)相同。表3 和表4 分別是對圖11 中棋子列行數(shù)的測試,計(jì)算的列行數(shù)與實(shí)際列行數(shù)一致。
對圖9(a)和9(b)中,每步的人落黑棋和白棋的列行數(shù)進(jìn)行測試,計(jì)算的列行數(shù)與實(shí)際列行數(shù)也一致,具體如表5 所示。
3 結(jié)語
本文提出了一種改進(jìn)的五子棋落棋位置識別方法,經(jīng)過測試,可以簡便準(zhǔn)確地識別人落棋位置值。同時,模擬人下棋方式,將人落棋的位置值轉(zhuǎn)換為人落棋的列行數(shù),便于后續(xù)博弈算法的推演。