예제 #1
0
    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"])
예제 #2
0
    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
예제 #3
0
 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))
예제 #4
0
    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))
예제 #6
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
예제 #7
0
    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"])
예제 #8
0
    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]))
예제 #9
0
    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)
예제 #12
0
    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")
예제 #13
0
    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)
예제 #14
0
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()
예제 #15
0
 def __init__(self, videoStream):
     # type: (VideoStream) -> RedDotsUI
     self.__videoStream = videoStream
     self.__imageZoomWin = ImageWindow("zoomImg", Point(100, 100))
예제 #16
0
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))
예제 #17
0
 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))