日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

基于python定位棋子位置及識別棋子顏色

瀏覽:20日期:2022-07-28 08:49:22
目錄1、將棋盤分割成19x19的小方格2、根據像素占比識別是否是黑色棋子3、根據像素占比識別是否是白色棋子4、將棋盤棋子位置通過列表表示完整代碼如下:

這一篇主要實現定位棋子位置及識別棋子顏色。

圍棋棋盤原圖如下:

基于python定位棋子位置及識別棋子顏色

經過上一章節處理,已經將棋盤位置找到,如下圖:

基于python定位棋子位置及識別棋子顏色

現在根據新圖,進行棋子位置的定位

1、將棋盤分割成19x19的小方格

為了定位出棋盤每個交叉點上,是否有棋子,需要將棋盤分割成19X19的小方格,由于圍棋棋盤每個交叉線直接距離相同,是矩形,因此分割成小方格十分容易,如下圖:

基于python定位棋子位置及識別棋子顏色

若想將棋盤分割成19x19的小方格,需要知道以下幾個參數。

small_length=38 #每個小格寬高qizi_zhijing=38#棋子直徑zuoshangjiao=20#棋盤四周的寬度

這些可以使用imagewathch(VS下opencv的插件)工具,方便的知道,這個工具可以實時查看圖像的寬高,某個位置的像素值。這個工具的使用可以看我另外一篇文章:opencv用VS2013調試時用Image Watch插件查看圖片,代替一堆數據,直觀很多。下面是將原圖分割成19X19小方格的代碼

img = cv2.imread('src.jpg')cv2.imshow('src',img)#變量定義small_length=38 #每個小格寬高qizi_zhijing=38#棋子直徑zuoshangjiao=20#棋盤四周的寬度for i in range(19): for j in range(19):#print(i,j)lie = ihang = jTp_x = small_length * lieTp_y = small_length * hangTp_width = qizi_zhijingTp_height = qizi_zhijing#測試用cv2.rectangle(img, (Tp_x, Tp_y), (Tp_x + Tp_width, Tp_y + Tp_height),(255, 0, 0), 2)cv2.imwrite(’img.jpg’, img)img_temp=img[Tp_y:Tp_y+Tp_height, Tp_x:Tp_x+Tp_width]#參數含義分別是:y、y+h、x、x+wcv2.imwrite(’img_temp3.jpg’, img_temp)cv2.imshow('3', img_temp)cv2.waitKey(20)2、根據像素占比識別是否是黑色棋子

基于python定位棋子位置及識別棋子顏色基于python定位棋子位置及識別棋子顏色基于python定位棋子位置及識別棋子顏色

上面三種圖像是我們分割成小方格后的三種主要形態,分別代表黑色棋子,白色棋子以及無棋子。其中黑色棋子最好查找,我們將圖像進行灰度化——二值化后,通過統計黑色像素占比超過一定數值,就能知道該處是否有黑色棋子。

這里我將統計黑色占比的代碼,封裝成了一個函數,如下;

''' '********************************************************************************************函數功能 :統計二值化圖片黑色像素點百分比*輸入參數 :輸入裁剪后圖像,*返 回 值 :返回黑色像素點占比0-1之間*編寫時間 : 2021.6.30*作 者 : diyun********************************************************************************************'''def Heise_zhanbi(img): [height, width, tongdao] = img.shape #print(width, height, tongdao) # cv2.imshow('3', img) # cv2.waitKey(20) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # cv2.imshow('binary', gray) # cv2.waitKey(100) etVal, threshold = cv2.threshold(gray, 125, 255, cv2.THRESH_BINARY) # cv2.imshow('threshold', threshold) # cv2.waitKey(200) a = 0 b = 0 counter = 0#;/*目標像素點個數*/ zhanbi = 0#;/*目標像素點比值*/ for row in range(height):for col in range(width): val = threshold[row][col] if (val) == 0:#黑色a = a + 1 else:b = b + 1 zhanbi = (float)(a) / (float)(height*width) #print('黑色像素個數', a, '黑色像素占比', zhanbi) return zhanbi3、根據像素占比識別是否是白色棋子

同樣的,我們可以統計像素中白色占比,來進行識別該位置是否是白色棋子,但是這里需要注意一個問題,如果按照上面黑色棋子識別方法進行灰度化、二值化會造成白色棋子和無棋子分辨不了,二者都有大面積的白色,因此這里需要調整二值化的閾值,分開無棋子和白色棋子的圖像。

封裝好的代碼如下:

