def test_overwrite_values_one_manual_row(self): folderStruct = FolderStructure("dirName", "V987") dfRaw = pd.DataFrame() data = list() data.append({'frameNumber': 100,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 101,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 102,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 103,"driftX": 2,"driftY": 7}) dfRaw = dfRaw.append(data, ignore_index=True) ddm = DriftManualData.createBrandNew(folderStruct) ddm.add_manual_drift("101",Point("100","200"), "102",Point("103","211")) # xDrift = 3, yDrift = 11 #Exercise resultDF = ddm.overwrite_values(dfRaw) #Assert dfDict = resultDF.to_dict('records') self.assertEqual(4, len(dfDict)) self.assertEqual(100, dfDict[0]["frameNumber"]) self.assertEqual(2, dfDict[0]["driftX"]) self.assertEqual(7, dfDict[0]["driftY"]) self.assertEqual(101, dfDict[1]["frameNumber"]) self.assertEqual(2, dfDict[1]["driftX"]) self.assertEqual(7, dfDict[1]["driftY"]) self.assertEqual(102, dfDict[2]["frameNumber"]) self.assertEqual(3, dfDict[2]["driftX"]) self.assertEqual(11, dfDict[2]["driftY"]) self.assertEqual(103, dfDict[3]["frameNumber"]) self.assertEqual(2, dfDict[3]["driftX"]) self.assertEqual(7, dfDict[3]["driftY"])
def translatePointCoordinate(self, pointLocation, origFrameID, targetFrameID): # type: (Point, int,int) -> Point drift = self.driftBetweenFrames(origFrameID, targetFrameID) scalingFactor = self.getRedDotsData().scalingFactor( origFrameID, targetFrameID) newPoint = pointLocation.translateBy(drift) X = newPoint.x if X < Frame.FRAME_WIDTH / 2: xOffsetFromMiddle = (Frame.FRAME_WIDTH / 2 - X) / scalingFactor newX = int(Frame.FRAME_WIDTH / 2 - xOffsetFromMiddle) # print ("X smaller old ", X, "newX",newX,"xOffsetFromMiddle",xOffsetFromMiddle,Frame.FRAME_WIDTH) newPoint = Point(newX, newPoint.y) if X > Frame.FRAME_WIDTH / 2: xOffsetFromMiddle = (X - Frame.FRAME_WIDTH / 2) / scalingFactor newX = int(Frame.FRAME_WIDTH / 2 + xOffsetFromMiddle) # print ("X bigger old ", X, "newX",newX,"xOffsetFromMiddle",xOffsetFromMiddle,Frame.FRAME_WIDTH) newPoint = Point(newX, newPoint.y) Y = newPoint.y if Y < Frame.FRAME_HEIGHT / 2: yOffsetFromMiddle = (Frame.FRAME_HEIGHT / 2 - Y) / scalingFactor newY = int(Frame.FRAME_HEIGHT / 2 - yOffsetFromMiddle) newPoint = Point(newPoint.x, newY) if Y > Frame.FRAME_HEIGHT / 2: yOffsetFromMiddle = (Y - Frame.FRAME_HEIGHT / 2) / scalingFactor newY = int(Frame.FRAME_HEIGHT / 2 + yOffsetFromMiddle) newPoint = Point(newPoint.x, newY) return newPoint
def __updateZoomBox(self, imageOrig): # type: (Image) -> void height_offset = int(imageOrig.height() / 4) width_offset = int(imageOrig.width() / 4) self.__zoomBox = Box( Point(width_offset, height_offset), Point(imageOrig.width() - width_offset, imageOrig.height() - height_offset))
def __showCrabWindow(self, imageToShow): crabWin = ImageWindow.createWindow("crabImage", Box(Point(0, 0), Point(800, 800))) crabWin.showWindowAndWaitForTwoClicks(imageToShow.asNumpyArray()) crabWin.closeWindow() if crabWin.userClickedMouseTwice(): self.__line_marked_by_user = crabWin.featureBox return True else: return False
def __drawGridX(self, imgObj, startingPoint, distancePix): verticalTop = Point(startingPoint.x + distancePix, 0) verticalBottom = Point(startingPoint.x + distancePix, imgObj.height()) horisontalLeft = Point(0, startingPoint.y + distancePix) horisontalRight = Point(imgObj.width(), startingPoint.y + distancePix) imgObj.drawLine(verticalTop, verticalBottom, thickness=3, color=(255, 255, 0)) imgObj.drawLine(horisontalLeft, horisontalRight, thickness=3, color=(255, 255, 0))
def __constructVisibleArea(self, nextFrameID, boxSize): #timer = MyTimer("__constructVisibleArea") offset = int(boxSize / 2) newPoint = self.getCoordinateInFrame(nextFrameID) #timer.lap("calling Drift Data") topleft = Point(max(newPoint.x - offset, 0), max(newPoint.y - offset, 0)) bottomRight = Point(min(newPoint.x + offset, Frame.FRAME_WIDTH), min(newPoint.y + offset, Frame.FRAME_HEIGHT)) visibleBoxArea = Box(topleft, bottomRight) #timer.lap() return visibleBoxArea
def test_overwrite_values_two_overlapping_manual_rows(self): folderStruct = FolderStructure("dirName", "V987") dfRaw = pd.DataFrame() data = list() data.append({'frameNumber': 100,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 101,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 102,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 103,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 104,"driftX": 2,"driftY": 7}) data.append({'frameNumber': 105,"driftX": 2,"driftY": 7}) dfRaw = dfRaw.append(data, ignore_index=True) ddm = DriftManualData.createBrandNew(folderStruct) ddm.add_manual_drift("101",Point("100","200"), "103",Point("106","222")) # xDrift = 3, yDrift = 11 ddm.add_manual_drift("102",Point("400","800"), "104",Point("410","826")) # xDrift = 5, yDrift = 13 #Exercise resultDF = ddm.overwrite_values(dfRaw) #Assert dfDict = resultDF.to_dict('records') self.assertEqual(6, len(dfDict)) self.assertEqual(100, dfDict[0]["frameNumber"]) self.assertEqual(2, dfDict[0]["driftX"]) self.assertEqual(7, dfDict[0]["driftY"]) self.assertEqual(101, dfDict[1]["frameNumber"]) self.assertEqual(2, dfDict[1]["driftX"]) self.assertEqual(7, dfDict[1]["driftY"]) self.assertEqual(102, dfDict[2]["frameNumber"]) self.assertEqual(3, dfDict[2]["driftX"]) self.assertEqual(11, dfDict[2]["driftY"]) #second manual row overwrites values of the first row. self.assertEqual(103, dfDict[3]["frameNumber"]) self.assertEqual(5, dfDict[3]["driftX"]) self.assertEqual(13, dfDict[3]["driftY"]) self.assertEqual(104, dfDict[4]["frameNumber"]) self.assertEqual(5, dfDict[4]["driftX"]) self.assertEqual(13, dfDict[4]["driftY"]) self.assertEqual(105, dfDict[5]["frameNumber"]) self.assertEqual(2, dfDict[5]["driftX"]) self.assertEqual(7, dfDict[5]["driftY"])
def test_add_manual_drift(self): folderStruct = FolderStructure("dirName", "V987") ddm = DriftManualData.createBrandNew(folderStruct) #Exercise ddm.add_manual_drift(100,Point(125,175), 200,Point(225,375)) #Assert dfDict = ddm.getPandasDF().to_dict('records') self.assertEqual(1, len(dfDict)) self.assertEqual("100", dfDict[0][DriftManualData.COLNAME_frameNumber_1]) self.assertEqual("200", dfDict[0][DriftManualData.COLNAME_frameNumber_2]) self.assertEquals(125, int(dfDict[0][DriftManualData.COLNAME_locationX_1])) self.assertEqual(175, int(dfDict[0][DriftManualData.COLNAME_locationY_1])) self.assertEqual(225, int(dfDict[0][DriftManualData.COLNAME_locationX_2])) self.assertEqual(375, int(dfDict[0][DriftManualData.COLNAME_locationY_2]))
def showUI(self, frameID, gapSize=None): while True: image = self.__videoStream.readImageObj(frameID) self.__updateZoomBox(image) zoomImage = image.subImage(self.__getZoomBox()) zoomImage.drawFrameID(frameID) if gapSize is not None: gapText = "Gap: " + str(int(gapSize)) box = Box( Point(zoomImage.width() - 180, zoomImage.height() - 50), Point(zoomImage.width(), zoomImage.height())) zoomImage.drawTextInBox(box, gapText) keyPressed = self.__imageZoomWin.showWindowAndWaitForTwoClicks( zoomImage.asNumpyArray()) user_input = UserInput(keyPressed) if user_input.is_command_quit(): message = "User pressed Q button" print message return None if user_input.is_mouse_click(): return frameID if user_input.is_key_arrow_down(): # show frame +2 away frameID = frameID + 2 elif user_input.is_key_arrow_up(): # show frame -2 away frameID = frameID - 2 elif user_input.is_key_arrow_right(): # show frame +20 away frameID = frameID + 20 elif user_input.is_key_arrow_left(): # show frame -20 away frameID = frameID - 20 else: print("invalid Key pressed:", keyPressed)
def __markCrabsOnImage(self, mainImage, frame_id): #timer = MyTimer("crabsOnFrame") markedCrabs = self.__crabsOnFrame(frame_id) #timer.lap("frame_number: " + str(frame_id)) for markedCrab in markedCrabs: #print ('markedCrab', markedCrab) frame_number = markedCrab['frameNumber'] crabLocationOrig = Point(markedCrab['crabLocationX'], markedCrab['crabLocationY']) crabLocation2 = self.__seefloorGeometry.translatePointCoordinate( crabLocationOrig, frame_number, frame_id) mainImage.drawCross(crabLocation2, color=(255, 0, 0))
def __paintMarkersOnImage(self, mainImage, frame_id): #timer = MyTimer("MarkersOnFrame") markers = self.__markersOnFrame(frame_id) if markers is None: return #timer.lap("drawing markers on frame: " + str(frame_id)) for marker in markers: #print ('marker', marker) frame_number = marker['frameNumber'] marker_id = marker['markerId'] orig_location = Point(marker['locationX'], marker['locationY']) location = self.__seefloorGeometry.translatePointCoordinate( orig_location, frame_number, frame_id) self._drawMarkerOnImage(mainImage, marker_id, location)
def test_Feature_frameBeforeFirst_throwsValueErrorException(self): # Setup df = pd.DataFrame() df = df.append({ 'frameNumber': int(71), 'driftY': 13, 'driftX': -3 }, ignore_index=True) df = df.append({ 'frameNumber': int(73), 'driftY': 13, 'driftX': -3 }, ignore_index=True) df = df.append({ 'frameNumber': int(75), 'driftY': 13, 'driftX': -3 }, ignore_index=True) driftData = DriftData(df) location = Point( 1442, 608) # some valid value that is irrelevant for the test box_size = 200 # some valid value that is irrelevant for the test # Exercise with self.assertRaises(Exception) as cm: Feature(driftData, 60, location, box_size) the_exception = cm.exception # Assert self.assertIsInstance(the_exception, ValueError) self.assertEqual( the_exception.message, "Frame Number below minimum. Passed frame: 60. Minimum frame: 71")
def test_Feature_closeToFirstAndLastFrame_returnsNone(self): # Setup df = pd.DataFrame() #df = pd.DataFrame(columns=['frameNumber', 'driftY']) df = df.append({ 'frameNumber': int(71), 'driftY': 13, 'driftX': -3 }, ignore_index=True) df = df.append({ 'frameNumber': int(73), 'driftY': 13, 'driftX': -3 }, ignore_index=True) df = df.append({ 'frameNumber': int(75), 'driftY': 13, 'driftX': -3 }, ignore_index=True) driftData = DriftData(df) location = Point(1442, 608) box_size = 200 # Exercise feature_firstFrame = Feature(driftData, 71, location, box_size) feature_middleFrame = Feature(driftData, 73, location, box_size) feature_lastFrame = Feature(driftData, 75, location, box_size) # Assert self.assertIsNotNone(feature_firstFrame) self.assertIsNotNone(feature_middleFrame) self.assertIsNotNone(feature_lastFrame)
StreamToLogger(folderStruct.getLogFilepath()) print("Starting markCrabs script") timer = MyTimer("Starting MarkCrabs") videoStream = VideoStream(folderStruct.getVideoFilepath()) timer.lap("Initialized VideoStream") interpolator = InterpolateController(folderStruct) interpolator.regenerateSeefloor() timer.lap("Interpolated Seefloor") driftData = DriftData.createFromFolderStruct(folderStruct) timer.lap("Initialized DriftData") imageWin = ImageWindow("mainWindow", Point(700, 200)) timer.lap("Initialized ImageWindow") scientistUI = ScientistUI(imageWin, folderStruct, videoStream, driftData) timer.lap("Initialized ScientistUI") #Uncomment two lines below to get a nice summary which function uses the most time during excecution #import cProfile #cProfile.run('scientistUI.processVideo()') scientistUI.processVideo() timer.lap("Finished session") # close all open windows cv2.destroyAllWindows()
def __init__(self, videoStream): # type: (VideoStream) -> RedDotsUI self.__videoStream = videoStream self.__imageZoomWin = ImageWindow("zoomImg", Point(100, 100))
class RedDotsUI: # we expect Red Dots to be alwas withing these Coordinates. If red dots wander outside, then these coordinates shoud be expanded __zoomBox = Box(Point(400, 200), Point(1500, 900)) #__zoomBox = Box(Point(572, 548), Point(2500, 1500)) def __init__(self, videoStream): # type: (VideoStream) -> RedDotsUI self.__videoStream = videoStream self.__imageZoomWin = ImageWindow("zoomImg", Point(100, 100)) def selectedRedDots(self): redDotsInCoordinatesOfZoomWin = self.__imageZoomWin.featureBox redDots = redDotsInCoordinatesOfZoomWin.translateCoordinateToOuter( self.__getZoomBox().topLeft) print("redDotsInCoordinatesOfZoomWin", str(redDotsInCoordinatesOfZoomWin), "redDots", str(redDots)) return redDots def closeWindow(self): self.__imageZoomWin.closeWindow() def showUI(self, frameID, gapSize=None): while True: image = self.__videoStream.readImageObj(frameID) self.__updateZoomBox(image) zoomImage = image.subImage(self.__getZoomBox()) zoomImage.drawFrameID(frameID) if gapSize is not None: gapText = "Gap: " + str(int(gapSize)) box = Box( Point(zoomImage.width() - 180, zoomImage.height() - 50), Point(zoomImage.width(), zoomImage.height())) zoomImage.drawTextInBox(box, gapText) keyPressed = self.__imageZoomWin.showWindowAndWaitForTwoClicks( zoomImage.asNumpyArray()) user_input = UserInput(keyPressed) if user_input.is_command_quit(): message = "User pressed Q button" print message return None if user_input.is_mouse_click(): return frameID if user_input.is_key_arrow_down(): # show frame +2 away frameID = frameID + 2 elif user_input.is_key_arrow_up(): # show frame -2 away frameID = frameID - 2 elif user_input.is_key_arrow_right(): # show frame +20 away frameID = frameID + 20 elif user_input.is_key_arrow_left(): # show frame -20 away frameID = frameID - 20 else: print("invalid Key pressed:", keyPressed) def __getZoomBox(self): return self.__zoomBox def __updateZoomBox(self, imageOrig): # type: (Image) -> void height_offset = int(imageOrig.height() / 4) width_offset = int(imageOrig.width() / 4) self.__zoomBox = Box( Point(width_offset, height_offset), Point(imageOrig.width() - width_offset, imageOrig.height() - height_offset))
def getRedDot2(self, frameId): # type: (int) -> Point dfResult = self.__rowForFrame(frameId) x = dfResult["centerPoint_x_dot2"].iloc[0] y = dfResult["centerPoint_y_dot2"].iloc[0] return Point(int(x),int(y))