import sys sys.path.append("../src") import os import math import heapq import cv2 as cv import numpy as np import scipy.cluster import scipy.ndimage from annotations import DataFile,computeBoundingBox from hough import show from analyzer.epoint import EPoint class NeighboringPoint(EPoint): def __init__(self,x,y): super().__init__(x,y) self.neighbours=[] def kmeans(img): arr=np.reshape(img,(-1,3)).astype(np.float) colors=np.array([[0,0,0],[255,255,255],[193,165,116]],np.float) print(colors) (centers,distortion)=scipy.cluster.vq.kmeans(arr,colors) print("k-means centers:",centers) return centers def quantize(img,centers): origShape=img.shape data=np.reshape(img,(-1,3)) (keys,dists)=scipy.cluster.vq.vq(data,centers) pixels=np.array([centers[k] for k in keys],dtype=np.uint8).reshape(origShape) return pixels def filterStones(contours,bwImg,stoneDims): contourImg=cv.cvtColor(bwImg,cv.COLOR_GRAY2BGR) res=[] for (i,c) in enumerate(contours): keep=True moments=cv.moments(c) center=(moments["m10"]/(moments["m00"] or 1), moments["m01"]/(moments["m00"] or 1)) area=cv.contourArea(c) (x,y,w,h)=cv.boundingRect(c) if w>stoneDims[0] or h>stoneDims[1]*1.3 or w<2 or h<2: cv.drawMarker(contourImg,tuple(map(int,center)),(0,0,255),cv.MARKER_TILTED_CROSS,12) keep=False coverage1=area/(w*h or 1) hull=cv.convexHull(c) coverage2=area/(cv.contourArea(hull) or 1) if coverage2<0.8: cv.drawMarker(contourImg,tuple(map(int,center)),(0,127,255),cv.MARKER_DIAMOND,12) keep=False if keep: res.append((EPoint(*center),c)) cv.drawMarker(contourImg,tuple(map(int,center)),(255,0,0),cv.MARKER_CROSS) print("accepted:",len(res)) print("rejected:",len(contours)-len(res)) show(contourImg) return res def computeDistances(points): n=len(points) res=np.zeros((n,n),dtype=np.float32) for (i,a) in enumerate(points): for (j,b) in enumerate(points): if j0 else 1000) neighborhood[i].neighbours=[neighborhood[j] for (j,d) in neighbours] return neighborhood def growLine(r,s): """:param r: NeighboringPoint :param s: NeighboringPoint :return: NeighboringPoint or None""" u=s-r alpha=math.atan2(u.y,u.x) t=None beta=alpha+math.pi # -alpha for t_ in s.neighbours: v=t_-s beta_=math.atan2(v.y,v.x) # beta_ in (-pi, pi] if abs(abs(alpha-beta_)-math.pi)>abs(abs(alpha-beta)-math.pi): beta=beta_ t=t_ if abs(alpha-beta)1 or True: print(length,p,q) cv.line(linesImg,(int(p.x),int(p.y)),(int(q.x),int(q.y)),(255,255,0),min((length+1)//2,3)) show(linesImg) cv.imwrite("/tmp/img.png",linesImg)