''' '********************************************************************************************函數功能 :統計二值化圖片白色像素點百分比*輸入參數 :輸入裁剪后圖像,*返 回 值 :返回白色像素點占比0-1之間*編寫時間 : 2021.6.30*作 者 : diyun********************************************************************************************'''def Baise_zhanbi(img): [height, width, tongdao] = img.shape #print(width, height, tongdao) # cv2.imshow('3', img) # cv2.waitKey(20) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # cv2.imshow('binary', gray) # cv2.waitKey(100) etVal, threshold = cv2.threshold(gray, 235, 255, cv2.THRESH_BINARY) # cv2.imshow('threshold', threshold) # cv2.waitKey(200) a = 0 b = 0 counter = 0#;/*目標像素點個數*/ zhanbi = 0#;/*目標像素點比值*/ for row in range(height):for col in range(width): val = threshold[row][col] if (val) == 0:#黑色a = a + 1 else:b = b + 1 zhanbi = (float)(b) / (float)(height*width) #print('白色像素個數', b, '白色像素占比', zhanbi) return zhanbi

效果圖如下:

基于python定位棋子位置及識別棋子顏色

4、將棋盤棋子位置通過列表表示

我們新建一個19*19的列表來存儲棋子,列表中:

0:代表無棋子1:代表白色2:代表黑色

代碼如下:

list = [[0 for i in range(19)] for j in range(19)]

當為黑色棋子時:

list[hang][lie]=2#黑色#print('當前棋子為黑色')print('第', i, '行,第', j, '列棋子為黑色:', i, j)

當為白色棋子時:

list[hang][lie] = 1 # 白色#print('當前棋子為白色')print('第', i, '行,第', j, '列棋子為白色:', i, j)

效果圖如下:

基于python定位棋子位置及識別棋子顏色

完整代碼如下:

