python 기반 바둑 알 위치 및 바둑 알 색상 식별

이 편 은 주로 바둑돌 의 위 치 를 정 하고 바둑돌 의 색깔 을 식별 하 는 것 을 실현 한다.
바둑판 의 원 도 는 다음 과 같다.
在这里插入图片描述
이전 장절 처 리 를 통 해 바둑판 의 위 치 를 찾 았 습 니 다.다음 과 같 습 니 다.
在这里插入图片描述
현재 새 그림 에 따라 바둑 알 의 위 치 를 정 합 니 다.
1.바둑판 을 19x 19 의 작은 격자 로 나눈다.
바둑판 의 각 교차점 에 바둑 알 이 있 는 지 확인 하기 위해 서 는 바둑판 을 19X 19 의 작은 사각형 으로 나 누 어야 한다.바둑판 의 각 교차 선 은 직접 거리 가 같 고 사각형 이기 때문에 작은 사각형 으로 나 누 는 것 이 매우 쉽다.다음 과 같은 그림 이다.
在这里插入图片描述
바둑판 을 19x 19 의 작은 사각형 으로 나 누 려 면 다음 과 같은 몇 가지 인 자 를 알 아야 한다.

small_length=38  #      
qizi_zhijing=38#    
zuoshangjiao=20#       
imagewathch(VS 아래 opencv 플러그 인)도 구 를 사용 할 수 있 습 니 다.이 도 구 는 그림 의 너비 와 높이,특정한 위치의 픽 셀 값 을 실시 간 으로 볼 수 있 습 니 다.이 도구 의 사용 은 나의 다른 글 을 볼 수 있다.opencv VS 2013 디 버 깅 시 Image Watch 플러그 인 으로 그림 보기한 무더기 의 데 이 터 를 대체 하여 매우 직관 적 이다.
다음은 원 도 를 19X 19 작은 격자 로 나 누 는 코드 입 니 다.

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 = i
        hang = j
        Tp_x = small_length * lie
        Tp_y = small_length * hang
        Tp_width = qizi_zhijing
        Tp_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+w
        cv2.imwrite('img_temp3.jpg', img_temp)
        cv2.imshow("3", img_temp)
        cv2.waitKey(20)
2.픽 셀 비례 에 따라 검은색 바둑돌 인지 아 닌 지 를 식별한다
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
위의 세 가지 이미 지 는 우리 가 작은 격자 로 나 눈 후의 세 가지 주요 형태 로 각각 검은색 바둑 알,흰색 바둑 알 과 바둑 알 이 없 는 것 을 대표 한다.그 중에서 검은색 바둑 알 을 찾 는 것 이 가장 좋다.우 리 는 그림 을 그 레이스 케 일 화―이치 화 한 후에 검은색 픽 셀 의 비례 가 일정한 수 치 를 초과 하면 이곳 에 검은색 바둑 알 이 있 는 지 아 닌 지 를 알 수 있다.
여기 서 나 는 검은색 비례 를 통계 하 는 코드 를 하나의 함수 로 봉 했다.다음 과 같다.

"""  "*******************************************************************************************
*     :               
*     :       ,
*      :         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

3.화소 비례 에 따라 흰색 바둑돌 인지 아 닌 지 를 식별한다
마찬가지 로 우 리 는 픽 셀 에서 흰색 이 차지 하 는 비례 를 통계 하여 이 위치 가 흰색 바둑돌 인지 아 닌 지 를 식별 할 수 있다.그러나 여기 서 주의해 야 할 문 제 는 위의 검은색 바둑돌 식별 방법 에 따라 그 레이스 케 일 화,이치 화 를 하면 흰색 바둑돌 과 바둑 알 이 없 는 것 을 구분 하지 못 하고 이들 은 모두 대면 적의 흰색 이 있 기 때문에 이치 화의 한도 값 을 조정 해 야 한다.바둑 알 과 흰색 바둑 알 이 없 는 그림 을 분리 합 니 다.
봉 인 된 코드 는 다음 과 같 습 니 다:

"""  "*******************************************************************************************
*     :               
*     :       ,
*      :         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
효과 도 는 다음 과 같다.
在这里插入图片描述
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)
효과 도 는 다음 과 같다.
在这里插入图片描述
전체 코드 는 다음 과 같 습 니 다:

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

import 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 modChar
def 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 = 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

"""  "*******************************************************************************************
*     :         
*     :      
*      :         
*     : 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("
") #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、 ; ********************************************''' list1=dingweiqizi_yanse_weizhi(img_after) print(list1)
python 기반 바둑돌 위치 및 바둑돌 색상 인식 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 포 지 셔 닝 바둑돌 위치 및 바둑돌 색상 인식 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 관심 가 져 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기