python識(shí)別圍棋定位棋盤位置
最近需要做一個(gè)圍棋識(shí)別的項(xiàng)目,首先要將棋盤位置定位出來,效果圖如下:
效果圖原圖
中間處理效果
最終結(jié)果
我們利用python opencv的相關(guān)函數(shù)進(jìn)行操作實(shí)現(xiàn),根據(jù)棋盤顏色的特征,尋找到相關(guān)特征,將棋盤區(qū)域摳出來。最好從原始圖像中將棋盤位置截取出來。
源碼:定位棋盤位置from PIL import ImageGrabimport numpy as npimport cv2from glob import globimglist = sorted(glob('screen/*.jpg'))for i in imglist:# while 1: img = cv2.imread(i) 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:continue#多邊形擬合 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()
帶保存圖像
from PIL import ImageGrabimport numpy as npimport cv2from glob import globimport osimglist = sorted(glob('screen/*.jpg'))a=0for i in imglist:# while 1: a=a+1 img = cv2.imread(i) 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) # 保存圖片的地址 img_file_1 = './temp' # 確認(rèn)上述地址是否存在 if not os.path.exists(img_file_1):os.mkdir(img_file_1) cv2.imshow('0',img) cv2.imwrite(img_file_1 + '/' + ’temp_%d.jpg’%a, 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:continue#多邊形擬合 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) # 保存圖片的地址 img_file_2 = './checkerboard' # 確認(rèn)上述地址是否存在 if not os.path.exists(img_file_2):os.mkdir(img_file_2) cv2.imwrite(img_file_2 + '/' + ’checkerboard_%d.jpg’%a, checkerboard)cv2.destroyAllWindows()
到此這篇關(guān)于python識(shí)別圍棋定位棋盤位置的文章就介紹到這了,更多相關(guān)python 圍棋定位棋盤位置內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP中常用的22個(gè)FSO文件操作函數(shù)整理2. 無線標(biāo)記語言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁3. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp4. .Net core 的熱插拔機(jī)制的深入探索及卸載問題求救指南5. SharePoint Server 2019新特性介紹6. html清除浮動(dòng)的6種方法示例7. asp的SQL語句中and和or同時(shí)使用的注意事項(xiàng)8. 讀大數(shù)據(jù)量的XML文件的讀取問題9. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過程解析10. React+umi+typeScript創(chuàng)建項(xiàng)目的過程
