def getEdges(self, scale, thresholdFactor): laplacianOfGaussian = ndimage.gaussian_laplace(self._image, scale) # ish 0.57 seconds zeroCrossings = _findZeroCrossings(laplacianOfGaussian, thresholdFactor) # ish 0.25 sec result = PointCloud() for x, y in zip(zeroCrossings[0], zeroCrossings[1]): result.addXY(float(x), float(y)) return result
def test_simple(self): encoder = PointCloudJsonEncoder() cloud = PointCloud() cloud.addXY(0.0, 1.0) cloud.addXY(2.0, 3.0) jsonDict = encoder.default(cloud) self.assertEqual(jsonDict, {'__type__': 'PointCloud', 'points': [{'x': 0.0, 'y': 1.0}, {'x': 2.0, 'y': 3.0}]})
def dict_to_object(self, d): if "__type__" not in d: return d if d["__type__"] == "PointCloud": result = PointCloud() for point in d["points"]: result.addXY(point["x"], point["y"]) return result return d
def test_AddPoints(self): c = PointCloud() c.addPoint([1.0, 2.0]) c.addXY(3.0, 4.0) points = [p for p in c] self.assertEquals(points[0][0], 1.0) self.assertEquals(points[0][1], 2.0) self.assertEquals(points[1][0], 3.0) self.assertEquals(points[1][1], 4.0) self.assertEquals(c.max(), (3.0, 4.0)) self.assertEquals(c.min(), (1.0, 2.0)) self.assertEquals(c.mean(), (2.0, 3.0))
def test_SimpleImage(self): simpleImage = np.zeros((12, 12)) simpleImage[1, 1] = 255 expectedPointCloud = PointCloud() expectedPointCloud.addXY(0.5, 0.0) expectedPointCloud.addXY(1.5, 2.0) expectedPointCloud.addXY(0.0, 0.5) expectedPointCloud.addXY(2.0, 1.5) e = EdgeDetector(simpleImage) pointCloud = e.getEdges(1.0, 17.0) for point, expectedPoint in zip(pointCloud, expectedPointCloud): self.assertEqual(point[0], expectedPoint[0]) self.assertEqual(point[1], expectedPoint[1])
def test_ToRgb(self): c = PointCloud() image = PointCloudToRgbImage(c, 0) rows, cols, channels = image.shape self.assertEquals(channels, 3) for element in np.nditer(image): self.assertEquals(element, 0.0) c.addXY(0.0, 0.0) c.addXY(10.0, 10.0) image = PointCloudToRgbImage(c, 0) rows, cols, channels = image.shape self.assertEquals(rows, 11) self.assertEquals(cols, 11) self.assertEquals(image[0, 0, 0], 255) self.assertEquals(image[0, 0, 1], 0) self.assertEquals(image[0, 0, 2], 0) self.assertEquals(image[10, 10, 0], 255) self.assertEquals(image[10, 10, 1], 0) self.assertEquals(image[10, 10, 2], 0) self.assertEquals(np.sum(image), 510)
class KeepInsideRadiusStage: def __init__(self, radius): self._radius = radius self._executionResult = None def execute(self, pointCloud): mean = pointCloud.mean() self._executionResult = PointCloud() radiusSquare = self._radius**2 for x, y in pointCloud: squareDistanceFromMean = float((x - mean[0])**2 + (y - mean[1])**2) if squareDistanceFromMean <= radiusSquare: self._executionResult.addXY(float(x), float(y)) return self._executionResult def getImageRepresentation(self): return PointCloudToRgbImage(self._executionResult, 0) def __ne__(self, other): if type(self) != type(other): return True return self._radius != other._radius
def test_SimpleWrite(self): cloud = PointCloud() cloud.addXY(0.0, 0.0) cloud.addXY(1.0, 2.0) writeable = self.StringStorer() PointCloudHandler.savePointCloudToWriteable(cloud, writeable) oneString = "".join(writeable.strings) expectedString = '{\n'\ ' "__type__": "PointCloud",\n'\ ' "points": [\n'\ ' {\n'\ ' "x": 0.0,\n'\ ' "y": 0.0\n'\ ' },\n'\ ' {\n'\ ' "x": 1.0,\n'\ ' "y": 2.0\n'\ ' }\n'\ ' ]\n'\ '}' self.assertEquals(oneString, expectedString)
def test_AddNonFloatXY(self): c = PointCloud() with self.assertRaises(ValueError): c.addXY(2.0, "not float")