diff --git a/exp/stone_detect.py b/exp/stone_detect.py --- a/exp/stone_detect.py +++ b/exp/stone_detect.py @@ -1,5 +1,9 @@ +import sys +sys.path.append("../src") + import os -import sys +import math +import heapq import cv2 as cv import numpy as np @@ -8,6 +12,13 @@ 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): @@ -27,38 +38,79 @@ def quantize(img,centers): return pixels -def filterContours(contours,bwImg,stoneDims): +def filterStones(contours,bwImg,stoneDims): contourImg=cv.cvtColor(bwImg,cv.COLOR_GRAY2BGR) res=[] for (i,c) in enumerate(contours): keep=True - print(i) moments=cv.moments(c) center=(moments["m10"]/(moments["m00"] or 1), moments["m01"]/(moments["m00"] or 1)) - print("center:", center) area=cv.contourArea(c) - print("area:",area) (x,y,w,h)=cv.boundingRect(c) - print("bounding box:",(x,y,w,h)) 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) - print("coverage1:",coverage1) hull=cv.convexHull(c) coverage2=area/(cv.contourArea(hull) or 1) - print("coverage2:",coverage2) if coverage2<0.8: cv.drawMarker(contourImg,tuple(map(int,center)),(0,127,255),cv.MARKER_DIAMOND,12) keep=False - print() if keep: - res.append(c) + 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)