校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > 基于python定位棋子位置及識(shí)別棋子顏色

基于python定位棋子位置及識(shí)別棋子顏色

熱門標(biāo)簽:宿州電話機(jī)器人哪家好 無錫智能外呼系統(tǒng)好用嗎 百應(yīng)電話機(jī)器人總部 電梯新時(shí)達(dá)系統(tǒng)外呼顯示e 南昌地圖標(biāo)注 西青語音電銷機(jī)器人哪家好 地圖標(biāo)注與注銷 成都呼叫中心外呼系統(tǒng)哪家強(qiáng) 旅游廁所地圖標(biāo)注怎么弄

這一篇主要實(shí)現(xiàn)定位棋子位置及識(shí)別棋子顏色。

圍棋棋盤原圖如下:


經(jīng)過上一章節(jié)處理,已經(jīng)將棋盤位置找到,如下圖:


現(xiàn)在根據(jù)新圖,進(jìn)行棋子位置的定位

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

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


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

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

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

img = cv2.imread("src.jpg")
cv2.imshow("src",img)
#變量定義
small_length=38  #每個(gè)小格寬高
qizi_zhijing=38#棋子直徑
zuoshangjiao=20#棋盤四周的寬度

for i in range(19):
    for j in range(19):
        #print(i,j)
        lie = i
        hang = j
        Tp_x = small_length * lie
        Tp_y = small_length * hang
        Tp_width = qizi_zhijing
        Tp_height = qizi_zhijing

        #測(cè)試用
        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]#參數(shù)含義分別是:y、y+h、x、x+w
        cv2.imwrite('img_temp3.jpg', img_temp)
        cv2.imshow("3", img_temp)
        cv2.waitKey(20)

2、根據(jù)像素占比識(shí)別是否是黑色棋子




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

這里我將統(tǒng)計(jì)黑色占比的代碼,封裝成了一個(gè)函數(shù),如下;

"""  "*******************************************************************************************
*函數(shù)功能 :統(tǒng)計(jì)二值化圖片黑色像素點(diǎn)百分比
*輸入?yún)?shù) :輸入裁剪后圖像,
*返 回 值 :返回黑色像素點(diǎn)占比0-1之間
*編寫時(shí)間 : 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#;/*目標(biāo)像素點(diǎn)個(gè)數(shù)*/
    zhanbi = 0#;/*目標(biāo)像素點(diǎn)比值*/
    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("黑色像素個(gè)數(shù)", a, "黑色像素占比", zhanbi)
    return zhanbi

3、根據(jù)像素占比識(shí)別是否是白色棋子

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

封裝好的代碼如下:

"""  "*******************************************************************************************
*函數(shù)功能 :統(tǒng)計(jì)二值化圖片白色像素點(diǎn)百分比
*輸入?yún)?shù) :輸入裁剪后圖像,
*返 回 值 :返回白色像素點(diǎn)占比0-1之間
*編寫時(shí)間 : 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#;/*目標(biāo)像素點(diǎn)個(gè)數(shù)*/
    zhanbi = 0#;/*目標(biāo)像素點(diǎn)比值*/
    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("白色像素個(gè)數(shù)", b, "白色像素占比", zhanbi)
    return zhanbi

效果圖如下:

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

我們新建一個(gè)19*19的列表來存儲(chǔ)棋子,列表中:

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

代碼如下:

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

當(dāng)為黑色棋子時(shí):

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

當(dāng)為白色棋子時(shí):

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

效果圖如下:

完整代碼如下:

from PIL import ImageGrab
import numpy as np
import cv2
from glob import glob
import os

import time


#Python將數(shù)字轉(zhuǎn)換成大寫字母
def getChar(number):
    factor, moder = divmod(number, 26) # 26 字母?jìng)€(gè)數(shù)
    modChar = chr(moder + 65)          # 65 -> 'A'
    if factor != 0:
        modChar = getChar(factor-1) + modChar # factor - 1 : 商為有效值時(shí)起始數(shù)為 1 而余數(shù)是 0
    return modChar
def getChars(length):
    return [getChar(index) for index in range(length)]