from PIL import ImageGrabimport numpy as npimport cv2from glob import globimport osimport time#Python將數字轉換成大寫字母def getChar(number): factor, moder = divmod(number, 26) # 26 字母個數 modChar = chr(moder + 65) # 65 -> ’A’ if factor != 0:modChar = getChar(factor-1) + modChar # factor - 1 : 商為有效值時起始數為 1 而余數是 0 return modChardef getChars(length): return [getChar(index) for index in range(length)]''' '********************************************************************************************函數功能 :統計二值化圖片黑色像素點百分比*輸入參數 :輸入裁剪后圖像,*返 回 值 :返回黑色像素點占比0-1之間*編寫時間 : 2021.6.30*作 者 : diyun********************************************************************************************'''def Heise_zhanbi(img): [height, width, tongdao] = img.shape #print(width, height, tongdao) # cv2.imshow('3', img) # cv2.waitKey(20) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # cv2.imshow('binary', gray) # cv2.waitKey(100) etVal, threshold = cv2.threshold(gray, 125, 255, cv2.THRESH_BINARY) # cv2.imshow('threshold', threshold) # cv2.waitKey(200) a = 0 b = 0 counter = 0#;/*目標像素點個數*/ zhanbi = 0#;/*目標像素點比值*/ for row in range(height):for col in range(width): val = threshold[row][col] if (val) == 0:#黑色a = a + 1 else:b = b + 1 zhanbi = (float)(a) / (float)(height*width) #print('黑色像素個數', a, '黑色像素占比', zhanbi) return zhanbi''' '********************************************************************************************函數功能 :統計二值化圖片白色像素點百分比*輸入參數 :輸入裁剪后圖像,*返 回 值 :返回白色像素點占比0-1之間*編寫時間 : 2021.6.30*作 者 : diyun********************************************************************************************'''def Baise_zhanbi(img): [height, width, tongdao] = img.shape #print(width, height, tongdao) # cv2.imshow('3', img) # cv2.waitKey(20) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # cv2.imshow('binary', gray) # cv2.waitKey(100) etVal, threshold = cv2.threshold(gray, 235, 255, cv2.THRESH_BINARY) # cv2.imshow('threshold', threshold) # cv2.waitKey(200) a = 0 b = 0 counter = 0#;/*目標像素點個數*/ zhanbi = 0#;/*目標像素點比值*/ for row in range(height):for col in range(width): val = threshold[row][col] if (val) == 0:#黑色a = a + 1 else:b = b + 1 zhanbi = (float)(b) / (float)(height*width) #print('白色像素個數', b, '白色像素占比', zhanbi) return zhanbi''' '********************************************************************************************函數功能 :定位棋盤位置*輸入參數 :截圖*返 回 值 :裁剪后的圖像*編寫時間 : 2021.6.30*作 者 : diyun********************************************************************************************'''def dingweiqizi_weizhi(img): ’’’******************************************** 1、定位棋盤位置 ********************************************’’’ #img = cv2.imread('./screen/1.jpg') image = img.copy() w, h, c = img.shape img2 = np.zeros((w, h, c), np.uint8) img3 = np.zeros((w, h, c), np.uint8) # img = ImageGrab.grab() #bbox specifies specific region (bbox= x,y,width,height *starts top-left) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower = np.array([10, 0, 0]) upper = np.array([40, 255, 255]) mask = cv2.inRange(hsv, lower, upper) erodeim = cv2.erode(mask, None, iterations=2) # 腐蝕 dilateim = cv2.dilate(erodeim, None, iterations=2) img = cv2.bitwise_and(img, img, mask=dilateim) frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, dst = cv2.threshold(frame, 100, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(dst, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) #cv2.imshow('0', img) i = 0 maxarea = 0 nextarea = 0 maxint = 0 for c in contours:if cv2.contourArea(c) > maxarea: maxarea = cv2.contourArea(c) maxint = ii += 1 # 多邊形擬合 epsilon = 0.02 * cv2.arcLength(contours[maxint], True) if epsilon < 1:print('error : epsilon < 1')pass # 多邊形擬合 approx = cv2.approxPolyDP(contours[maxint], epsilon, True) [[x1, y1]] = approx[0] [[x2, y2]] = approx[2] checkerboard = image[y1:y2, x1:x2] # cv2.imshow('1', checkerboard) # cv2.waitKey(1000) #cv2.destroyAllWindows() return checkerboard''' '********************************************************************************************函數功能 :定位棋子顏色及位置*輸入參數 :裁剪后的圖像*返 回 值 :棋子顏色及位置列表*編寫時間 : 2021.6.30*作 者 : diyun********************************************************************************************'''def dingweiqizi_yanse_weizhi(img): ’’’******************************************** 2、識別棋盤棋子位置及顏色及序號; ********************************************’’’ #img = cv2.imread('./checkerboard/checkerboard_1.jpg') img = cv2.resize(img, (724,724), interpolation=cv2.INTER_AREA) #cv2.imshow('src',img) #cv2.waitKey(1000) #變量定義 small_length=38 #每個小格寬高 qizi_zhijing=38#棋子直徑 zuoshangjiao=20#棋盤四周的寬度 list = [[0 for i in range(19)] for j in range(19)] #print(list) for i in range(19):for j in range(19): lie = i hang = j Tp_x = small_length * lie Tp_y = small_length * hang Tp_width = qizi_zhijing Tp_height = qizi_zhijing img_temp=img[Tp_y:Tp_y+Tp_height, Tp_x:Tp_x+Tp_width]#參數含義分別是:y、y+h、x、x+w heise_zhanbi=Heise_zhanbi(img_temp) if heise_zhanbi>0.5:list[hang][lie]=2#黑色print('第', j+1, '行,第', i+1, '列棋子為黑色')#print('當前棋子為黑色') else:baise_zhanbi = Baise_zhanbi(img_temp)if baise_zhanbi > 0.15: list[hang][lie] = 1 # 白色 print('第', j+1, '行,第',i+1 , '列棋子為白色') #print('當前棋子為白色')else: list[hang][lie] = 0 # 無棋子 #print('當前位置沒有棋子') #print(heise_zhanbi) #cv2.imshow('2',img) #print('n') #print(list) return listif __name__ =='__main__': list0 = [[0 for i in range(19)] for j in range(19)] list_finall = [] img = cv2.imread('./screen/9.jpg') ’’’******************************************** 1、定位棋盤位置 ********************************************’’’ img_after=dingweiqizi_weizhi(img) #cv2.imshow('src',img) ’’’******************************************** 2、識別棋盤棋子位置及顏色及序號; ********************************************’’’ list1=dingweiqizi_yanse_weizhi(img_after) print(list1)

