python 기반 바둑 알 위치 및 바둑 알 색상 식별
15296 단어 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 포 지 셔 닝 바둑돌 위치 및 바둑돌 색상 인식 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 관심 가 져 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.