"""  "*******************************************************************************************
*函數(shù)功能 :統(tǒng)計(jì)二值化圖片黑色像素點(diǎn)百分比
*輸入?yún)?shù) :輸入裁剪后圖像,
*返 回 值 :返回黑色像素點(diǎn)占比0-1之間
*編寫時(shí)間 : 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#;/*目標(biāo)像素點(diǎn)個(gè)數(shù)*/
    zhanbi = 0#;/*目標(biāo)像素點(diǎn)比值*/
    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("黑色像素個(gè)數(shù)", a, "黑色像素占比", zhanbi)
    return zhanbi


"""  "*******************************************************************************************
*函數(shù)功能 :統(tǒng)計(jì)二值化圖片白色像素點(diǎn)百分比
*輸入?yún)?shù) :輸入裁剪后圖像,
*返 回 值 :返回白色像素點(diǎn)占比0-1之間
*編寫時(shí)間 : 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#;/*目標(biāo)像素點(diǎn)個(gè)數(shù)*/
    zhanbi = 0#;/*目標(biāo)像素點(diǎn)比值*/
    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("白色像素個(gè)數(shù)", b, "白色像素占比", zhanbi)
    return zhanbi

"""  "*******************************************************************************************
*函數(shù)功能 :定位棋盤位置
*輸入?yún)?shù) :截圖
*返 回 值 :裁剪后的圖像
*編寫時(shí)間 : 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 = i
        i += 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

"""  "*******************************************************************************************
*函數(shù)功能 :定位棋子顏色及位置
*輸入?yún)?shù) :裁剪后的圖像
*返 回 值 :棋子顏色及位置列表
*編寫時(shí)間 : 2021.6.30
*作    者 : diyun
********************************************************************************************"""
def dingweiqizi_yanse_weizhi(img):
    '''********************************************
    2、識(shí)別棋盤棋子位置及顏色及序號(hào);
    ********************************************'''
    #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  #每個(gè)小格寬高
    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]#參數(shù)含義分別是: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("當(dāng)前棋子為黑色")
            else:
                baise_zhanbi = Baise_zhanbi(img_temp)
                if baise_zhanbi > 0.15:
                    list[hang][lie] = 1  # 白色
                    print("第", j+1, "行,第",i+1 , "列棋子為白色")
                    #print("當(dāng)前棋子為白色")
                else:
                    list[hang][lie] = 0  # 無棋子
                    #print("當(dāng)前位置沒有棋子")
            #print(heise_zhanbi)
    #cv2.imshow("2",img)
    #print("\n")
    #print(list)
    return  list



if __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、識(shí)別棋盤棋子位置及顏色及序號(hào);
    ********************************************'''
    list1=dingweiqizi_yanse_weizhi(img_after)
    print(list1)

到此這篇關(guān)于基于python定位棋子位置及識(shí)別棋子顏色的文章就介紹到這了,更多相關(guān)python定位棋子位置及識(shí)別棋子顏色內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python識(shí)別圍棋定位棋盤位置

標(biāo)簽:雅安 西安 贛州 渭南 辛集 七臺(tái)河 濰坊 許昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于python定位棋子位置及識(shí)別棋子顏色》,本文關(guān)鍵詞  基于,python,定位,棋子,位置,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于python定位棋子位置及識(shí)別棋子顏色》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于python定位棋子位置及識(shí)別棋子顏色的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    不卡av在线网| 老司机精品视频导航| 色综合天天做天天爱| 一区精品在线播放| 91视频一区二区| 一区二区三区加勒比av| 91免费观看视频| 亚洲一二三级电影| 日韩欧美精品三级| 粉嫩av一区二区三区| 亚洲视频香蕉人妖| 欧美精品在线观看一区二区| 美女脱光内衣内裤视频久久影院| 精品日韩欧美一区二区| 国产aⅴ综合色| 亚洲与欧洲av电影| 日韩丝袜情趣美女图片| 国产aⅴ精品一区二区三区色成熟| 综合欧美亚洲日本| 欧美美女bb生活片| 高清国产一区二区三区| 一区二区在线看| 欧美大胆人体bbbb| 99精品一区二区| 日本亚洲三级在线| 亚洲国产高清不卡| 51精品视频一区二区三区| 国产一区激情在线| 亚洲精品伦理在线| 久久久亚洲精华液精华液精华液| 色88888久久久久久影院野外| 免费观看日韩电影| 亚洲免费观看高清完整版在线观看 | 在线成人av影院| 国产福利一区二区三区在线视频| 亚洲另类春色校园小说| 久久久精品综合| 制服丝袜亚洲播放| 99精品视频在线观看| 开心九九激情九九欧美日韩精美视频电影| 国产女主播视频一区二区| 欧美日韩高清影院| 色欲综合视频天天天| 麻豆精品国产传媒mv男同| 亚洲精品综合在线| 久久先锋资源网| 欧美日本一区二区三区四区 | 亚洲成av人片一区二区三区| 国产日韩欧美高清在线| 欧美一个色资源| 色婷婷综合视频在线观看| 高清在线成人网| 黄色精品一二区| 麻豆精品在线看| 日本中文字幕一区二区有限公司| 一区二区三区免费观看| 国产精品色在线| 久久精品一二三| 精品国产1区2区3区| 欧美精品v国产精品v日韩精品 | 国产精品你懂的在线欣赏| 欧美tickling挠脚心丨vk| 欧美日韩免费不卡视频一区二区三区| 成人avav影音| 成人黄色av电影| 国产精品主播直播| 国产精品一区二区你懂的| 精品在线亚洲视频| 麻豆视频一区二区| 热久久国产精品| 蜜桃视频在线观看一区二区| 日韩国产精品久久久| 亚洲成a人v欧美综合天堂下载| 尤物视频一区二区| 亚洲综合免费观看高清完整版| 国产精品久久久久久久裸模| 欧美激情一区二区三区在线| 中文字幕免费不卡| 亚洲日本成人在线观看| 亚洲天堂免费在线观看视频| 成人免费在线视频| 亚洲精品欧美综合四区| 一区二区三区在线播放| 亚洲黄色av一区| 午夜不卡av在线| 麻豆成人免费电影| 国产成人在线看| 波多野结衣视频一区| 色婷婷久久综合| 欧美男人的天堂一二区| 欧美一区二区福利在线| 精品久久久久久久久久久久久久久久久| 欧美成人福利视频| 国产日韩av一区| 亚洲日本va午夜在线电影| 亚洲午夜av在线| 美女视频一区在线观看| 国产精品一色哟哟哟| 99免费精品视频| 欧美色网一区二区| 欧美videos大乳护士334| 国产欧美日韩视频一区二区| |精品福利一区二区三区| 亚洲国产成人va在线观看天堂| 日本vs亚洲vs韩国一区三区 | 国产一本一道久久香蕉| 成人午夜精品在线| 色哟哟在线观看一区二区三区| 欧美日韩日本视频| 久久久亚洲高清| 亚洲国产精品久久久久秋霞影院| 精品一区二区三区免费| 91视频国产观看| 日韩一区二区三区免费看| 欧美国产一区视频在线观看| 亚洲最新在线观看| 国产精一品亚洲二区在线视频| 91高清在线观看| 久久久蜜臀国产一区二区| 一区二区三区日韩在线观看| 激情偷乱视频一区二区三区| 色综合久久中文综合久久97| 欧美一区二区二区| 玉米视频成人免费看| 国产精品自拍三区| 欧美精品久久久久久久多人混战| 国产婷婷一区二区| 青草国产精品久久久久久| 色综合天天综合在线视频| 久久综合色综合88| 偷拍自拍另类欧美| 色综合久久综合网97色综合| 久久久国产综合精品女国产盗摄| 亚洲三级在线免费观看| 国产在线精品一区二区三区不卡 | 国产一区二区三区四区五区美女| 色综合色狠狠天天综合色| 亚洲精品在线观| 亚洲国产日产av| 99久久综合国产精品| 久久中文字幕电影| 日韩主播视频在线| 欧美在线啊v一区| 国产精品久久三区| 国产·精品毛片| 26uuu亚洲综合色| 日韩精品免费视频人成| 色老汉av一区二区三区| 国产精品免费人成网站| 韩国精品一区二区| 欧美成人激情免费网| 日本成人在线一区| 欧美精品久久99久久在免费线| 亚洲一区二区三区国产| 91免费看视频| 亚洲天堂福利av| 99久久久久久| 日韩毛片视频在线看| 精品夜夜嗨av一区二区三区| 91精品福利在线一区二区三区| 亚洲一区二区三区中文字幕在线| a在线欧美一区| 国产精品久久久久久久久果冻传媒| 国产剧情一区在线| 国产三级欧美三级日产三级99| 精品在线观看免费| 久久亚洲私人国产精品va媚药| 全国精品久久少妇| 日韩欧美中文一区| 精品一区在线看| 国产亚洲精品bt天堂精选| 国产91丝袜在线播放| 亚洲国产激情av| 91老师国产黑色丝袜在线| 午夜不卡av在线| 欧美日韩精品高清| 秋霞影院一区二区| 久久综合国产精品| 成人免费视频一区二区| 中文字幕一区二区视频| 色综合天天综合狠狠| 亚洲成人福利片| 日韩欧美国产综合一区 | 成av人片一区二区| 亚洲欧美怡红院| 欧美日韩免费视频| 看国产成人h片视频| 国产人成亚洲第一网站在线播放| 成人国产电影网| 亚洲国产精品影院| 日韩一级黄色片| 风间由美中文字幕在线看视频国产欧美| 国产欧美精品在线观看| 99国产精品视频免费观看| 午夜一区二区三区视频| 精品久久免费看| 在线观看一区不卡| 久久99热99| 亚洲欧美偷拍另类a∨色屁股| 欧美日韩大陆一区二区|