到此這篇關于基于python定位棋子位置及識別棋子顏色的文章就介紹到這了,更多相關python定位棋子位置及識別棋子顏色內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
卡一精品卡二卡三网站乱码| 99精品综合| 黄色亚洲免费| 日本不良网站在线观看| 国产精品精品| 亚洲精品a级片| 亚洲高清激情| 免费不卡中文字幕在线| 欧美成人国产| 日韩亚洲在线| 日韩视频一区| 亚洲深夜av| 中文字幕av一区二区三区四区| 特黄特色欧美大片| 欧美好骚综合网| 亚洲a一区二区三区| 久久国产电影| 国产精品日韩久久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 少妇精品久久久一区二区| 欧美精品99| 精品亚洲自拍| 久久男人av资源站| 久久一区二区中文字幕| 欧美日韩精品免费观看视频完整| 国产欧美69| 精品国产不卡| 久久一级电影| 蜜桃久久久久久| 欧美一级一区| 老鸭窝一区二区久久精品| 国产一区二区三区不卡av | 日韩欧美高清一区二区三区| 午夜在线精品| 日韩有吗在线观看| 鲁大师精品99久久久| 日韩在线中文| 亚洲激情社区| 国产伦精品一区二区三区视频 | 久久久久久亚洲精品美女| 精品一区二区三区免费看| 精品福利久久久| 欧美成人综合| 日本不卡一区二区| 亚洲欧洲美洲av| 麻豆久久精品| 久久久精品区| 9色国产精品| 国产激情久久| 欧美成人综合| 国产毛片一区二区三区 | 久久精品72免费观看| 久久精品一区二区三区中文字幕| 日本不卡高清| 国产+成+人+亚洲欧洲在线| 久久精品导航| 日韩高清二区| 亚洲天堂久久| 国产精品久久久久久模特| 亚洲性视频h| 国产精品久久久久久妇女| 亚洲国内精品| 老牛国内精品亚洲成av人片| 精品九九久久| 日韩中文在线电影| 在线一区二区三区视频| 国产精品香蕉| 欧美特黄a级高清免费大片a级| 日韩在线综合| 亚洲精品少妇| 日韩不卡免费高清视频| 亚洲日产av中文字幕| 成人av三级| 日本欧美在线| 亚洲黄色影院| 色黄视频在线观看| 国产午夜久久av| 久久成人亚洲| www.com.cn成人| 国产毛片一区二区三区| 国产手机视频一区二区| 麻豆精品少妇| 视频一区日韩| 亚洲深夜影院| 久久视频精品| 高清一区二区三区av| 日本不卡视频在线| 久久夜色精品| 蜜臀av免费一区二区三区| 国产剧情一区二区在线观看| 好吊日精品视频| 日韩一区三区| 久久三级毛片| 青青草国产成人99久久| 五月婷婷亚洲| 97精品中文字幕| 欧美搞黄网站| 国产不卡av一区二区| 国产日韩欧美在线播放不卡| 蜜臀91精品一区二区三区| 亚洲成人一区| 中文字幕一区久| 欧美交a欧美精品喷水| 日韩精品久久久久久| 在线综合欧美| 欧美日中文字幕| 中文字幕人成乱码在线观看 | 亚洲一区二区网站| 日韩专区精品| 国产中文欧美日韩在线| 国产精品成人国产| 国产探花一区| 亚洲资源在线| 中文一区在线| 亚洲欧洲一区| 99在线精品免费视频九九视| 欧美精品激情| 女人天堂亚洲aⅴ在线观看| 亚洲无线一线二线三线区别av| 亚洲网址在线观看| 亚洲激情不卡| 欧美综合二区| 一区二区国产精品| 蜜臀av一区二区三区| 激情综合自拍| 亚洲成人国产| 99视频精品视频高清免费| 亚洲午夜免费| 精品中国亚洲| 麻豆精品久久久| 精品免费视频| 国产一区二区三区黄网站 | 美日韩精品视频| 91精品电影| 久久aⅴ国产紧身牛仔裤| 亚洲一区二区免费看| 99xxxx成人网| 激情婷婷综合| 不卡一区2区| 奶水喷射视频一区| 亚洲精品精选| 国产美女久久| 成人在线免费观看网站| 日本不卡免费高清视频在线| 亚洲v在线看| 久久国产66| 日韩高清成人在线| 精品丝袜久久| 四虎精品永久免费| 国产伦乱精品| 在线看片国产福利你懂的| 亚洲播播91| 久久国产直播| 亚洲丝袜啪啪| 麻豆极品一区二区三区| 精品国产一级| 久久青草久久| 日韩一区精品字幕| 国产欧美另类| 神马午夜久久| 蜜桃91丨九色丨蝌蚪91桃色| 爽好多水快深点欧美视频| 桃色一区二区| 精品一区免费| 日本亚州欧洲精品不卡| 国产亚洲一卡2卡3卡4卡新区| 香蕉成人av| japanese国产精品| 中日韩男男gay无套| 日韩成人av影视| 精品成人18| 伊人久久婷婷| 国产精品午夜一区二区三区| 成人看片网站| 亚洲一区日韩在线| 国产欧美视频在线| 91精品一区国产高清在线gif| 精品国产欧美日韩| 国产99精品| 视频一区日韩精品| 高清av一区| 久久国产精品久久久久久电车| 国产专区精品| 99精品美女| 日韩国产欧美三级| 精品久久不卡| 91九色精品| 国产精品白丝av嫩草影院| 久久精品99久久无色码中文字幕| 精品国产精品国产偷麻豆| 99久久夜色精品国产亚洲狼 | 久久久久国产| 男人的天堂亚洲一区| 精品日本视频| 首页欧美精品中文字幕| 精品国产18久久久久久二百| 日韩影院精彩在线| 免费看av不卡| 日韩精品中文字幕一区二区| 理论片午夜视频在线观看|