Untitled
unknown
python
3 years ago
4.4 kB
7
Indexable
''' Created on 5 gru 2022 @author: SzymonPolak ''' import cv2 import numpy as np import math import itertools import random class InitiatorEstimator: def __init__(self): self.idealPoint = Point("Ideal point", 0 ,0) self.chosenPoint = Point("Chosen point", 0 ,0) def findMinAvgPoint(self, pointDistances): minAverage = pointDistances[0].averageDistance() bestPoint = pointDistances[0].testPoint for pd in pointDistances: if pd.averageDistance() < minAverage: minAverage = pd.averageDistance() bestPoint = pd.testPoint bestPoint.name = bestPoint.name+" best initiator" bestPoint.color = (0,0,255) print("Min avg point is:", bestPoint.name) return bestPoint class PointDistance: def __init__(self, testPoint, points): self.testPoint = testPoint self.points = points self.distances = [] self.avgDistance = 0 def averageDistance(self): distanceSum = 0 for d in self.distances: distanceSum = distanceSum+d self.avgDistance = distanceSum/len(self.distances) print(self.testPoint.name, "avg distance:", self.avgDistance) return self.avgDistance def calcDistances(self): for p in self.points: self.distances.append(self.calcDistance(self.testPoint, p)) return def listDistances(self): for (point, distance) in zip(self.points, self.distances): print(self.testPoint.name, "->", point.name, ":", distance) def calcDistance(self, pointA, pointB): xAxisDiff = abs(pointA.x - pointB.x) yAxisDiff = abs(pointA.y - pointB.y) powered = math.pow(xAxisDiff,2)+math.pow(yAxisDiff,2) #print("id:",pointA.name, "x:", pointA.x, "y:", pointA.y, "id:",pointB.name, pointB.x, pointB.y, "xdiff:",xAxisDiff, "ydiff:", yAxisDiff, "distance:", math.sqrt(powered)) return math.sqrt(powered) class Point(): def __init__(self, name, x, y): self.x=x self.y=y self.name = name self.color = (255,0,0) def setCoords(self, x, y): self.x = x self.y = y def drawPoint(self, image): radius = 5 thickness = 2 coords = (self.x, self.y) cv2.circle(image, coords, radius, self.color, thickness) font = cv2.FONT_HERSHEY_SIMPLEX fontScale = 0.50 coords = (self.x-15, (self.y)+20) cv2.putText(image, self.name, coords, font, fontScale, self.color, 1, cv2.LINE_AA) @staticmethod def drawPoints( image, points): for point in points: point.drawPoint(image) def createImage(height, width): image = np.zeros((width,height,3), np.uint8) image[0:height,0:width] = (255,255,255) # white background return image def createListOfPointDistances(anchorPoints): PointDistances = [] for p in anchorPoints: PointDistances.append(PointDistance(p, anchorPoints)) return PointDistances if __name__ == '__main__': image = createImage(900, 900) initiatorestimator = InitiatorEstimator() #anchors = [ Point("0000", 200, 200), Point("1111", 400, 200), Point("2222", 600, 200), Point("3333", 200, 400), Point("4444", 400, 400), Point("5555", 600, 400), Point("6666", 200, 600), Point("7777", 400, 600), Point("8888", 600, 600)] anchorsTest = [ Point("A", random.randint(100, 400), random.randint(100, 400)), Point("B", random.randint(100, 400), random.randint(100, 400)), Point("C", random.randint(100, random.randint(100, 400)), 200), Point("D", random.randint(100, 400), random.randint(100, 400)), Point("F", random.randint(100, 400), random.randint(100, 400)), Point("G", random.randint(100, 400), random.randint(100, 400)),Point("H", random.randint(100, 400), random.randint(100, 400)) ,Point("I", random.randint(100, 400), random.randint(100, 400)) ] pointDistances = createListOfPointDistances(anchorsTest) for pd in pointDistances: pd.calcDistances() Point.drawPoints(image, anchorsTest) initiatorestimator.findMinAvgPoint(pointDistances).drawPoint(image) cv2.imshow('frame', image) cv2.waitKey(0)
Editor is loading...