示例#1
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModuleInputVideoPipe.__init__(self)
        OTPAdaptativeThresholdFilter.__init__(self)
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
       
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        #THRESHOLD 
        self._blockSize = OTParamSlider("Block size", 3, 3, 1000,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 255, 0, 510,varname='_param_tb_c')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._th_thresholdType = OTParamCombo("ThresholdType",varname='_param_tb_threshold_type')
        self._th_thresholdType.addItem("THRESH_BINARY", cv2.THRESH_BINARY)
        self._th_thresholdType.addItem("THRESH_BINARY_INV", cv2.THRESH_BINARY_INV)
        #END THRESHOLD

        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue
        
        self._formset = [ 
                '_video',"_player",
                ('_adaptiveMethod','_th_thresholdType'), 
                ('_blockSize',"_C"),
            ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
示例#2
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'icon.jpg')
        OTModuleResultsPlugin.__init__(self, name, iconFile=icon_path)

        self._positions = OTParamPositions("Positions")
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")
        self._nobjects = OTParamSlider("Number of objects to track", 1, 1, 10)
        self._run = OTParamButton("Run")
        self._apply = OTParamButton("Apply changes")
        self._progress = OTParamProgress()

        #self._query.readOnly = True
        self._run.value = self.run
        self._apply.value = self.apply
        self._video.valueUpdated = self.newVideoInputChoosen
        self._player.processFrame = self.processFrame
        self._query.form.tableView.keyPressEvent = self.keyPressEvent

        self._current_row = None

        self._formset = [('_video', "_positions", '_nobjects', '_run'),
                         '_player', '=', ("_results", '_apply'), "_query",
                         "_progress"]

        self._progress.hide()
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPConvertColor.__init__(self)
        OTModulePlugin.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        self._colorDomain = OTParamCombo("Colors space",
                                         varname='_param_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("GRAY", cv2.COLOR_BGR2GRAY)
        self._colorDomain.addItem("XYZ", cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb", cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV", cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS", cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab", cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv", cv2.COLOR_BGR2LUV)

        self._colorDomain.valueUpdated = self.refreshValue

        self._formset = [
            '_video',
            '_colorDomain',
            "_player",
        ]

        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
示例#4
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'icongeo.png')
        OTBaseModuleGeometry.__init__(self,name, iconFile = icon_path)

        self._imgWidth = 0.0
        self._imgHeight = 0.0
        self._startPoint = None
        self._endPoint = None

        self._selectedPoly = None
        self._selectedPoint = None
        

        self._video  = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video")
        self._remove = OTParamButton("Remove")
        self._square = OTParamToggle("Square")
        self._circle = OTParamToggle("Circle")
        self._export = OTParamButton("Export")
        self._import = OTParamButton("Import")

        self._formset = [ '_video',"_player", ("_square", "_circle", " ","_remove"," ", "_export", "_import"), "=", "_polygons" ]

        self._video.valueUpdated = self.videoSelected
        self._square.value = self.square_toggle
        self._circle.value = self.circle_toggle
        self._remove.value = self.remove_clicked
        self._export.value = self.export_clicked
        self._import.value = self.import_clicked
        
        self._player._videoWidget.onDrag = self.onDragInVideoWindow
        self._player._videoWidget.onEndDrag = self.onEndDragInVideoWindow
        self._player._videoWidget.onClick = self.onClickInVideoWindow
        self._player._videoWidget.onDoubleClick = self.onDoubleClickInVideoWindow
        self._player.processFrame = self.processFrame
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModuleInputVideoPipe.__init__(self)
        OTPAdaptativeThreshold.__init__(self)
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
       
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        #THRESHOLD 
        self._blockSize = OTParamSlider("Block size", 3, 3, 500,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 0, 0, 500,varname='_param_tb_c')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._th_colorDomain = OTParamCombo("Colors space",varname='_param_tb_color_domain')
        self._th_colorDomain.addItem("RGB", -1)
        self._th_colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._th_colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._th_colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._th_colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._th_colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._th_colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._th_colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._colorComponent = OTParamCombo("Component",varname='_param_tb_color_component')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._th_thresholdType = OTParamCombo("ThresholdType",varname='_param_tb_threshold_type')
        self._th_thresholdType.addItem("THRESH_BINARY", cv2.THRESH_BINARY)
        self._th_thresholdType.addItem("THRESH_BINARY_INV", cv2.THRESH_BINARY_INV)
        #END THRESHOLD

        self._th_colorDomain.valueUpdated = self.refreshValue
        self._colorComponent.valueUpdated = self.refreshValue
        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue
        
        self._formset = [ 
                '_video',"_player",
                ('_th_colorDomain','_colorComponent','_adaptiveMethod','_th_thresholdType'), 
                ('_blockSize',"_C"),
            ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
示例#6
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconbgcalc.jpg')
        OTModulePlugin.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")

        self._jumpFrame = OTParamSlider("Frame jump step", 1000, 1, 4000)
        self._jump2Frame = OTParamSlider("Compare frame", 1500, 1, 4000)
        self._threshold = OTParamSlider("Threshold", 5, 0, 255)

        self._export = OTParamButton("Export")

        self._editMode = OTParamCheckBox("Edit mode", False)
        self._run = OTParamButton("Run")
        self._player = OTParamPlayer("Video player")
        self._progress = OTParamProgress()

        self._formset = [('_video', '_run', '_editMode', '_export'),
                         ('_jumpFrame', '_jump2Frame', '_threshold'),
                         "_player", "_progress"]

        self._run.value = self.run
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

        self._export.value = self.export_clicked

        self._backgroundDetector = None
        self._progress.hide()
示例#7
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
        OTPThreshImage.__init__(self)
        OTPThreshBlobs.__init__(self)
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")
        self._polygons = OTParamGeometry("Geometry")
        
        self._blockSize = OTParamSlider("Block size", 3, 3, 500,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 0, 0, 500,varname='_param_tb_c')
        self._boxWidth = OTParamSlider("Width", 0, 0, 30,varname='_param_tb_box_width')
        self._boxHeight = OTParamSlider("Height", 0, 0, 30,varname='_param_tb_box_height')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._colorDomain = OTParamCombo("Colors space",varname='_param_tb_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._colorComponent = OTParamCombo("Component",varname='_param_tb_color_component')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._formset = [ 
                ('_video','_polygons'),"_player",('_colorDomain','_colorComponent','_adaptiveMethod'), ('_boxWidth', '_boxHeight'),('_blockSize',"_C")
            ]

        self._colorDomain.valueUpdated = self.refreshValue
        self._colorComponent.valueUpdated = self.refreshValue
        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._boxHeight.valueUpdated = self.refreshValue
        self._boxWidth.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModulePlugin.__init__(self, name, iconFile=icon_path)

        self._video1 = OTParamVideoInput("Video 1")
        self._video2 = OTParamVideoInput("Video 2")
        self._player = OTParamPlayer("Video player")

        self._formset = [('_video1', '_video2'), "_player"]

        self._player.processFrame = self.processFrame
        self._video1.valueUpdated = self.newVideoInputChoosen
示例#9
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconvi.jpg')
        super(OTModuleVideoInput, self).__init__(name, iconFile=icon_path)
        OTModuleInputVideo.__init__(self)

        self._file = OTParamFile("File")
        self._player = OTParamPlayer("Video", varname='__capture')
        self._progress = OTParamProgress()

        self._formset = ["_file", "_player", "_progress"]

        self._file.valueUpdated = self.videoSelected
        self._progress.hide()
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPSplitColors.__init__(self)
        OTModulePlugin.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        self._colorComponent = OTParamCombo("Component",
                                            varname='_split_color_channel')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._colorComponent.valueUpdated = self.refreshValue

        self._formset = [
            '_video',
            '_colorComponent',
            "_player",
        ]

        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
        OTPFindBlobs.__init__(self)

        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        self._minArea = OTParamSlider("Blob min. area", 100,   0,  50000, varname='_param_min_area')
        self._maxArea = OTParamSlider("Blob max. area", 10000, 0, 100000, varname='_param_max_area')

        self._formset = [ '_video', ('_minArea','_maxArea'), "_player" ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
示例#12
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
        OTPSelectBiggerBlobs.__init__(self)

        self._video = OTParamVideoInput("Video")
        self._blobs  = OTParamModuleConnection("Blobs", connecting=OTModuleBlobs)
        self._player = OTParamPlayer("Video player")

        self._howMany = OTParamSlider("How many?", 1, 1, 20, varname='_param_n_blobs')

        self._formset = ['_video','_blobs', '_howMany', "_player" ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'centre.png')
        super(OTModuleCircleCenter, self).__init__(name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video")
        self._run = OTParamButton("Run")

        self._formset = [('_video', '_run'), "_player"]

        self._video.valueUpdated = self.videoSelected
        self._run.value = self.__run

        self._center = None
        self._player.processFrame = self.processFrame
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'radius.png')
        OTBaseModuleGeometry.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._circlecenter = OTParamModuleConnection(
            "Circle center", connecting=OTModuleCircleCenter)
        self._player = OTParamPlayer("Video")
        self._run = OTParamButton("Run")

        self._formset = [('_video', '_circlecenter', '_run'), "_player", "=",
                         '_polygons']

        self._video.valueUpdated = self.videoSelected
        self._run.value = self.__run

        self._radius = None
        self._player.processFrame = self.processFrame
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconmask.jpg')
        OTModulePlugin.__init__(self, name, iconFile=icon_path)
        OTModuleInputVideoPipe.__init__(self)

        self._polygons = OTParamModuleConnection(
            "Polygons", connecting=OTBaseModuleGeometry)
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video")

        self._formset = ['_video', "_polygons", "_player"]

        self._video.valueUpdated = self.videoSelected
        self._polygons.valueUpdated = self.polygonsSelected
        self._player.processFrame = self.processFrame

        self._mask_color = None
        self._mask_gray = None
示例#16
0
class OTModuleColorFilter(OTModulePlugin,OTModuleInputVideo,OTModulePositions, OTPRemoveBackground, OTPColorFilter, OTPAdaptativeThreshold, OTPBlur, OTPMaskImage,OTPCanny, OTPFindBlobs, OTPSelectBiggerBlobs):
    

    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPRemoveBackground.__init__(self)
        OTPColorFilter.__init__(self)        
        OTPAdaptativeThreshold.__init__(self)
        OTPBlur.__init__(self)
        OTPFindBlobs.__init__(self)
        OTPSelectBiggerBlobs.__init__(self)
        OTPMaskImage.__init__(self)
        OTPCanny.__init__(self)
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        #self._polygons = OTParamGeometry("Geometry")
        self._background = OTParamBackground("Background", varname='_param_background')
        self._threshold = OTParamSlider("Threshold", 110, 1, 255, varname='_param_background_threshold')
        self._minArea = OTParamSlider("Blob min. area",100, 0, 50000, varname='_param_min_area')
        self._maxArea = OTParamSlider("Blob max. area", 10000, 0, 100000, varname='_param_max_area')
        self._textAlgo = OTParamText("Blob function ( Operations: [ AND: * ; OR: + ; SUB: - ; NEG: ~ ] Ex: A+B-~C )", "A*B*C", varname='_param_filter_algorithm')
        self._removeBg = OTParamCheckBox("Remove the background", True)
        
        self._player = OTParamPlayer("Video player")

        self._selectBiggests = OTParamCheckBox("Select only the biggests blobs", True)
        self._howMany = OTParamSlider("How many?", 1, 1, 20, varname='_param_n_blobs')

        self._useBlur = OTParamCheckBox("Use blur", True)
        self._kernelSize = OTParamSlider("Kernel size",1, 1, 50, varname='_param_kernel_size')
        self._blurThreshold = OTParamSlider("Blur threshold", 110, 1, 255, varname='_param_blur_threshould')
        
        self._colorDomain = OTParamCombo("Colors space", varname='_param_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)

        self._activeR = OTParamCheckBox("Active")
        self._activeG = OTParamCheckBox("Active")
        self._activeB = OTParamCheckBox("Active")

        self._minR = OTParamSlider("min. A", 1, 0, 255, varname='_param_a_min')
        self._maxR = OTParamSlider("max. A", 255, 0, 255, varname='_param_a_max')
        self._minG = OTParamSlider("min. B", 1, 0, 255, varname='_param_b_min')
        self._maxG = OTParamSlider("max. B", 255, 0, 255, varname='_param_b_max')
        self._minB = OTParamSlider("min. C", 1, 0, 255, varname='_param_c_min')
        self._maxB = OTParamSlider("max. C", 255, 0, 255, varname='_param_c_max')


        #THRESHOLD 
        self._blockSize = OTParamSlider("Block size", 3, 3, 500,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 0, 0, 500,varname='_param_tb_c')
        self._boxWidth = OTParamSlider("Width", 0, 0, 30,varname='_param_tb_box_width')
        self._boxHeight = OTParamSlider("Height", 0, 0, 30,varname='_param_tb_box_height')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._th_colorDomain = OTParamCombo("Colors space",varname='_param_tb_color_domain')
        self._th_colorDomain.addItem("RGB", -1)
        self._th_colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._th_colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._th_colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._th_colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._th_colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._th_colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._th_colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._colorComponent = OTParamCombo("Component",varname='_param_tb_color_component')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._th_thresholdType = OTParamCombo("ThresholdType",varname='_param_tb_threshold_type')
        self._th_thresholdType.addItem("THRESH_BINARY", cv2.THRESH_BINARY)
        self._th_thresholdType.addItem("THRESH_BINARY_INV", cv2.THRESH_BINARY_INV)
        #END THRESHOLD


        #CANNY
        self._canny_apertureSize = OTParamSlider("Aperture size", 3, 3, 7, varname='_param_canny_apertureSize')
        self._canny_L2gradient = OTParamCheckBox("L2 gradient", True, varname='_param_canny_L2gradient')
        self._canny_threshould1 = OTParamSlider("Threshould 1", 0, 0, 255, varname='_param_canny_threshould1')
        self._canny_threshould2 = OTParamSlider("Threshould 2", 1, 0, 255, varname='_param_canny_threshould2')

        self._canny_colorDomain = OTParamCombo("Colors space",varname='_param_canny_color_domain')
        self._canny_colorDomain.addItem("RGB", -1)
        self._canny_colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._canny_colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._canny_colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._canny_colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._canny_colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._canny_colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._canny_colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._canny_colorComponent = OTParamCombo("Component",varname='_param_canny_color_component')
        self._canny_colorComponent.addItem("A", 0)
        self._canny_colorComponent.addItem("B", 1)
        self._canny_colorComponent.addItem("C", 2)
        #END CANNY


        self._useColors = OTParamCheckBox("Use colors filter", True)
        self._useThreshold = OTParamCheckBox("Use adaptative threshold", False)
        self._useCanny = OTParamCheckBox("Use canny algorithm", False)        
        self._exportFindBlobs = OTParamCheckBox("Export find blobs", True)

        self._canny_colorDomain.valueUpdated = self.refreshValue
        self._canny_colorComponent.valueUpdated = self.refreshValue
        self._canny_apertureSize.valueUpdated = self.refreshValue
        self._canny_L2gradient.valueUpdated = self.refreshValue
        self._canny_threshould1.valueUpdated = self.refreshValue
        self._canny_threshould2.valueUpdated = self.refreshValue
        self._th_colorDomain.valueUpdated = self.refreshValue
        self._colorComponent.valueUpdated = self.refreshValue
        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._boxHeight.valueUpdated = self.refreshValue
        self._boxWidth.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue

        
        self._colorDomain.valueUpdated = self.refreshValue
        self._activeR.valueUpdated = self.refreshValue
        self._activeG.valueUpdated = self.refreshValue
        self._activeB.valueUpdated = self.refreshValue
        self._minR.valueUpdated = self.refreshValue
        self._maxR.valueUpdated = self.refreshValue
        self._minG.valueUpdated = self.refreshValue
        self._maxG.valueUpdated = self.refreshValue
        self._minB.valueUpdated = self.refreshValue
        self._maxB.valueUpdated = self.refreshValue

        self._textAlgo.valueUpdated = self.refreshValue
        self._threshold.valueUpdated = self.refreshValue
        self._kernelSize.valueUpdated = self.refreshValue
        self._blurThreshold.valueUpdated = self.refreshValue
        self._maxArea.valueUpdated = self.refreshValue
        self._minArea.valueUpdated = self.refreshValue

        self._removeBg.valueUpdated = self.removeBgUpdate
        self._useBlur.valueUpdated = self.useBlurUpdate
        self._selectBiggests.valueUpdated = self.selectBiggestsUpdate
    
        self._useColors.valueUpdated = self.__useColorsClicked
        self._useThreshold.valueUpdated = self.__useThresholdClicked
        self._useCanny.valueUpdated = self.__useCannyClicked
        
        self._formset = [ 
                ('_video',' ','_useColors','_useThreshold','_useCanny'),
                [
                    "_player",{
                        "Remove background": [ '_removeBg','_background', '_threshold'],
                        "Filter colors" :  ['_colorDomain', ("_minR",'_activeR',"_maxR"), ("_minG",'_activeG',"_maxG"),  ("_minB",'_activeB',"_maxB")],
                        "Threshold filter": [('_th_colorDomain','_colorComponent','_adaptiveMethod','_th_thresholdType'), ('_boxWidth', '_boxHeight'),('_blockSize',"_C")],
                        "Canny": [ ('_canny_colorDomain', '_canny_colorComponent'), '_canny_threshould1','_canny_threshould2','_canny_apertureSize','_canny_L2gradient'],
                        "Filter objects": [ ('_minArea', '_maxArea'), ('_useBlur', '_kernelSize', '_blurThreshold'), ("_selectBiggests", "_howMany"),'_exportFindBlobs' ],
                    },"_textAlgo"                    
                ]
            ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

        self._blurThreshold.hide()
        self._kernelSize.hide()
        self._background.hide()
        self._threshold.hide()
        self._howMany.hide()

    def __useColorsClicked(self, value):
        
        if value==2:
            self._useCanny.enabled = True
            self._useThreshold.enabled = True
            self._useThreshold.uncheck()
            self._useCanny.uncheck()
            self._useColors.enabled = False
            self.hideTab("Threshold filter")
            self.showTab("Filter colors")
            self.hideTab("Canny")
            self._player.refresh()

    def __useThresholdClicked(self, value):
        if value==2:
            self._useCanny.enabled = True
            self._useColors.enabled = True
            self._useCanny.uncheck()
            self._useColors.uncheck()
            self._useThreshold.enabled = False
            self.showTab("Threshold filter")
            self.hideTab("Filter colors")
            self.hideTab("Canny")
            self._player.refresh()

    def __useCannyClicked(self, value):
        if value==2:
            self._useThreshold.enabled = True
            self._useColors.enabled = True
            self._useThreshold.uncheck()
            self._useColors.uncheck()
            self._useCanny.enabled = False
            self.hideTab("Threshold filter")
            self.hideTab("Filter colors")
            self.showTab("Canny")
            self._player.refresh()


    def initForm(self):
        super(OTModuleColorFilter, self).initForm()
        self.hideTab("Threshold filter")
        self.hideTab("Canny")

    def refreshValue(self, value):
        self._player.refresh()

    def selectBiggestsUpdate(self, value):
        if value:
            self._howMany.show()
        else:
            self._howMany.hide()
        self._player.refresh()

    def useBlurUpdate(self, value):
        if value:
            self._kernelSize.show()
            self._blurThreshold.show()
        else:
            self._kernelSize.hide()
            self._blurThreshold.hide()
        self._player.refresh()

        


    def removeBgUpdate(self, value):
        if value:
            self._background.show()
            self._threshold.show()
        else:
            self._background.hide()
            self._threshold.hide()
        self._player.refresh()

    def newVideoInputChoosen(self, value):
        OTParamVideoInput.valueUpdated(self._video,value)
        if value:
            self._player.value = value
            self.videoInput = value

            if isinstance(value, OTModuleMaskFromGeometry):
                self._param_mi_polygons = value._all_polygons
                self._param_mi_mask = None

    def processFrame(self, frame):
        original = frame.copy()
        
        if self._removeBg.value: 
            self._param_background = self._background.value
            frame = OTPRemoveBackground.compute(self, frame)

        if self._useThreshold.value:
            fish = OTPAdaptativeThreshold.compute(self, frame)
        elif self._useCanny.value:
            fish = OTPCanny.compute(self, frame)
        else:
            fish = OTPColorFilter.compute(self, frame)

        if self._useBlur.value: fish = OTPBlur.compute(self, fish)


        if isinstance(self._video.value, OTModuleMaskFromGeometry):
            fish = OTPMaskImage.compute(self, fish)

        self._objectsFound = OTPFindBlobs.compute(self, fish)

        """
        for obj in self._objectsFound:
            mask = zeros_like(original)
            cv2.fillPoly( mask, obj._contour, (255, 255, 255) )
            res = cv2.bitwise_and(original, mask)
            b,g,r = cv2.split(res)
            b_avg = mean(b[b>0])
            g_avg = mean(g[g>0])
            r_avg = mean(r[r>0])
            obj._color = b_avg, g_avg, r_avg
        """
        if self._selectBiggests.value: self._objectsFound = OTPSelectBiggerBlobs.compute(self, self._objectsFound)
            
        ################################################################
        ################################################################

        contours2Display = []
        for obj in self._objectsFound:  contours2Display.append( obj._contour )

        cv2.drawContours( frame, array(contours2Display), -1, (0, 255, 0), 1 )


        for i, obj in enumerate(self._objectsFound):
            cv2.circle(frame, obj._centroid, 5, (255,0,0), thickness=1)
            p = obj._bounding[0]
            text = "AREA: %d" % obj._area
            #cv2.putText(frame, text, p , cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 255, 255),  3)
            #cv2.putText(frame, text, p , cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 255),         1)    

        if self._useColors.value:
            if self._removeBg.value: original = OTPRemoveBackground.compute(self, original)
            if self._colorDomain.value>=0: original = cv2.cvtColor(original, self._colorDomain.value)
            r,g,b = cv2.split( original )
            if not self._activeR.value: r = r * 0
            if not self._activeG.value: g = g * 0
            if not self._activeB.value: b = b * 0
            r = cv2.inRange(r, array(self._minR.value), array(self._maxR.value) )
            g = cv2.inRange(g, array(self._minG.value), array(self._maxG.value) )
            b = cv2.inRange(b, array(self._minB.value), array(self._maxB.value) )
            image = cv2.merge( (b,g,r) )
        
            return [frame, image, fish]
        else:
            return [frame, fish]











        

    def exportCodeTo(self, folder):
        files_to_copy = []        
        classes, imports, constructer_params, parameters = [], [], [], []
        #classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._video.value.exportCodeTo(folder)
        #classes += classes_tmp; imports += imports_tmp; constructer_params += constructer_params_tmp; parameters += parameters_tmp;

        #SET OTPRemoveBackground
        if self._removeBg.value:
            classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._background.value.exportCodeTo(folder)
            classes += classes_tmp; imports += imports_tmp; constructer_params += constructer_params_tmp; parameters += parameters_tmp;
            files_to_copy.append( 'OTPRemoveBackground' )
            parameters.append("self._param_background_threshold = %d " % self._threshold.value )
        #END SET

        

        if self._useThreshold.value:
            #SET OTPAdaptativeThreshold
            files_to_copy.append( 'OTPAdaptativeThreshold' )
            parameters.append("self._param_tb_color_component = %d " % self._colorComponent.value )
            parameters.append("self._param_tb_color_domain = %d " % self._th_colorDomain.value )
            parameters.append("self._param_tb_adaptive_method = %d " % self._adaptiveMethod.value )
            parameters.append("self._param_tb_block_size = %d " % self._blockSize.value )
            parameters.append("self._param_tb_threshold_type = %d " % self._th_thresholdType.value )
            parameters.append("self._param_tb_c = %d " % self._C.value )
            #END SET
        elif self._useCanny.value:
            #SET OTPCanny
            files_to_copy.append( 'OTPCanny' )
            parameters.append("self._param_canny_apertureSize = %d " % self._canny_apertureSize.value )
            parameters.append("self._param_canny_L2gradient = %d " % self._canny_L2gradient.value )
            parameters.append("self._param_canny_threshould1 = %d " % self._canny_threshould1.value )
            parameters.append("self._param_canny_threshould2 = %d " % self._canny_threshould2.value )
            parameters.append("self._param_canny_color_component = %d " % self._canny_colorComponent.value )
            parameters.append("self._param_canny_color_domain = %d " % self._canny_colorDomain.value )
            #END SET
        else:
            #SET OTPColorFilter
            files_to_copy.append( 'OTPColorFilter' )
            parameters.append("self._param_color_domain = %d " % self._colorDomain.value )
            parameters.append("self._param_filter_algorithm = '%s' " % self._textAlgo.value )
            parameters.append("self._param_a_min = %d " % self._minR.value )
            parameters.append("self._param_a_max = %d " % self._maxR.value )
            parameters.append("self._param_b_min = %d " % self._minG.value )
            parameters.append("self._param_b_max = %d " % self._maxG.value )
            parameters.append("self._param_c_min = %d " % self._minB.value )
            parameters.append("self._param_c_max = %d " % self._maxB.value )
            #END SET

        #SET OTPBlur
        if self._useBlur.value: 
            files_to_copy.append( 'OTPBlur' )
            parameters.append("self._param_kernel_size = %d " % self._kernelSize.value )
            parameters.append("self._param_blur_threshould = %d " % self._blurThreshold.value )
        #END SET

        #SET OTPMaskImage
        if isinstance(self._video.value, OTModuleMaskFromGeometry):
            files_to_copy.append( 'OTPMaskImage' )
            parameters.append("self._param_mi_polygons = np.array(%s)" % str(self._video.value._all_polygons) )
            imports.append("import numpy as np")        
        #END SET
        
        #SET OTPFindBlobs
        if self._exportFindBlobs.value:
            files_to_copy.append( 'OTPFindBlobs' )
            parameters.append("self._param_min_area = %d " % self._minArea.value )
            parameters.append("self._param_max_area = %d " % self._maxArea.value )
        #END SET

        #SET OTPSelectBiggerBlobs
        if self._selectBiggests.value: 
            files_to_copy.append( 'OTPSelectBiggerBlobs' )
            parameters.append('self._param_n_blobs = %d' % self._howMany.value )
        #END SET

        classes += files_to_copy
        for file_to_copy in files_to_copy:
            filename = file_to_copy+".py"; originalfilepath = tools.getFileInSameDirectory(__file__, filename); destinyfilepath = os.path.join( folder, filename )            
            f = open(originalfilepath, 'r'); text = f.read(); f.close(); text = text.replace("from mcvgui.core.controllers.", "from "); f = open(destinyfilepath, 'w'); f.write(text); f.close()
            imports.append( "from %s import %s" % (file_to_copy, file_to_copy) )
        
        return classes, imports, constructer_params, parameters
示例#17
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPRemoveBackground.__init__(self)
        OTPColorFilter.__init__(self)        
        OTPAdaptativeThreshold.__init__(self)
        OTPBlur.__init__(self)
        OTPFindBlobs.__init__(self)
        OTPSelectBiggerBlobs.__init__(self)
        OTPMaskImage.__init__(self)
        OTPCanny.__init__(self)
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        #self._polygons = OTParamGeometry("Geometry")
        self._background = OTParamBackground("Background", varname='_param_background')
        self._threshold = OTParamSlider("Threshold", 110, 1, 255, varname='_param_background_threshold')
        self._minArea = OTParamSlider("Blob min. area",100, 0, 50000, varname='_param_min_area')
        self._maxArea = OTParamSlider("Blob max. area", 10000, 0, 100000, varname='_param_max_area')
        self._textAlgo = OTParamText("Blob function ( Operations: [ AND: * ; OR: + ; SUB: - ; NEG: ~ ] Ex: A+B-~C )", "A*B*C", varname='_param_filter_algorithm')
        self._removeBg = OTParamCheckBox("Remove the background", True)
        
        self._player = OTParamPlayer("Video player")

        self._selectBiggests = OTParamCheckBox("Select only the biggests blobs", True)
        self._howMany = OTParamSlider("How many?", 1, 1, 20, varname='_param_n_blobs')

        self._useBlur = OTParamCheckBox("Use blur", True)
        self._kernelSize = OTParamSlider("Kernel size",1, 1, 50, varname='_param_kernel_size')
        self._blurThreshold = OTParamSlider("Blur threshold", 110, 1, 255, varname='_param_blur_threshould')
        
        self._colorDomain = OTParamCombo("Colors space", varname='_param_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)

        self._activeR = OTParamCheckBox("Active")
        self._activeG = OTParamCheckBox("Active")
        self._activeB = OTParamCheckBox("Active")

        self._minR = OTParamSlider("min. A", 1, 0, 255, varname='_param_a_min')
        self._maxR = OTParamSlider("max. A", 255, 0, 255, varname='_param_a_max')
        self._minG = OTParamSlider("min. B", 1, 0, 255, varname='_param_b_min')
        self._maxG = OTParamSlider("max. B", 255, 0, 255, varname='_param_b_max')
        self._minB = OTParamSlider("min. C", 1, 0, 255, varname='_param_c_min')
        self._maxB = OTParamSlider("max. C", 255, 0, 255, varname='_param_c_max')


        #THRESHOLD 
        self._blockSize = OTParamSlider("Block size", 3, 3, 500,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 0, 0, 500,varname='_param_tb_c')
        self._boxWidth = OTParamSlider("Width", 0, 0, 30,varname='_param_tb_box_width')
        self._boxHeight = OTParamSlider("Height", 0, 0, 30,varname='_param_tb_box_height')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._th_colorDomain = OTParamCombo("Colors space",varname='_param_tb_color_domain')
        self._th_colorDomain.addItem("RGB", -1)
        self._th_colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._th_colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._th_colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._th_colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._th_colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._th_colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._th_colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._colorComponent = OTParamCombo("Component",varname='_param_tb_color_component')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._th_thresholdType = OTParamCombo("ThresholdType",varname='_param_tb_threshold_type')
        self._th_thresholdType.addItem("THRESH_BINARY", cv2.THRESH_BINARY)
        self._th_thresholdType.addItem("THRESH_BINARY_INV", cv2.THRESH_BINARY_INV)
        #END THRESHOLD


        #CANNY
        self._canny_apertureSize = OTParamSlider("Aperture size", 3, 3, 7, varname='_param_canny_apertureSize')
        self._canny_L2gradient = OTParamCheckBox("L2 gradient", True, varname='_param_canny_L2gradient')
        self._canny_threshould1 = OTParamSlider("Threshould 1", 0, 0, 255, varname='_param_canny_threshould1')
        self._canny_threshould2 = OTParamSlider("Threshould 2", 1, 0, 255, varname='_param_canny_threshould2')

        self._canny_colorDomain = OTParamCombo("Colors space",varname='_param_canny_color_domain')
        self._canny_colorDomain.addItem("RGB", -1)
        self._canny_colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._canny_colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._canny_colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._canny_colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._canny_colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._canny_colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._canny_colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._canny_colorComponent = OTParamCombo("Component",varname='_param_canny_color_component')
        self._canny_colorComponent.addItem("A", 0)
        self._canny_colorComponent.addItem("B", 1)
        self._canny_colorComponent.addItem("C", 2)
        #END CANNY


        self._useColors = OTParamCheckBox("Use colors filter", True)
        self._useThreshold = OTParamCheckBox("Use adaptative threshold", False)
        self._useCanny = OTParamCheckBox("Use canny algorithm", False)        
        self._exportFindBlobs = OTParamCheckBox("Export find blobs", True)

        self._canny_colorDomain.valueUpdated = self.refreshValue
        self._canny_colorComponent.valueUpdated = self.refreshValue
        self._canny_apertureSize.valueUpdated = self.refreshValue
        self._canny_L2gradient.valueUpdated = self.refreshValue
        self._canny_threshould1.valueUpdated = self.refreshValue
        self._canny_threshould2.valueUpdated = self.refreshValue
        self._th_colorDomain.valueUpdated = self.refreshValue
        self._colorComponent.valueUpdated = self.refreshValue
        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._boxHeight.valueUpdated = self.refreshValue
        self._boxWidth.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue

        
        self._colorDomain.valueUpdated = self.refreshValue
        self._activeR.valueUpdated = self.refreshValue
        self._activeG.valueUpdated = self.refreshValue
        self._activeB.valueUpdated = self.refreshValue
        self._minR.valueUpdated = self.refreshValue
        self._maxR.valueUpdated = self.refreshValue
        self._minG.valueUpdated = self.refreshValue
        self._maxG.valueUpdated = self.refreshValue
        self._minB.valueUpdated = self.refreshValue
        self._maxB.valueUpdated = self.refreshValue

        self._textAlgo.valueUpdated = self.refreshValue
        self._threshold.valueUpdated = self.refreshValue
        self._kernelSize.valueUpdated = self.refreshValue
        self._blurThreshold.valueUpdated = self.refreshValue
        self._maxArea.valueUpdated = self.refreshValue
        self._minArea.valueUpdated = self.refreshValue

        self._removeBg.valueUpdated = self.removeBgUpdate
        self._useBlur.valueUpdated = self.useBlurUpdate
        self._selectBiggests.valueUpdated = self.selectBiggestsUpdate
    
        self._useColors.valueUpdated = self.__useColorsClicked
        self._useThreshold.valueUpdated = self.__useThresholdClicked
        self._useCanny.valueUpdated = self.__useCannyClicked
        
        self._formset = [ 
                ('_video',' ','_useColors','_useThreshold','_useCanny'),
                [
                    "_player",{
                        "Remove background": [ '_removeBg','_background', '_threshold'],
                        "Filter colors" :  ['_colorDomain', ("_minR",'_activeR',"_maxR"), ("_minG",'_activeG',"_maxG"),  ("_minB",'_activeB',"_maxB")],
                        "Threshold filter": [('_th_colorDomain','_colorComponent','_adaptiveMethod','_th_thresholdType'), ('_boxWidth', '_boxHeight'),('_blockSize',"_C")],
                        "Canny": [ ('_canny_colorDomain', '_canny_colorComponent'), '_canny_threshould1','_canny_threshould2','_canny_apertureSize','_canny_L2gradient'],
                        "Filter objects": [ ('_minArea', '_maxArea'), ('_useBlur', '_kernelSize', '_blurThreshold'), ("_selectBiggests", "_howMany"),'_exportFindBlobs' ],
                    },"_textAlgo"                    
                ]
            ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

        self._blurThreshold.hide()
        self._kernelSize.hide()
        self._background.hide()
        self._threshold.hide()
        self._howMany.hide()
示例#18
0
class OTModuleClusterObjectsPositions(OTModuleResultsPlugin,
                                      OTModulePositions):
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'icon.jpg')
        OTModuleResultsPlugin.__init__(self, name, iconFile=icon_path)

        self._positions = OTParamPositions("Positions")
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")
        self._nobjects = OTParamSlider("Number of objects to track", 1, 1, 10)
        self._run = OTParamButton("Run")
        self._apply = OTParamButton("Apply changes")
        self._progress = OTParamProgress()

        #self._query.readOnly = True
        self._run.value = self.run
        self._apply.value = self.apply
        self._video.valueUpdated = self.newVideoInputChoosen
        self._player.processFrame = self.processFrame
        self._query.form.tableView.keyPressEvent = self.keyPressEvent

        self._current_row = None

        self._formset = [('_video', "_positions", '_nobjects', '_run'),
                         '_player', '=', ("_results", '_apply'), "_query",
                         "_progress"]

        self._progress.hide()

    def newVideoInputChoosen(self, value):
        """
        Event called when a user select rows using the popup menu
        @param value: Video module
        @type value: OTModule
        """
        OTParamVideoInput.valueUpdated(self._video, value)
        if value.videoInput:
            value.videoInput.setFrame(0)
            self._player.value = value.videoInput

    def apply(self):
        updatequery = QtSql.QSqlQuery(self.parentModule.sqldb)
        selectquery = QtSql.QSqlQuery(self.parentModule.sqldb)
        query = "SELECT a.object, b.id FROM %s a inner join %s b on a.frame=b.frame and a.new_object=b.object WHERE a.new_object<>'' " % (
            self._query.table, self._query.table)
        selectquery.exec_(query)
        while (selectquery.next()):
            row = selectquery.record()
            obj = int(row.value("object").toString())
            rowid = int(row.value("id").toString())
            query = "UPDATE %s SET object=%s WHERE id=%s " % (
                self._query.table, obj, rowid)
            updatequery.exec_(query)

        query = "UPDATE %s SET object=new_object WHERE new_object<>'' " % self._query.table
        updatequery.exec_(query)
        query = "UPDATE %s SET new_object='' " % self._query.table
        updatequery.exec_(query)
        updatequery.finish()
        self._query.orderBy = 1

    def keyPressEvent(self, event):
        #print event.key()
        if event.key() in (16777235, 16777237, 16777233, 16777232, 16777238,
                           16777239, 16777248):
            QTableView.keyPressEvent(self._query.form.tableView, event)
        else:
            key = event.text()
            if event.key() == 16777219 or event.key() == 16777223: key = ""
            if key == '' or key in self._results.keys:
                for row in self._query.mouseSelectedRowsIndexes:
                    self._query.setValueIn(row, 13, key)
                self._query.commit()

    def selectionChanged(self, selected, deselected):
        """
        Redefinition of the function selectionChanged from OTModuleResultsPlugin
        """
        QTableView.selectionChanged(self._query.form.tableView, selected,
                                    deselected)
        row = self._query.mouseSelectedRow
        if row != None:
            self._current_row = row
            video = self._video.value
            frame_index = int(row[1]) - 1
            video.videoInput.setFrame(frame_index)
            self._player.updateFrame()

    def processFrame(self, frame, drawSelectedRows=True):
        """
        This is an event called by the player before he shows the video frame
        @param frame: Frame that would be showed
        @type frame: Numpy array
        """
        #Draw the current mouse selected row
        if self._current_row != None:
            x = int(self._current_row[4])
            y = int(self._current_row[5])
            velocity = eval(str(self._current_row[6]))
            accelaration = eval(str(self._current_row[7]))
            blob = array([eval(str(self._current_row[8]))])

            cv2.circle(frame, (x, y), 6, (0, 0, 255), -1)
            cv2.polylines(frame, blob, True, (0, 255, 0), 1)

            xx = int(math.ceil(x + velocity[0] + 0.5 * accelaration[0]))
            yy = int(math.ceil(y + velocity[1] + 0.5 * accelaration[1]))
            cv2.line(frame, (x, y), (xx, yy), (255, 0, 0), 2)

        return frame

    def __smallestDistance(self, point, positions):
        smallest_dist = 1000000
        index = -1
        for i, values in enumerate(positions):
            frame, x, y = int(values[1]), int(values[4]), int(values[5])
            dist = tools.pointsDistance(point, (x, y))
            if dist <= smallest_dist:
                smallest_dist = dist
                index = i
        return index

    def __guessPositions(self, objs_window, nobjects=2):
        origin = [None for x in range(nobjects)]

        for frameIndex, frame in enumerate(objs_window.get()):
            if frameIndex == 0: continue

            final_selection = list(origin)
            scores = []

            for objIndex, obj in enumerate(frame):
                for last_obj in objs_window.get(frameIndex - 1):
                    classification = last_obj.scorePosition(obj._position)
                    scores.append([classification, last_obj, obj])
            scores = sorted(scores, key=lambda x: x[0], reverse=True)

            used = []
            for score_index in range(len(scores)):
                classification, last_object, new_obj = scores[score_index][
                    0], scores[score_index][1], scores[score_index][2]
                #if classification>0.005 and final_selection[last_object._label]==None:
                if final_selection[
                        last_object._label] == None and new_obj not in used:
                    new_obj.calcEnergyProperties(last_object)
                    new_obj._label = last_object._label
                    final_selection[last_object._label] = new_obj
                    used.append(new_obj)

            for i, obj in enumerate(final_selection):
                if obj == None:
                    final_selection[i] = objs_window.get(frameIndex -
                                                         1)[i].genNextFrame()

            objs_window.set(frameIndex, final_selection)

        self._firstTime = False
        return objs_window

    def __getFirstValues(self, query, nvalues):
        sqlquery = QtSql.QSqlQuery(self.parentModule.sqldb)
        sqlquery.exec_(query)
        results = []
        for index in range(nvalues):
            sqlquery.next()
            row = sqlquery.record()

            rowid = int(row.value("id").toString())
            frame = int(row.value("frame").toString())
            seconds = float(row.value("seconds").toString())
            milliseconds = float(row.value("milliseconds").toString())
            x = int(row.value("x").toString())
            y = int(row.value("y").toString())
            obj = str(row.value("polygon").toString())
            r = str(row.value("r").toString())
            g = str(row.value("g").toString())
            b = str(row.value("b").toString())

            values = [rowid, frame, seconds, milliseconds, x, y, obj, r, g, b]
            results.append(values)
        return results

    def __row2List(self, row):
        rowid = int(row.value("id").toString())
        frame = int(row.value("frame").toString())
        seconds = float(row.value("seconds").toString())
        milliseconds = float(row.value("milliseconds").toString())
        x = int(row.value("x").toString())
        y = int(row.value("y").toString())
        obj = str(row.value("polygon").toString())
        r = str(row.value("r").toString())
        g = str(row.value("g").toString())
        b = str(row.value("b").toString())
        return [rowid, frame, seconds, milliseconds, x, y, obj, r, g, b]

    def run(self):

        totalResults = self._positions.value.countAllResults()
        self._progress.min = 0
        self._progress.value = 0
        self._progress.max = totalResults
        self._progress.show()
        QApplication.processEvents()

        sqlquery = QtSql.QSqlQuery(self.parentModule.sqldb)
        insertquery = QtSql.QSqlQuery(self.parentModule.sqldb)

        insertquery.exec_("PRAGMA cache_size = 65536")
        insertquery.exec_("PRAGMA temp_store = MEMORY")
        insertquery.exec_("PRAGMA journal_mode = OFF")
        insertquery.exec_("PRAGMA synchronous = OFF")

        tablename = "%s_output" % (self.name.replace(" ",
                                                     "").lstrip('0123456789.'))
        insertquery.exec_("DROP TABLE IF EXISTS %s" % tablename)
        insertquery.exec_(
            "CREATE TABLE if not exists %s(id INTEGER PRIMARY KEY AUTOINCREMENT, frame BIGINT, seconds DOUBLE, milliseconds BIGINT, x INTEGER, y INTEGER, velocity TEXT, accelaration TEXT, polygon TEXT, r INTEGER, g INTEGER, b INTEGER, object INTEGER, new_object INTEGER)"
            % tablename)

        count = 0

        for query in self._positions.value.getAllQueries():
            last_frame, frame_values = -1, []
            sqlquery.exec_(query)

            valuesWindow = tools.RingBuffer(20)

            while (sqlquery.next()):
                row = sqlquery.record()
                values = self.__row2List(row)
                frame = values[1]

                if frame != last_frame and last_frame != -1:

                    #first frame give names to objects
                    if valuesWindow.count() == 0:
                        valuesWindow.append([
                            EnergeticObject(vals, label=i)
                            for i, vals in enumerate(frame_values)
                        ])
                    else:
                        valuesWindow.append(
                            [EnergeticObject(vals) for vals in frame_values])
                    #valuesWindow.printValues()

                    valuesWindow = self.__guessPositions(valuesWindow)

                    if valuesWindow.count() == 20:
                        for frameObjects in valuesWindow.get():
                            for obj in frameObjects:
                                if obj._saved != True:
                                    query = "INSERT INTO %s(frame, seconds, milliseconds, x, y, velocity, accelaration, polygon, r, g, b, object) VALUES (%s,%f,%f,%s,%s,'%s', '%s','%s', %s, %s, %s, %s)" % (
                                        tablename, obj._frame,
                                        obj._milliseconds, obj._seconds,
                                        obj._position[0], obj._position[1],
                                        obj._velocity, obj._accelaration,
                                        obj._blob, obj._r, obj._g, obj._b,
                                        obj._label)
                                    insertquery.exec_(query)
                                    obj._saved = True
                    frame_values = [values]
                else:
                    frame_values.append(values)

                last_frame = frame

                count += 1
                self._progress.value = count
                QApplication.processEvents()

            for frameObjects in valuesWindow.get():
                for obj in frameObjects:
                    if obj._saved != True:
                        query = "INSERT INTO %s(frame, seconds, milliseconds, x, y, velocity, accelaration, polygon, r, g, b, object) VALUES (%s,%f,%f,%s,%s,'%s', '%s','%s', %s, %s, %s, %s)" % (
                            tablename, obj._frame, obj._milliseconds,
                            obj._seconds, obj._position[0], obj._position[1],
                            obj._velocity, obj._accelaration, obj._blob,
                            obj._r, obj._g, obj._b, obj._label)
                        insertquery.exec_(query)

        insertquery.exec_("CREATE INDEX Idx3 ON %s(object, new_object);" %
                          tablename)
        insertquery.finish()
        self._progress.value = totalResults
        QApplication.processEvents()
        self.parentModule.sqldb.commit()
        self._progress.hide()

        self._results.clearItems()

        for label in range(self._nobjects.value):
            self._results.addItem(
                "%s" % label,
                "SELECT id, frame, seconds, milliseconds, x, y, velocity, accelaration, object, r, g, b, object, new_object FROM %s WHERE object like %d"
                % (tablename, label))

    def getArenaIntersection(self, x, y, arenasDict):
        for name, arena in arenasDict:
            contour = array([eval(arena)], int32)
            point = (x, y)
            res = cv2.pointPolygonTest(contour, point, False)
            if res >= 0:
                return name
        return "None"
class OTModuleAdaptativeThreshold(OTModulePlugin,OTModuleInputVideoPipe,OTPAdaptativeThreshold):
    

    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModuleInputVideoPipe.__init__(self)
        OTPAdaptativeThreshold.__init__(self)
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
       
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        #THRESHOLD 
        self._blockSize = OTParamSlider("Block size", 3, 3, 500,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 0, 0, 500,varname='_param_tb_c')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._th_colorDomain = OTParamCombo("Colors space",varname='_param_tb_color_domain')
        self._th_colorDomain.addItem("RGB", -1)
        self._th_colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._th_colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._th_colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._th_colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._th_colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._th_colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._th_colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._colorComponent = OTParamCombo("Component",varname='_param_tb_color_component')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._th_thresholdType = OTParamCombo("ThresholdType",varname='_param_tb_threshold_type')
        self._th_thresholdType.addItem("THRESH_BINARY", cv2.THRESH_BINARY)
        self._th_thresholdType.addItem("THRESH_BINARY_INV", cv2.THRESH_BINARY_INV)
        #END THRESHOLD

        self._th_colorDomain.valueUpdated = self.refreshValue
        self._colorComponent.valueUpdated = self.refreshValue
        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue
        
        self._formset = [ 
                '_video',"_player",
                ('_th_colorDomain','_colorComponent','_adaptiveMethod','_th_thresholdType'), 
                ('_blockSize',"_C"),
            ]
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

    def refreshValue(self, value): self._player.refresh()

    def processFrame(self, frame):
        result = self.compute(frame)
        return result

    def newVideoInputChoosen(self, value):
        OTParamVideoInput.valueUpdated(self._video,value)
        if value: 
            self.open(value)
            self._player.value = value














    def exportCodeTo(self, folder):
        files_to_copy = []        
        classes, imports, constructer_params, parameters = [], [], [], []
        #classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._video.value.exportCodeTo(folder)
        #classes += classes_tmp; imports += imports_tmp; constructer_params += constructer_params_tmp; parameters += parameters_tmp;

        #SET OTPRemoveBackground
        if self._removeBg.value:
            classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._background.value.exportCodeTo(folder)
            classes += classes_tmp; imports += imports_tmp; constructer_params += constructer_params_tmp; parameters += parameters_tmp;
            files_to_copy.append( 'OTPRemoveBackground' )
            parameters.append("self._param_background_threshold = %d " % self._threshold.value )
        #END SET

        

        if self._useThreshold.value:
            #SET OTPAdaptativeThreshold
            files_to_copy.append( 'OTPAdaptativeThreshold' )
            parameters.append("self._param_tb_color_component = %d " % self._colorComponent.value )
            parameters.append("self._param_tb_color_domain = %d " % self._th_colorDomain.value )
            parameters.append("self._param_tb_adaptive_method = %d " % self._adaptiveMethod.value )
            parameters.append("self._param_tb_block_size = %d " % self._blockSize.value )
            parameters.append("self._param_tb_threshold_type = %d " % self._th_thresholdType.value )
            parameters.append("self._param_tb_c = %d " % self._C.value )
            #END SET
        elif self._useCanny.value:
            #SET OTPCanny
            files_to_copy.append( 'OTPCanny' )
            parameters.append("self._param_canny_apertureSize = %d " % self._canny_apertureSize.value )
            parameters.append("self._param_canny_L2gradient = %d " % self._canny_L2gradient.value )
            parameters.append("self._param_canny_threshould1 = %d " % self._canny_threshould1.value )
            parameters.append("self._param_canny_threshould2 = %d " % self._canny_threshould2.value )
            parameters.append("self._param_canny_color_component = %d " % self._canny_colorComponent.value )
            parameters.append("self._param_canny_color_domain = %d " % self._canny_colorDomain.value )
            #END SET
        else:
            #SET OTPColorFilter
            files_to_copy.append( 'OTPColorFilter' )
            parameters.append("self._param_color_domain = %d " % self._colorDomain.value )
            parameters.append("self._param_filter_algorithm = '%s' " % self._textAlgo.value )
            parameters.append("self._param_a_min = %d " % self._minR.value )
            parameters.append("self._param_a_max = %d " % self._maxR.value )
            parameters.append("self._param_b_min = %d " % self._minG.value )
            parameters.append("self._param_b_max = %d " % self._maxG.value )
            parameters.append("self._param_c_min = %d " % self._minB.value )
            parameters.append("self._param_c_max = %d " % self._maxB.value )
            #END SET

        #SET OTPBlur
        if self._useBlur.value: 
            files_to_copy.append( 'OTPBlur' )
            parameters.append("self._param_kernel_size = %d " % self._kernelSize.value )
            parameters.append("self._param_blur_threshould = %d " % self._blurThreshold.value )
        #END SET

        #SET OTPMaskImage
        if isinstance(self._video.value, OTModuleMaskFromGeometry):
            files_to_copy.append( 'OTPMaskImage' )
            parameters.append("self._param_mi_polygons = np.array(%s)" % str(self._video.value._all_polygons) )
            imports.append("import numpy as np")        
        #END SET
        
        #SET OTPFindBlobs
        if self._exportFindBlobs.value:
            files_to_copy.append( 'OTPFindBlobs' )
            parameters.append("self._param_min_area = %d " % self._minArea.value )
            parameters.append("self._param_max_area = %d " % self._maxArea.value )
        #END SET

        #SET OTPSelectBiggerBlobs
        if self._selectBiggests.value: 
            files_to_copy.append( 'OTPSelectBiggerBlobs' )
            parameters.append('self._param_n_blobs = %d' % self._howMany.value )
        #END SET

        classes += files_to_copy
        for file_to_copy in files_to_copy:
            filename = file_to_copy+".py"; originalfilepath = tools.getFileInSameDirectory(__file__, filename); destinyfilepath = os.path.join( folder, filename )            
            f = open(originalfilepath, 'r'); text = f.read(); f.close(); text = text.replace("from mcvgui.core.controllers.", "from "); f = open(destinyfilepath, 'w'); f.write(text); f.close()
            imports.append( "from %s import %s" % (file_to_copy, file_to_copy) )
        
        return classes, imports, constructer_params, parameters
示例#20
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPRemoveBackground.__init__(self)
        OTPColorFilter.__init__(self)
        OTPBlur.__init__(self)
        OTPFindBlobs.__init__(self)
        OTPSelectBiggerBlobs.__init__(self)
        OTModuleResultsPlugin.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._background = OTParamBackground("Background",
                                             varname='_param_background')
        self._threshold = OTParamSlider("Threshold",
                                        110,
                                        1,
                                        255,
                                        varname='_param_background_threshold')
        self._minArea = OTParamSlider("Blob min. area",
                                      100,
                                      0,
                                      50000,
                                      varname='_param_min_area')
        self._maxArea = OTParamSlider("Blob max. area",
                                      10000,
                                      0,
                                      100000,
                                      varname='_param_max_area')
        self._textAlgo = OTParamText(
            "Blob function ( Operations: [ AND: * ; OR: + ; SUB: - ; NEG: ~ ] Ex: A+B-~C )",
            "A*B*C",
            varname='_param_filter_algorithm')
        self._removeBg = OTParamCheckBox("Remove the background", True)
        self._editMode = OTParamCheckBox("Edit mode", True)
        self._run = OTParamButton("Run")
        self._player = OTParamPlayer("Video player")
        self._progress = OTParamProgress()

        self._selectBiggests = OTParamCheckBox(
            "Select only the biggests blobs", True)
        self._howMany = OTParamSlider("How many?",
                                      1,
                                      1,
                                      20,
                                      varname='_param_n_blobs')

        self._useBlur = OTParamCheckBox("Use blur", True)
        self._kernelSize = OTParamSlider("Kernel size",
                                         1,
                                         1,
                                         50,
                                         varname='_param_kernel_size')
        self._blurThreshold = OTParamSlider("Blur threshold",
                                            110,
                                            1,
                                            255,
                                            varname='_param_blur_threshould')

        self._colorDomain = OTParamCombo("Colors space",
                                         varname='_param_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("XYZ", cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb", cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV", cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS", cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab", cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv", cv2.COLOR_BGR2LUV)

        self._activeR = OTParamCheckBox("Active")
        self._activeG = OTParamCheckBox("Active")
        self._activeB = OTParamCheckBox("Active")

        self._minR = OTParamSlider("min. A", 1, 0, 255, varname='_param_a_min')
        self._maxR = OTParamSlider("max. A",
                                   255,
                                   0,
                                   255,
                                   varname='_param_a_max')
        self._minG = OTParamSlider("min. B", 1, 0, 255, varname='_param_b_min')
        self._maxG = OTParamSlider("max. B",
                                   255,
                                   0,
                                   255,
                                   varname='_param_b_max')
        self._minB = OTParamSlider("min. C", 1, 0, 255, varname='_param_c_min')
        self._maxB = OTParamSlider("max. C",
                                   255,
                                   0,
                                   255,
                                   varname='_param_c_max')

        self._groupBlobs = OTParamCheckBox("Group blobs", True)
        self._maxDistance = OTParamSlider("Max. dist. between blobs", 1, 30,
                                          300)

        self._groupBlobs.valueUpdated = self.groupBlobsUpdated
        self._colorDomain.valueUpdated = self.refreshValue

        self._activeR.valueUpdated = self.refreshValue
        self._activeG.valueUpdated = self.refreshValue
        self._activeB.valueUpdated = self.refreshValue

        self._minR.valueUpdated = self.refreshValue
        self._maxR.valueUpdated = self.refreshValue
        self._minG.valueUpdated = self.refreshValue
        self._maxG.valueUpdated = self.refreshValue
        self._minB.valueUpdated = self.refreshValue
        self._maxB.valueUpdated = self.refreshValue

        self._textAlgo.valueUpdated = self.refreshValue
        self._threshold.valueUpdated = self.refreshValue
        self._kernelSize.valueUpdated = self.refreshValue
        self._blurThreshold.valueUpdated = self.refreshValue
        self._maxArea.valueUpdated = self.refreshValue
        self._minArea.valueUpdated = self.refreshValue
        self._maxDistance.valueUpdated = self.refreshValue

        self._removeBg.valueUpdated = self.removeBgUpdate
        self._useBlur.valueUpdated = self.useBlurUpdate
        self._selectBiggests.valueUpdated = self.selectBiggestsUpdate

        self._formset = [
            ('_video', '_editMode', '_run'),
            [
                "_player", {
                    "1. Filter colors": [
                        '_colorDomain', ("_minR", '_activeR', "_maxR"),
                        ("_minG", '_activeG', "_maxG"),
                        ("_minB", '_activeB', "_maxB"), "_textAlgo"
                    ],
                    "2. Remove background":
                    ['_removeBg', '_background', '_threshold'],
                    "3. Filter objects":
                    [('_minArea', '_maxArea'),
                     ('_useBlur', '_kernelSize', '_blurThreshold'),
                     ("_selectBiggests", "_howMany")],
                    "4. Tracking": [('_groupBlobs', '_maxDistance')],
                }, "=", "_results", "_query"
            ], "_progress"
        ]

        self._run.value = self.run
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

        self._isRunning = False

        self._blurThreshold.hide()
        self._kernelSize.hide()
        self._background.hide()
        self._threshold.hide()
        self._progress.hide()
        self._howMany.hide()
        self._results.hide()
        self._query.hide()
        self._maxDistance.hide()
示例#21
0
class OTModuleAdjustPositions(OTModuleResultsPlugin, OTModulePositions):

    

    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'icon.jpg')
        OTModuleResultsPlugin.__init__(self, name, iconFile = icon_path)

        self._x_col = 4 #Indicate the column with the X coord
        self._y_col = 5 #Indicate the column with the Y coord
        self._frame_col = 1 #Indicate the column with the Y coord
        self._object_col = 6
        self._current_row = None

        self._imgWidth = 0.0
        self._imgHeight = 0.0
        self._startPoint = None
        self._endPoint = None

        self._video = OTParamVideoInput("Video")
        self._positions = OTParamPositions("Positions")
        self._showPos = OTParamCheckBox("Show position")
        self._showTrack = OTParamCheckBox("Show track")
        self._trackRange = OTParamSlider("Track range", 10, 10, 1000)
        self._player = OTParamPlayer("Video player")
        self._progress = OTParamProgress()
        
        #Fields used to configure the Position draw function
        self._show_draw_function = OTParamToggle("Show/Hide draw function")
        self._draw_function = OTParamTextArea("Draw function", """def draw(frame, row):
            x, y = int(row[self._x_col]), int(row[self._y_col])
            cv2.circle(frame, (x, y), 3, (0,255,0), thickness=2, lineType= cv2.cv.CV_AA)""")
        self._importFunc = OTParamButton("Import")
        self._exportFunc = OTParamButton("Export")
        
        #Fields used to configure the interpolation
        self._columns = OTParamCheckBoxList("List of columns to interpolate")
        self._run_interpolation = OTParamButton("Interpolate")
        self._run_interpolation_4_all = OTParamButton("Interpolate")

        #organization of the form
        self._formset = [   ('_video','_positions'), 
            [ ('_columns', '_run_interpolation', '_run_interpolation_4_all'),
            "_draw_function", 
            (" ", "_importFunc", "_exportFunc"), 
            "_player",
            ('_showPos',"_showTrack", "_trackRange")
            ,"=","_results", "_query"], '_progress' ]

        self._trackRange.enabled = False
        self._showPos.value = True

        #setting up the fields events
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
        self._positions.valueUpdated = self.newPositionsChoosen
        self._showTrack.valueUpdated = self.showTrackToggle
        self._query.selectionChanged = self.tableSelectionChanged
        self._trackRange.valueUpdated = self.updateTrackRange
        self._player._videoWidget.onEndDrag = self.onEndDragInVideoWindow
        self._show_draw_function.value = self.showHideDrawFunction
        self._importFunc.value = self.importFunction
        self._exportFunc.value = self.exportFunction
        self._run_interpolation.value = self.interpolationPositions
        self._run_interpolation_4_all.value = self.interpolateAllPositions

        #Hide fields
        self._draw_function.hide()
        self._progress.hide()
        self._importFunc.hide()
        self._exportFunc.hide()
        self._columns.hide()
        self._run_interpolation.hide()
        self._run_interpolation_4_all.hide()
        
        #Configure the popup menu
        self._query.addPopupMenuOption("-")
        self._query.addPopupSubMenuOption("Add", {"Interpolation": self.showColumns4Interpolation, "Duplicate row": self.addDuplicatedRow })
        self._query.addPopupMenuOption("Remove", self._query.remove)
        self._query.addPopupMenuOption("-")
        self._query.addPopupMenuOption("Approximate all positions", self.approximatePositions)
        self._query.addPopupMenuOption("Interpolate all positions", self.showColumns4InterpolationAll)
        
        self._current_row_index = None #Variable used to read the current row when the video is playing

    def onEndDragInVideoWindow(self, startPoint, endPoint, refresh=True):
        self._startPoint = ( int(startPoint[0] * self._imgWidth), int(startPoint[1] * self._imgWidth) )
        self._endPoint = ( int(endPoint[0] * self._imgWidth), int(endPoint[1] * self._imgWidth) )

        current_row = self._query.mouseSelectedRow

        if current_row!=None:
            current_index = self._query.mouseSelectedRowIndex
            current_frame = int(current_row[self._frame_col])
            if (self._player.value.getCurrentFrame()) == current_frame:
                x, y = int(current_row[self._x_col]), int(current_row[self._y_col])
                #print "current_row", self._startPoint, x, y
                    
                if tools.pointsDistance( self._startPoint , (x,y) ) <= 10:
                    self._query.setValueIn( current_index, self._x_col, self._endPoint[0] )
                    self._query.setValueIn( current_index, self._y_col, self._endPoint[1] )
                    self._current_row = self._query.valuesInRow(current_index)
                    if refresh: 
                        self._query.commit()
                        self._player.refresh()
                        self._query.refresh( current_index )
                        self._query.select()

    def exportFunction(self):
        filename = str(QFileDialog.getSaveFileName(self._form, 'Choose a file', '') )
        if filename!="":
            output = open( filename, 'wb')
            pickle.dump( self._draw_function.value , output)
            output.close()

    def importFunction(self):
        filename = str(QFileDialog.getOpenFileName(self._form, 'Choose a file', '') )
        if filename!="":
            pkl_file = open( filename, 'rb'); data = pickle.load(pkl_file); pkl_file.close()
            self._draw_function.value = data
            func = self._draw_function.value
            exec func
            self.drawRow = draw

    def showHideDrawFunction(self, value):
        if value:
            self._player.hide()
            self._importFunc.show()
            self._exportFunc.show()
            self._draw_function.show()
        else:
            self._draw_function.hide()
            self._importFunc.hide()
            self._exportFunc.hide()
            self._player.show()

            func = self._draw_function.value
            #code = compile(func, '<string>', 'exec')
            exec func
            self.drawRow = draw
            

            """d = {}
            exec func.strip() in d
            print d
            setattr(self.__class__, 'drawRow', d['drawRow'])
            """
            #self.drawRow = eval( func)




    def approximatePositions(self):
        totalCountRows = self._query.count
        firstRow = self._query.valuesInRow( totalCountRows-1 )

        firstPoint = ( int(firstRow[self._x_col]), int(firstRow[self._y_col]) )
        lastAngle = None

        self._progress.show()
        self._progress.min = 0
        self._progress.value = 0
        self._progress.max = totalCountRows

        query = QSqlQuery( self.parentModule.sqldb )
        
        self._query.beginTransaction()
        for i in range( totalCountRows-2, 0, -1 ):            #print i
            currentRow = self._query.valuesInRow( i )
            currentPoint = ( int(currentRow[self._x_col]), int(currentRow[self._y_col]) )
            dist = tools.pointsDistance( firstPoint, currentPoint )
            vector = ( firstPoint[0]-currentPoint[0], firstPoint[1]-currentPoint[1] )
            angle = math.atan2( vector[1], vector[0] )
            angleInDegrees = math.degrees( angle )

            frame = currentRow[self._frame_col]
            obj = currentRow[self._object_col]

            #print "angle:---", angleInDegrees, lastAngle
            if lastAngle==None: lastAngle=angleInDegrees
            if dist<=10: 
                #self._query.removeRow( i )
                #print "DELETE FROM %s WHERE frame='%s' and object='%s' " % (self._query.table, frame, obj )
                query.exec_("DELETE FROM %s WHERE frame='%s' and object='%s' " % (self._query.table, frame, obj ) )
            elif( math.fabs(lastAngle-angleInDegrees)>=5 ): 
                #print "angles", angleInDegrees, lastAngle
                firstPoint = currentPoint
                lastAngle = angleInDegrees
            else:
                #print "DELETE FROM %s WHERE frame='%s' and object='%s' " % (self._query.table, frame, obj )
                query.exec_("DELETE FROM %s WHERE frame='%s' and object='%s' " % (self._query.table, frame, obj ) )
                #self._query.removeRow( i )


            self._progress.value = totalCountRows - i
            QApplication.processEvents()

        self._query.commit()
        self._progress.hide()
        self._query.refresh(0)


    def showTrackToggle(self, value):
        self._trackRange.enabled = value
   

    def  updateTrackRange(self, value):
        if isinstance(self._player.value, OTVideoInput): self._player.refresh()
        

    ############################################################################
    ############ Parent class functions reemplementation #######################
    ############################################################################

    def selectionChanged(self, selected, deselected):
        """
        Redefinition of the function selectionChanged from OTModuleResultsPlugin
        """
        QTableView.selectionChanged(self._query.form.tableView, selected, deselected)
        row = self._query.mouseSelectedRow
        if row != None:
            self._current_row = row
            video = self._video.value
            frame_index = int( row[self._frame_col] )
            video.videoInput.setFrame( frame_index-1 )
            self._player.updateFrame()

    ############################################################################
    ############ Events ########################################################
    ############################################################################

    def updateProgressBar(self, index): self._progress.value = index

    def interpolateAllPositions(self):
        """
        Event called when user click in interpolation button
        """
        self._run_interpolation.hide()
        self._run_interpolation_4_all.hide()
        self._columns.hide()        
        self._player.show()
        
        totalCountRows = self._query.count
        n_columns = len(self._query.columns)
        checked_columns = self._columns.checkedIndexes
        cols_2_interpolate = map( lambda x: True if x in checked_columns else False, range(n_columns) )
        
        self._progress.show()
        self._progress.min = 0
        self._progress.value = 0
        self._progress.max = totalCountRows
        
        for i in range( 0, totalCountRows-1 ):
            self.interpolateBetween2Rows( i, i+1, update = self.updateProgressBar ,cols_2_interpolate = cols_2_interpolate )
            self._query.commit()     
            self._progress.value = i
           
        self._progress.hide()
        self._query.orderBy = 1

  

    def interpolationPositions(self):
        """
        Event called when user click in interpolation button
        """
        self._run_interpolation.hide()
        self._run_interpolation_4_all.hide()
        self._columns.hide()        
        self._player.show()

        rowsIndexes = self._query.mouseSelectedRowsIndexes
        rowsIndexes.sort()
        if len(rowsIndexes)==2 and rowsIndexes[0]==rowsIndexes[1]-1: #check is the rows are consecutives
            rows = self._query.mouseSelectedRows
            diff = float(abs( int(rows[1][0]) - int(rows[0][0]) ))
            if diff > 1 :
                print rowsIndexes[0], rowsIndexes[1] 
                self.interpolateBetween2Rows( rowsIndexes[0], rowsIndexes[1], update = self.updateProgressBar  )
                self._query.commit()
                self._query.orderBy = 1
                self._query.mouseSelectedRowsIndexes = rowsIndexes[0]
            else:
                QMessageBox. warning(self._form, 'Warning', "Is not possible to add more frames between the selected ones")
        else:
            QMessageBox. warning(self._form, 'Warning', "You should select two consecutive rows")
        

    def addDuplicatedRow(self):
        """
        Event called when a user click on the popup menu option
        """
        rows = self._query.mouseSelectedRows
        rowsIndexes = self._query.mouseSelectedRowsIndexes
        if len(rows)==1:
            lastRow = rows[-1]
            self._query.addRow(lastRow, rowsIndexes[0])
        else:
            QMessageBox. warning(self._control, 'Warning', "You should select one row to duplicate")
        self._query.orderBy = 1
        self._query.mouseSelectedRowsIndexes = rowsIndexes[0]

    def showColumns4Interpolation(self):
        """
        Event called when a user click on the popup menu option
        """
        self._player.hide()
        self._draw_function.hide()
        self._exportFunc.hide()
        self._importFunc.hide()
        self._run_interpolation_4_all.hide()

        self._columns.show()
        self._run_interpolation.show()


    def showColumns4InterpolationAll(self):
        """
        Event called when a user click on the popup menu option
        """
        self._player.hide()
        self._draw_function.hide()
        self._exportFunc.hide()
        self._importFunc.hide()
        self._run_interpolation.hide()

        self._columns.show()
        self._run_interpolation_4_all.show()


    def tableSelectionChanged(self):
        """
        Event called when a user select rows using the popup menu
        """
        self._player.refresh()

    def newVideoInputChoosen(self, value):
        """
        Event called when a user select rows using the popup menu
        @param value: Video module
        @type value: OTModule
        """
        OTParamVideoInput.valueUpdated(self._video,value)
        if value.videoInput:
            value.videoInput.setFrame(0)
            self._player.value = value.videoInput
            self._imgWidth = float(value.videoInput.width)
            self._imgHeight = float(value.videoInput.height)            
            self._trackRange.max = value.videoInput.endFrame-value.videoInput.startFrame

    def newPositionsChoosen(self, value):
        """
        Event called when a new dataset of Positions is choosen
        @param frame: Frame that would be showed
        @type frame: Numpy array
        """
        if value:
            items = value._results.values
            self._results.clearItems()
            for key, sql in items: self._results.addItem(key, sql)

            self._columns.clear()
            list_of_columns = self._query.columns
            self._columns.value = map(lambda x: (x, False), list_of_columns)
            
            self._x_col = self._query.columnIndex("x")
            self._y_col = self._query.columnIndex("y")
            self._frame_col = self._query.columnIndex("frame")

    def processFrame(self, frame, drawSelectedRows = True):
        """
        This is an event called by the player before he shows the video frame
        @param frame: Frame that would be showed
        @type frame: Numpy array
        """

        #Draw the path of the rat
        if self._showTrack.value:
            row_index = self._query.mouseSelectedRowIndex
            if row_index!=None:
                points = []
                for row in range(row_index, row_index + self._trackRange.value):
                    values = self._query.valuesInRow(row)
                    if values!= None:
                        x = int(values[self._x_col])
                        y = int(values[self._y_col])
                        points.append( (x,y) )
                if len(points)>0: cv2.polylines( frame , [array(points,int32)] , False, (255,255,0), 1, lineType=cv2.cv.CV_AA )
            

        #draw the selected path
        #When the rows are selected with the popup menu in the Table
        if drawSelectedRows:
            selectedRows = self._query.selectedRows
            if len( selectedRows )>0:
                track_points = []
                for row in selectedRows:
                    values = self._query.valuesInRow(row)
                    x = int(values[self._x_col])
                    y = int(values[self._y_col])
                    track_points.append( (x,y) )
                cv2.polylines(frame, [array(track_points,int32)], False, (0,255,0), 1)
                for point in track_points: cv2.circle(frame, point, 3, (0,0,255), thickness=1, lineType= cv2.cv.CV_AA)


        #Draw the current mouse selected row
        if self._current_row != None  and self._showPos.value: frame = self.drawRow( frame, self._current_row, (0,0,255) )
            
        if self._player.is_playing(): self.drawCurrentPositionWhenIsPlaying(frame)

        return frame


    ############################################################################
    ############ Functions #####################################################
    ############################################################################

    def search_4_frame(self, frame2Search, startAtRow = 0):
        """
        This function search for a frame in the List _query
        @param frame2Search: Frame to search
        @type frame2Search: Integer
        @param startAtRow: Start looking in the List row index
        @type startAtRow: Integer
        """

        if startAtRow<0: startAtRow=0
        total_count_rows = self._query.count
        
        if total_count_rows==0: # No rows
            return None
        elif total_count_rows==1: #If only one row
            unique_row = self._query.valuesInRow( 0 )
            frame = int(unique_row[self._frame_col])
            if frame > frame2Search: return 0, None, unique_row, None
            else: return None, 0, None, unique_row
        elif startAtRow >= total_count_rows: # In case of start searching in a non existing row
            last_row = self._query.valuesInRow( total_count_rows-1 )
            return total_count_rows-1, None, last_row, None
        else:
            #check the next row
            previous_row    = self._query.valuesInRow( startAtRow )
            next_row        = self._query.valuesInRow( startAtRow + 1 )
            if previous_row!=None and next_row!=None: #check the current row
                previous_frame  = int(previous_row[self._frame_col])
                next_frame      = int(next_row[self._frame_col])
                if previous_frame<=frame2Search<next_frame: 
                    return startAtRow, startAtRow+1, previous_row, next_row
                else: #check the next row
                    previous_row    = self._query.valuesInRow( startAtRow+1 )
                    next_row        = self._query.valuesInRow( startAtRow+2 )
                    if previous_row!=None and next_row!=None:
                        previous_frame  = int(previous_row[self._frame_col])
                        next_frame      = int(next_row[self._frame_col])
                        if previous_frame<=frame2Search<next_frame: 
                            return startAtRow+1, startAtRow+2, previous_row, next_row

            #check if the frame to search is bellow the first row and higher than the last frame
            first_row = self._query.valuesInRow( 0 )
            first_frame = int(first_row[self._frame_col])
            last_row = self._query.valuesInRow( total_count_rows-1 )
            last_frame = int(last_row[self._frame_col])
            if first_frame>=frame2Search: 
                return None, 0, None, first_row
            elif frame2Search>=last_frame:
                return total_count_rows-1, None, last_row, None
            else:
                #Give up!!!! ....Start a binary tree search
                previous_row_index  = 0
                next_row_index      = (total_count_rows+1)/2
                count = 0
                # search for the frame
                calculateSize = True
                while True:
                    if count > 10000: # for security. We don't want the algorithm to enter in a infinite loop
                        return None 
                    if calculateSize: sizeOfList2Search = (next_row_index - previous_row_index)
                    calculateSize = True

                    next_row            = self._query.valuesInRow( next_row_index )
                    next_frame          = int( next_row[self._frame_col] )

                    previous_row        = self._query.valuesInRow( previous_row_index )
                    previous_frame      = int( previous_row[self._frame_col] )

                    if sizeOfList2Search==1 and previous_frame <= frame2Search < next_frame:
                        return previous_row_index, next_row_index, previous_row, next_row
                    elif sizeOfList2Search<1:
                        return None
                    elif previous_frame==frame2Search:
                        return previous_row_index, previous_row_index+1, previous_row, self._query.valuesInRow( previous_row_index+1 )
                    elif next_frame <= frame2Search and sizeOfList2Search>1:
                        previous_row_index = next_row_index
                        next_row_index += (sizeOfList2Search+1)/2
                        if next_row_index>=total_count_rows: next_row_index = total_count_rows-1
                    elif previous_frame < frame2Search < next_frame and sizeOfList2Search>1:
                        next_row_index -= (sizeOfList2Search+1)/2
                        if next_row_index<0: next_row_index = previous_row_index+1
                        calculateSize = False
                    else:
                        count += 1


                
    def drawCurrentPositionWhenIsPlaying( self, frame ):
        current_frame = self._player.value.getCurrentFrame()
        res = self.search_4_frame( current_frame, self._current_row_index )
        
        if res!=None and self._showPos.value:
            previous_index, next_index, previous_row, next_row = res

            row = None
            if previous_row==None:
                self._current_row_index = 0
                row = next_row
                x, y = int(row[self._x_col]), int(row[self._y_col])
            elif next_row==None:
                self._current_row_index = previous_index
                row = previous_row
                x, y = int(row[self._x_col]), int(row[self._y_col])
            else:
                row = previous_row
                prev_x, prev_y = float(previous_row[self._x_col]), float(previous_row[self._y_col])
                next_x, next_y = float(next_row[self._x_col]), float(next_row[self._y_col])
                prev_frame, next_frame = int(previous_row[0]), int(next_row[0])
                nSteps = float(next_frame - prev_frame)
                xStep, yStep = (next_x-prev_x)/nSteps, (next_y-prev_y)/nSteps
                nSteps2CurrentFrame = float(current_frame-prev_frame)
                x, y = xStep*nSteps2CurrentFrame, yStep*nSteps2CurrentFrame
                x, y = int(round( prev_x + x )), int(round( prev_y + y ))

            #row[self._x_col], row[self._y_col] = x, y
            #frame = self.drawRow( frame, row, (255,0,0) )
            cv2.circle(frame, (x,y), 3, (255,0,0), 2)
        return frame


    def drawRow(self, frame, row, color = (0,255,0) ):
        x, y = int(row[self._x_col]), int(row[self._y_col])
        cv2.circle(frame, (x, y), 3, color, thickness=2, lineType= cv2.cv.CV_AA)
        return frame


    def interpolateBetween2Rows(self, row1, row2, update = (lambda x: 0), cols_2_interpolate = None ):
        """
        Interpolate values between 2 rows
        @param row1: First row
        @type row1: Integer
        @param row2: First row
        @type row2: Integer
        """
        if cols_2_interpolate==None:
            checked_columns = self._columns.checkedIndexes
            n_columns = len(self._query.columns)
            cols_2_interpolate = map( lambda x: True if x in checked_columns else False, range(n_columns) )
        else:
            n_columns = len(cols_2_interpolate)
        
        previous_row = self._query.valuesInRow( row1 )
        next_row = self._query.valuesInRow( row2 )    
        previous_frame = int( previous_row[self._frame_col] )
        next_frame = int( next_row[self._frame_col] )
        diff_frames = float( next_frame - previous_frame )
        if diff_frames>1:
            previous, next, diff, step = [], [], [], []
            for i in range(n_columns): 
                if cols_2_interpolate[i]:
                    previous.append(    float(previous_row[i]) )
                    next.append(        float(next_row[i])     )
                    diff = float(next[i]) - float(previous[i])
                    step.append( diff / diff_frames )                        
                else: 
                    step.append( None )
                    previous.append(    previous_row[i] )
                    next.append(        next_row[i]     )

            for j in range(1, int(diff_frames)):
                values = []
                for i in range(n_columns):
                    if cols_2_interpolate[i]:
                        if int(previous[i])==previous[i] and int(next[i])==next[i]:
                            val = int(previous[i]) + int(round( step[i]* float(j) ))
                        else:
                            val = previous[i] + step[i]*float(j)
                    else: val = previous[i]
                    values.append( val )
                update( row1 + j )

                values.pop(0)
                self._query.addRow( values, -1,cols= [ 'frame', 'seconds','milliseconds', 'x', 'y', 'object' ])
                QApplication.processEvents()
示例#22
0
class OTModuleSubBackground(OTModuleResultsPlugin, OTModulePositions,
                            OTPRemoveBackground, OTPColorFilter, OTPBlur,
                            OTPFindBlobs, OTPSelectBiggerBlobs):

    MHI_DURATION = 0.5
    MAX_TIME_DELTA = 0.25
    MIN_TIME_DELTA = 0.05

    _isRunning = None

    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPRemoveBackground.__init__(self)
        OTPColorFilter.__init__(self)
        OTPBlur.__init__(self)
        OTPFindBlobs.__init__(self)
        OTPSelectBiggerBlobs.__init__(self)
        OTModuleResultsPlugin.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._background = OTParamBackground("Background",
                                             varname='_param_background')
        self._threshold = OTParamSlider("Threshold",
                                        110,
                                        1,
                                        255,
                                        varname='_param_background_threshold')
        self._minArea = OTParamSlider("Blob min. area",
                                      100,
                                      0,
                                      50000,
                                      varname='_param_min_area')
        self._maxArea = OTParamSlider("Blob max. area",
                                      10000,
                                      0,
                                      100000,
                                      varname='_param_max_area')
        self._textAlgo = OTParamText(
            "Blob function ( Operations: [ AND: * ; OR: + ; SUB: - ; NEG: ~ ] Ex: A+B-~C )",
            "A*B*C",
            varname='_param_filter_algorithm')
        self._removeBg = OTParamCheckBox("Remove the background", True)
        self._editMode = OTParamCheckBox("Edit mode", True)
        self._run = OTParamButton("Run")
        self._player = OTParamPlayer("Video player")
        self._progress = OTParamProgress()

        self._selectBiggests = OTParamCheckBox(
            "Select only the biggests blobs", True)
        self._howMany = OTParamSlider("How many?",
                                      1,
                                      1,
                                      20,
                                      varname='_param_n_blobs')

        self._useBlur = OTParamCheckBox("Use blur", True)
        self._kernelSize = OTParamSlider("Kernel size",
                                         1,
                                         1,
                                         50,
                                         varname='_param_kernel_size')
        self._blurThreshold = OTParamSlider("Blur threshold",
                                            110,
                                            1,
                                            255,
                                            varname='_param_blur_threshould')

        self._colorDomain = OTParamCombo("Colors space",
                                         varname='_param_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("XYZ", cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb", cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV", cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS", cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab", cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv", cv2.COLOR_BGR2LUV)

        self._activeR = OTParamCheckBox("Active")
        self._activeG = OTParamCheckBox("Active")
        self._activeB = OTParamCheckBox("Active")

        self._minR = OTParamSlider("min. A", 1, 0, 255, varname='_param_a_min')
        self._maxR = OTParamSlider("max. A",
                                   255,
                                   0,
                                   255,
                                   varname='_param_a_max')
        self._minG = OTParamSlider("min. B", 1, 0, 255, varname='_param_b_min')
        self._maxG = OTParamSlider("max. B",
                                   255,
                                   0,
                                   255,
                                   varname='_param_b_max')
        self._minB = OTParamSlider("min. C", 1, 0, 255, varname='_param_c_min')
        self._maxB = OTParamSlider("max. C",
                                   255,
                                   0,
                                   255,
                                   varname='_param_c_max')

        self._groupBlobs = OTParamCheckBox("Group blobs", True)
        self._maxDistance = OTParamSlider("Max. dist. between blobs", 1, 30,
                                          300)

        self._groupBlobs.valueUpdated = self.groupBlobsUpdated
        self._colorDomain.valueUpdated = self.refreshValue

        self._activeR.valueUpdated = self.refreshValue
        self._activeG.valueUpdated = self.refreshValue
        self._activeB.valueUpdated = self.refreshValue

        self._minR.valueUpdated = self.refreshValue
        self._maxR.valueUpdated = self.refreshValue
        self._minG.valueUpdated = self.refreshValue
        self._maxG.valueUpdated = self.refreshValue
        self._minB.valueUpdated = self.refreshValue
        self._maxB.valueUpdated = self.refreshValue

        self._textAlgo.valueUpdated = self.refreshValue
        self._threshold.valueUpdated = self.refreshValue
        self._kernelSize.valueUpdated = self.refreshValue
        self._blurThreshold.valueUpdated = self.refreshValue
        self._maxArea.valueUpdated = self.refreshValue
        self._minArea.valueUpdated = self.refreshValue
        self._maxDistance.valueUpdated = self.refreshValue

        self._removeBg.valueUpdated = self.removeBgUpdate
        self._useBlur.valueUpdated = self.useBlurUpdate
        self._selectBiggests.valueUpdated = self.selectBiggestsUpdate

        self._formset = [
            ('_video', '_editMode', '_run'),
            [
                "_player", {
                    "1. Filter colors": [
                        '_colorDomain', ("_minR", '_activeR', "_maxR"),
                        ("_minG", '_activeG', "_maxG"),
                        ("_minB", '_activeB', "_maxB"), "_textAlgo"
                    ],
                    "2. Remove background":
                    ['_removeBg', '_background', '_threshold'],
                    "3. Filter objects":
                    [('_minArea', '_maxArea'),
                     ('_useBlur', '_kernelSize', '_blurThreshold'),
                     ("_selectBiggests", "_howMany")],
                    "4. Tracking": [('_groupBlobs', '_maxDistance')],
                }, "=", "_results", "_query"
            ], "_progress"
        ]

        self._run.value = self.run
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

        self._isRunning = False

        self._blurThreshold.hide()
        self._kernelSize.hide()
        self._background.hide()
        self._threshold.hide()
        self._progress.hide()
        self._howMany.hide()
        self._results.hide()
        self._query.hide()
        self._maxDistance.hide()

    def refreshValue(self, value):
        self._player.refresh()

    def groupBlobsUpdated(self, value):
        if value:
            self._maxDistance.show()
        else:
            self._maxDistance.hide()
        self._player.refresh()

    def selectBiggestsUpdate(self, value):
        if value:
            self._howMany.show()
        else:
            self._howMany.hide()
        self._player.refresh()

    def useBlurUpdate(self, value):
        if value:
            self._kernelSize.show()
            self._blurThreshold.show()
        else:
            self._kernelSize.hide()
            self._blurThreshold.hide()
        self._player.refresh()

    def removeBgUpdate(self, value):
        if value:
            self._background.show()
            self._threshold.show()
        else:
            self._background.hide()
            self._threshold.hide()
        self._player.refresh()

    def run(self):
        if self._isRunning == True:
            self._isRunning = False
        else:

            self._run.label = "Cancel"
            self._isRunning = True

            video = self._video.value

            self._player.enabled = False
            self._query.enabled = False
            self._results.enabled = False
            self._minArea.enabled = False
            self._maxArea.enabled = False
            self._video.enabled = False
            self._background.enabled = False
            self._editMode.enabled = False
            self._colorDomain.enabled = False
            self._activeR.enabled = False
            self._activeG.enabled = False
            self._activeB.enabled = False
            self._minR.enabled = False
            self._maxR.enabled = False
            self._minG.enabled = False
            self._maxG.enabled = False
            self._minB.enabled = False
            self._maxB.enabled = False

            self._progress.show()
            self._progress.min = video.videoInput.startFrame
            self._progress.value = video.videoInput.startFrame
            self._progress.max = video.videoInput.endFrame

            QApplication.processEvents()

            query = QtSql.QSqlQuery(self.parentModule.sqldb)

            query.exec_("PRAGMA cache_size = 65536")
            query.exec_("PRAGMA temp_store = MEMORY")
            query.exec_("PRAGMA journal_mode = OFF")
            #query.exec_("PRAGMA locking_mode = EXCLUSIVE")
            query.exec_("PRAGMA synchronous = OFF")

            tablename = "%s_output" % (self.name.replace(
                " ", "").lstrip('0123456789.'))
            res = query.exec_("DROP TABLE IF EXISTS %s" % tablename)
            if not res:
                print "trying to drop: ", query.lastError().text()
                query.finish()
                query = QtSql.QSqlQuery(self.parentModule.sqldb)
                query.exec_("PRAGMA cache_size = 65536")
                query.exec_("PRAGMA temp_store = MEMORY")
                query.exec_("PRAGMA journal_mode = OFF")
                query.exec_("PRAGMA synchronous = OFF")
                res = query.exec_("DELETE FROM %s" % tablename)
                if not res:
                    print "trying to delete: ", query.lastError().text()
                self.parentModule.sqldb.commit()
            else:
                query.exec_(
                    "CREATE TABLE if not exists %s(id INTEGER PRIMARY KEY AUTOINCREMENT, frame BIGINT, seconds DOUBLE, milliseconds BIGINT, x INTEGER, y INTEGER, polygon text, b INTEGER, g INTEGER, r INTEGER)"
                    % tablename)

            success = True
            video.videoInput.setFrame(0)

            while (success and self._isRunning):
                (success, frame) = video.videoInput.read()
                if success:
                    self.processFrame(frame)
                    milliseconds = video.videoInput.getCurrentFrame(
                    ) * video.videoInput.videoFrameTimeInterval

                    for i, obj in enumerate(self._objectsFound):
                        centroid = obj._centroid
                        poly = obj._contour.tolist(
                        )  #cv2.convexHull(obj['countour']).tolist()
                        b_avg = obj._b_avg
                        g_avg = obj._g_avg
                        r_avg = obj._r_avg
                        query.exec_(
                            "INSERT INTO %s(  frame, seconds, milliseconds, x, y, polygon, b,g,r ) VALUES (%d,%f,%f,%d,%d,'%s', %d, %d, %d)"
                            %
                            (tablename, video.videoInput.getCurrentFrame(),
                             milliseconds / 1000.0, milliseconds, centroid[0],
                             centroid[1], poly, b_avg, g_avg, r_avg))

                    self._progress.value = video.videoInput.getCurrentFrame()
                    QApplication.processEvents()

            self._progress.value = video.videoInput.endFrame
            QApplication.processEvents()
            query.finish()
            self.parentModule.sqldb.commit()
            self._progress.hide()

            self._player.enabled = True
            self._query.enabled = True
            self._results.enabled = True
            self._minArea.enabled = True
            self._maxArea.enabled = True
            self._video.enabled = True
            self._background.enabled = True
            self._editMode.enabled = True

            self._colorDomain.enabled = True
            self._activeR.enabled = True
            self._activeG.enabled = True
            self._activeB.enabled = True
            self._minR.enabled = True
            self._maxR.enabled = True
            self._minG.enabled = True
            self._maxG.enabled = True
            self._minB.enabled = True
            self._maxB.enabled = True

            self._isRunning = False

            self._run.label = "Run"

            self._results.clearItems()
            self._results.addItem(
                "Results",
                "SELECT id, frame, seconds, milliseconds, x, y, polygon, b,g,r FROM %s"
                % tablename)
            self._results.show()
            self._query.show()

    def newVideoInputChoosen(self, value):
        OTParamVideoInput.valueUpdated(self._video, value)
        if value.videoInput:
            self._player.value = value.videoInput
            value.videoInput.setFrame(0)

    def __calcObjectsDist(self, obj, objects_list):
        results = []
        for x in objects_list:
            dist = tools.pointsDistance(obj._centroid, x._centroid)
            results.append((dist, x))
        return sorted(results, key=lambda x: x[0], reverse=True)

    def processFrame(self, frame):
        original = frame.copy()

        if self._removeBg.value:
            frame = OTPRemoveBackground.process(self, frame)
        fish = OTPColorFilter.process(self, frame)
        if self._useBlur.value: fish = OTPBlur.process(self, fish)

        self._objectsFound = OTPFindBlobs.process(self, fish)

        for obj in self._objectsFound:
            mask = zeros_like(original)
            cv2.fillPoly(mask, obj._contour, (255, 255, 255))
            res = cv2.bitwise_and(original, mask)
            b, g, r = cv2.split(res)
            b_avg = mean(b[b > 0])
            g_avg = mean(g[g > 0])
            r_avg = mean(r[r > 0])
            obj._color = b_avg, g_avg, r_avg

        if self._selectBiggests.value:
            self._objectsFound = OTPSelectBiggerBlobs.process(
                self, self._objectsFound)

        ################################################################
        ################################################################

        contours2Display = []
        for obj in self._objectsFound:
            contours2Display.append(obj._contour)

        if self._editMode.value:
            cv2.drawContours(frame, array(contours2Display), -1, (0, 255, 0),
                             2)
        else:
            cv2.drawContours(frame, array(contours2Display), -1, (0, 255, 0),
                             2)

        for i, obj in enumerate(self._objectsFound):
            cv2.circle(frame, obj._centroid, 5, (255, 0, 0), thickness=1)
            p = obj._bounding[0]
            text = "AREA: %d" % obj._area
            cv2.putText(frame, text, p, cv2.FONT_HERSHEY_SIMPLEX, 0.3,
                        (255, 255, 255), 3)
            cv2.putText(frame, text, p, cv2.FONT_HERSHEY_SIMPLEX, 0.3,
                        (0, 0, 255), 1)

        if self._editMode.value:
            if self._colorDomain.value >= 0:
                original = cv2.cvtColor(original, self._colorDomain.value)
            r, g, b = cv2.split(original)
            if not self._activeR.value: r = r * 0
            if not self._activeG.value: g = g * 0
            if not self._activeB.value: b = b * 0
            r = cv2.inRange(r, array(self._minR.value),
                            array(self._maxR.value))
            g = cv2.inRange(g, array(self._minG.value),
                            array(self._maxG.value))
            b = cv2.inRange(b, array(self._minB.value),
                            array(self._maxB.value))
            image = cv2.merge((b, g, r))

            return [frame, image, fish]
        else:
            return frame

    def exportCodeTo(self, folder):
        files_to_copy = []
        files_to_include = []
        constructor = ""
        parameters = []
        imports = ""

        files, imp, cons, params = self._video.value.exportCodeTo(folder)
        constructor += cons
        parameters += params
        imports += imp
        files_to_include += files
        print files_to_include, files

        if self._removeBg.value:
            files, imp, cons, params = self._background.value.exportCodeTo(
                folder)
            constructor += cons
            parameters += params
            files_to_copy.append("OTPRemoveBackground")
            imports += imp
            files_to_include += files

            parameters.append("self._param_background_threshold = %d " %
                              self._threshold.value)

        files_to_copy.append("OTPColorFilter")

        parameters.append("self._param_color_domain = %d " %
                          self._colorDomain.value)
        parameters.append("self._param_filter_algorithm = '%s' " %
                          self._textAlgo.value)
        parameters.append("self._param_a_min = %d " % self._minR.value)
        parameters.append("self._param_a_max = %d " % self._maxR.value)
        parameters.append("self._param_b_min = %d " % self._minG.value)
        parameters.append("self._param_b_max = %d " % self._maxG.value)
        parameters.append("self._param_c_min = %d " % self._minB.value)
        parameters.append("self._param_c_max = %d " % self._maxB.value)

        if self._useBlur.value:
            files_to_copy.append("OTPBlur")
            parameters.append("self._param_kernel_size = %d " %
                              self._kernelSize.value)
            parameters.append("self._param_blur_threshould = %d " %
                              self._blurThreshold.value)

        self._objectsFound = files_to_copy.append("OTPFindBlobs")
        parameters.append("self._param_min_area = %d " % self._minArea.value)
        parameters.append("self._param_max_area = %d " % self._maxArea.value)

        if self._selectBiggests.value:
            files_to_copy.append("OTPSelectBiggerBlobs")
            parameters.append("self._param_n_blobs = %d " %
                              self._howMany.value)

        for file_to_copy in files_to_copy:
            filename = file_to_copy + ".py"
            originalfilepath = tools.getFileInSameDirectory(__file__, filename)
            destinyfilepath = os.path.join(folder, filename)
            #shutil.copy2(originalfilepath,destinyfilepath)

            f = open(originalfilepath, 'r')
            text = f.read()
            f.close()
            text = text.replace("from mcvgui.core.controllers.", "from ")
            f = open(destinyfilepath, 'w')
            f.write(text)
            f.close()

            imports += "from %s import %s \n" % (file_to_copy, file_to_copy)

        files_to_include += files_to_copy
        files_to_include.reverse()
        return files_to_include, imports, constructor, parameters
示例#23
0
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'icon.jpg')
        OTModuleResultsPlugin.__init__(self, name, iconFile = icon_path)

        self._x_col = 4 #Indicate the column with the X coord
        self._y_col = 5 #Indicate the column with the Y coord
        self._frame_col = 1 #Indicate the column with the Y coord
        self._object_col = 6
        self._current_row = None

        self._imgWidth = 0.0
        self._imgHeight = 0.0
        self._startPoint = None
        self._endPoint = None

        self._video = OTParamVideoInput("Video")
        self._positions = OTParamPositions("Positions")
        self._showPos = OTParamCheckBox("Show position")
        self._showTrack = OTParamCheckBox("Show track")
        self._trackRange = OTParamSlider("Track range", 10, 10, 1000)
        self._player = OTParamPlayer("Video player")
        self._progress = OTParamProgress()
        
        #Fields used to configure the Position draw function
        self._show_draw_function = OTParamToggle("Show/Hide draw function")
        self._draw_function = OTParamTextArea("Draw function", """def draw(frame, row):
            x, y = int(row[self._x_col]), int(row[self._y_col])
            cv2.circle(frame, (x, y), 3, (0,255,0), thickness=2, lineType= cv2.cv.CV_AA)""")
        self._importFunc = OTParamButton("Import")
        self._exportFunc = OTParamButton("Export")
        
        #Fields used to configure the interpolation
        self._columns = OTParamCheckBoxList("List of columns to interpolate")
        self._run_interpolation = OTParamButton("Interpolate")
        self._run_interpolation_4_all = OTParamButton("Interpolate")

        #organization of the form
        self._formset = [   ('_video','_positions'), 
            [ ('_columns', '_run_interpolation', '_run_interpolation_4_all'),
            "_draw_function", 
            (" ", "_importFunc", "_exportFunc"), 
            "_player",
            ('_showPos',"_showTrack", "_trackRange")
            ,"=","_results", "_query"], '_progress' ]

        self._trackRange.enabled = False
        self._showPos.value = True

        #setting up the fields events
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen
        self._positions.valueUpdated = self.newPositionsChoosen
        self._showTrack.valueUpdated = self.showTrackToggle
        self._query.selectionChanged = self.tableSelectionChanged
        self._trackRange.valueUpdated = self.updateTrackRange
        self._player._videoWidget.onEndDrag = self.onEndDragInVideoWindow
        self._show_draw_function.value = self.showHideDrawFunction
        self._importFunc.value = self.importFunction
        self._exportFunc.value = self.exportFunction
        self._run_interpolation.value = self.interpolationPositions
        self._run_interpolation_4_all.value = self.interpolateAllPositions

        #Hide fields
        self._draw_function.hide()
        self._progress.hide()
        self._importFunc.hide()
        self._exportFunc.hide()
        self._columns.hide()
        self._run_interpolation.hide()
        self._run_interpolation_4_all.hide()
        
        #Configure the popup menu
        self._query.addPopupMenuOption("-")
        self._query.addPopupSubMenuOption("Add", {"Interpolation": self.showColumns4Interpolation, "Duplicate row": self.addDuplicatedRow })
        self._query.addPopupMenuOption("Remove", self._query.remove)
        self._query.addPopupMenuOption("-")
        self._query.addPopupMenuOption("Approximate all positions", self.approximatePositions)
        self._query.addPopupMenuOption("Interpolate all positions", self.showColumns4InterpolationAll)
        
        self._current_row_index = None #Variable used to read the current row when the video is playing
示例#24
0
class OTModuleBlobsFilter(OTModulePlugin,OTModulePositions, OTPThreshBlobs, OTPThreshImage):
    

    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTModulePlugin.__init__(self, name,  iconFile=icon_path)
        OTPThreshImage.__init__(self)
        OTPThreshBlobs.__init__(self)
        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")
        self._polygons = OTParamGeometry("Geometry")
        
        self._blockSize = OTParamSlider("Block size", 3, 3, 500,varname='_param_tb_block_size')
        self._C = OTParamSlider("C", 0, 0, 500,varname='_param_tb_c')
        self._boxWidth = OTParamSlider("Width", 0, 0, 30,varname='_param_tb_box_width')
        self._boxHeight = OTParamSlider("Height", 0, 0, 30,varname='_param_tb_box_height')
        self._adaptiveMethod = OTParamCombo("Adaptive method",varname='_param_tb_adaptive_method')
        self._adaptiveMethod.addItem("Mean", cv2.cv.CV_ADAPTIVE_THRESH_MEAN_C)
        self._adaptiveMethod.addItem("Gaussian", cv2.cv.CV_ADAPTIVE_THRESH_GAUSSIAN_C)
        
        self._colorDomain = OTParamCombo("Colors space",varname='_param_tb_color_domain')
        self._colorDomain.addItem("RGB", -1)
        self._colorDomain.addItem("Gray",   cv2.COLOR_BGR2GRAY)
        self._colorDomain.addItem("XYZ",    cv2.COLOR_BGR2XYZ)
        self._colorDomain.addItem("YCrCb",  cv2.COLOR_BGR2YCR_CB)
        self._colorDomain.addItem("HSV",    cv2.COLOR_BGR2HSV)
        self._colorDomain.addItem("HLS",    cv2.COLOR_BGR2HLS)
        self._colorDomain.addItem("Lab",    cv2.COLOR_BGR2LAB)
        self._colorDomain.addItem("Luv",    cv2.COLOR_BGR2LUV)
        
        self._colorComponent = OTParamCombo("Component",varname='_param_tb_color_component')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._formset = [ 
                ('_video','_polygons'),"_player",('_colorDomain','_colorComponent','_adaptiveMethod'), ('_boxWidth', '_boxHeight'),('_blockSize',"_C")
            ]

        self._colorDomain.valueUpdated = self.refreshValue
        self._colorComponent.valueUpdated = self.refreshValue
        self._adaptiveMethod.valueUpdated = self.refreshValue
        self._boxHeight.valueUpdated = self.refreshValue
        self._boxWidth.valueUpdated = self.refreshValue
        self._blockSize.valueUpdated = self.refreshValue
        self._C.valueUpdated = self.refreshValue
        
        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

    def refreshValue(self, value):
        self._player.refresh()

    def newVideoInputChoosen(self, value):
        OTParamVideoInput.valueUpdated(self._video,value)
        if value.videoInput:
            self._player.value = value.videoInput
            value.videoInput.setFrame(0)

    def processFrame(self, frame):
        self._video.value.processFrame(frame.copy())
       
        if isinstance(self._video.value, OTModuleColorFilter):
            self._original_frame = frame
            blobs = OTPThreshBlobs.compute(self, self._video.value._objectsFound)
            for blob in blobs:
                p1, p2 = blob._tb_cut_bounding
                frame[p1[1]:p2[1],p1[0]:p2[0],2] = blob._tb_biggest_img
                blob.draw(frame)
        else:
            frame = OTPThreshImage.compute(self, frame)
            
        return [frame]



    def exportCodeTo(self, folder):
        files_to_copy = []        
        classes, imports, constructer_params, parameters = [], [], [], []
        classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._video.value.exportCodeTo(folder)
        classes += classes_tmp; imports += imports_tmp; constructer_params += constructer_params_tmp; parameters += parameters_tmp;

        #SET OTPRemoveBackground
        if isinstance(self._video.value, OTModuleColorFilter):
            files_to_copy.append( 'OTPThreshBlobs' )
            parameters.append("self._param_tb_color_component = %d " % self._colorComponent.value )
            parameters.append("self._param_tb_color_domain = %d " % self._colorDomain.value )
            parameters.append("self._param_tb_adaptive_method = %d " % self._adaptiveMethod.value )
            parameters.append("self._param_tb_box_height = %d " % self._boxHeight.value )
            parameters.append("self._param_tb_box_width = %d " % self._boxWidth.value )
            parameters.append("self._param_tb_block_size = %d " % self._blockSize.value )
            parameters.append("self._param_tb_c = %d " % self._C.value )
        else:
            files_to_copy.append( 'OTPThreshImage' )
            parameters.append("self._param_tb_color_component = %d " % self._colorComponent.value )
            parameters.append("self._param_tb_color_domain = %d " % self._colorDomain.value )
            parameters.append("self._param_tb_adaptive_method = %d " % self._adaptiveMethod.value )
            parameters.append("self._param_tb_block_size = %d " % self._blockSize.value )
            parameters.append("self._param_tb_c = %d " % self._C.value )
        #END SET

    
        classes += files_to_copy
        for file_to_copy in files_to_copy:
            filename = file_to_copy+".py"; originalfilepath = tools.getFileInSameDirectory(__file__, filename); destinyfilepath = os.path.join( folder, filename )            
            f = open(originalfilepath, 'r'); text = f.read(); f.close(); text = text.replace("from mcvgui.core.controllers.", "from "); f = open(destinyfilepath, 'w'); f.write(text); f.close()
            imports.append( "from %s import %s" % (file_to_copy, file_to_copy) )
        
        return classes, imports, constructer_params, parameters
示例#25
0
class OTModuleGeometry(OTBaseModuleGeometry):

    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'icongeo.png')
        OTBaseModuleGeometry.__init__(self,name, iconFile = icon_path)

        self._imgWidth = 0.0
        self._imgHeight = 0.0
        self._startPoint = None
        self._endPoint = None

        self._selectedPoly = None
        self._selectedPoint = None
        

        self._video  = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video")
        self._remove = OTParamButton("Remove")
        self._square = OTParamToggle("Square")
        self._circle = OTParamToggle("Circle")
        self._export = OTParamButton("Export")
        self._import = OTParamButton("Import")

        self._formset = [ '_video',"_player", ("_square", "_circle", " ","_remove"," ", "_export", "_import"), "=", "_polygons" ]

        self._video.valueUpdated = self.videoSelected
        self._square.value = self.square_toggle
        self._circle.value = self.circle_toggle
        self._remove.value = self.remove_clicked
        self._export.value = self.export_clicked
        self._import.value = self.import_clicked
        
        self._player._videoWidget.onDrag = self.onDragInVideoWindow
        self._player._videoWidget.onEndDrag = self.onEndDragInVideoWindow
        self._player._videoWidget.onClick = self.onClickInVideoWindow
        self._player._videoWidget.onDoubleClick = self.onDoubleClickInVideoWindow
        self._player.processFrame = self.processFrame
        
    def export_clicked(self):
        filename = str(QFileDialog.getSaveFileName(self._form, 'Choose a file', '') )
        if filename!="":
            output = open( filename, 'wb')
            pickle.dump( self._polygons.value , output)
            output.close()

    def import_clicked(self):
        filename = str(QFileDialog.getOpenFileName(self._form, 'Choose a file', '') )
        if filename!="":
            pkl_file = open( filename, 'rb'); data = pickle.load(pkl_file); pkl_file.close()
            self._polygons.value = data

    def processFrame(self, frame):
        rows = self._polygons.value
        for objIndex, obj in enumerate(rows):
            try:
                points = eval(obj[1])
                cv2.polylines(frame, [numpy.array(points,numpy.int32)], True, (0,255,0), 1, lineType=cv2.CV_AA)
                
                for pointIndex, point in enumerate( points ):
                    if self._selectedPoint == pointIndex and objIndex==self._selectedPoly:
                        cv2.circle(frame, point, 2, (255,0,0), 1)
                    else:
                        cv2.circle(frame, point, 2, (0,255,0), 1)
            except: pass
            
        if self._startPoint and self._endPoint:
            if self._square.isChecked():
                cv2.rectangle(frame, self._startPoint, self._endPoint, (233,44,44), 1 )
            elif self._circle.isChecked() and self._endPoint[0]>self._startPoint[0] and self._endPoint[1]>self._startPoint[1]:
                width = self._endPoint[0]-self._startPoint[0]
                height = self._endPoint[1]-self._startPoint[1]
                center = ( self._startPoint[0] + width/2, self._startPoint[1] + height/2 )
                
                cv2.ellipse( frame, center, (width/2,height/2), 0, 0, 360, (233,44,44), 1 )
                
        return frame

    def selectPoint(self,x, y):
        rows = self._polygons.value
        for objIndex, obj in enumerate(rows):
            try:
                points = eval(obj[1])
                for pointIndex, point in enumerate( points):
                    mouseCoord = ( x, y )
                    if tools.pointsDistance( mouseCoord, point ) <= 5:
                        self._selectedPoint = pointIndex
                        self._selectedPoly = objIndex
                        return
                self._selectedPoint = None
                self._selectedPoly = None
            except: pass

    def getIntersectionPoint(self, testPoint, point1, point2, tolerance = 5):
        vector = ( point2[0]-point1[0], point2[1]-point1[1] )
        p0 = point1
        if vector[0]!=0:
            k = float(testPoint[0] - p0[0]) / float(vector[0])
            y = float(p0[1]) + k * float(vector[1]) 
            if point2[0]>point1[0]:
                maxValue = point2[0]
                minValue = point1[0]
            else:
                maxValue = point1[0]
                minValue = point2[0]
            if abs(y-testPoint[1])<=tolerance and testPoint[0]<=maxValue and testPoint[0]>=minValue: return testPoint
            else: return None
        elif vector[1]!=0:
            k = float(testPoint[1] - p0[1]) / float(vector[1])
            x = float(p0[0]) + k * float(vector[0])
            if point2[1]>point1[1]: 
                maxValue = point2[1]
                minValue = point1[1]
            else:
                maxValue = point1[1]
                minValue = point2[1]
            if abs(x-testPoint[0])<=tolerance and testPoint[1]<=maxValue and testPoint[1]>=minValue: return testPoint
            else: return None
        else: return None

    def onDoubleClickInVideoWindow(self, event, x, y):
        mouse = ( int(x*self._imgWidth), int(y*self._imgWidth) )
        rows = self._polygons.value
        for objIndex, obj in enumerate(rows):
            try:
                points = eval(obj[1])
                n_points = len(points)
                for pointIndex, point in enumerate( points ):
                    next_point = points[ (pointIndex+1) % n_points ]
                    intersection = self.getIntersectionPoint(mouse, point, next_point )
                    if intersection != None:
                        self._selectedPoly = objIndex
                        points.insert( pointIndex + 1, intersection )
                        self._polygons.setValue( 1, self._selectedPoly, points )
                        self._selectedPoint = pointIndex + 1
                        return
            except: pass

    
    def onClickInVideoWindow(self, event, x, y):
        self.selectPoint( int(x * self._imgWidth), int(y * self._imgWidth) )

    def onDragInVideoWindow(self, startPoint, endPoint):
        self._startPoint = ( int(startPoint[0] * self._imgWidth), int(startPoint[1] * self._imgWidth) )
        self._endPoint = ( int(endPoint[0] * self._imgWidth), int(endPoint[1] * self._imgWidth) )

        if self._selectedPoly!=None and self._selectedPoint!=None:
            poly = self._polygons.getValue( 1, self._selectedPoly )
            try:
                points = eval(poly)
                points[self._selectedPoint] = self._endPoint
                self._polygons.setValue( 1, self._selectedPoly, points )
            except: pass

        if not self._player.is_playing(): self._player.refresh()
            
    def onEndDragInVideoWindow(self, startPoint, endPoint):
        self._startPoint = ( int(startPoint[0] * self._imgWidth), int(startPoint[1] * self._imgWidth) )
        self._endPoint = ( int(endPoint[0] * self._imgWidth), int(endPoint[1] * self._imgWidth) )

        points = None
        if self._square.isChecked():
            points = createRectanglePoints(self._startPoint, self._endPoint)
        elif self._circle.isChecked() and self._endPoint[0]>self._startPoint[0] and self._endPoint[1]>self._startPoint[1]:
            points = createEllipsePoints(self._startPoint, self._endPoint)

        if points: self._polygons += ["Poly_%d" % self._polygons.count, points]

        self._startPoint = None
        self._endPoint = None
        self._square.uncheck()
        self._circle.uncheck()

    def videoSelected(self, value):
        if value and value!="" and value.hasVideo():
            self._player.value = value
            self._imgWidth = float(value.width)
            self._imgHeight = float(value.height)
        else:
            self._player.value = None

    def square_toggle(self, checked):
        if checked:
            self._circle.uncheck()

    def circle_toggle(self, checked):
        if checked:
            self._square.uncheck()

    def remove_clicked(self):
        self._polygons -= -1 #Remove the selected row
class OTModuleSplitColors(OTModulePlugin, OTModuleInputVideoPipe,
                          OTPSplitColors):
    def __init__(self, name):
        icon_path = tools.getFileInSameDirectory(__file__, 'iconsubbg.jpg')
        OTPSplitColors.__init__(self)
        OTModulePlugin.__init__(self, name, iconFile=icon_path)

        self._video = OTParamVideoInput("Video")
        self._player = OTParamPlayer("Video player")

        self._colorComponent = OTParamCombo("Component",
                                            varname='_split_color_channel')
        self._colorComponent.addItem("A", 0)
        self._colorComponent.addItem("B", 1)
        self._colorComponent.addItem("C", 2)

        self._colorComponent.valueUpdated = self.refreshValue

        self._formset = [
            '_video',
            '_colorComponent',
            "_player",
        ]

        self._player.processFrame = self.processFrame
        self._video.valueUpdated = self.newVideoInputChoosen

    def refreshValue(self, value):
        self._player.refresh()

    def newVideoInputChoosen(self, value):
        OTParamVideoInput.valueUpdated(self._video, value)
        if value:
            self.open(value)
            self._player.value = value

    def processFrame(self, frame):
        filtered = OTPSplitColors.compute(self, frame)
        return [frame, filtered]

    def exportCodeTo(self, folder):
        files_to_copy = []
        classes, imports, constructer_params, parameters = [], [], [], []
        #classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._video.value.exportCodeTo(folder)
        #classes += classes_tmp; imports += imports_tmp; constructer_params += constructer_params_tmp; parameters += parameters_tmp;

        #SET OTPRemoveBackground
        if self._removeBg.value:
            classes_tmp, imports_tmp, constructer_params_tmp, parameters_tmp = self._background.value.exportCodeTo(
                folder)
            classes += classes_tmp
            imports += imports_tmp
            constructer_params += constructer_params_tmp
            parameters += parameters_tmp
            files_to_copy.append('OTPRemoveBackground')
            parameters.append("self._param_background_threshold = %d " %
                              self._threshold.value)
        #END SET

        if self._useThreshold.value:
            #SET OTPAdaptativeThreshold
            files_to_copy.append('OTPAdaptativeThreshold')
            parameters.append("self._param_tb_color_component = %d " %
                              self._colorComponent.value)
            parameters.append("self._param_tb_color_domain = %d " %
                              self._th_colorDomain.value)
            parameters.append("self._param_tb_adaptive_method = %d " %
                              self._adaptiveMethod.value)
            parameters.append("self._param_tb_block_size = %d " %
                              self._blockSize.value)
            parameters.append("self._param_tb_threshold_type = %d " %
                              self._th_thresholdType.value)
            parameters.append("self._param_tb_c = %d " % self._C.value)
            #END SET
        elif self._useCanny.value:
            #SET OTPCanny
            files_to_copy.append('OTPCanny')
            parameters.append("self._param_canny_apertureSize = %d " %
                              self._canny_apertureSize.value)
            parameters.append("self._param_canny_L2gradient = %d " %
                              self._canny_L2gradient.value)
            parameters.append("self._param_canny_threshould1 = %d " %
                              self._canny_threshould1.value)
            parameters.append("self._param_canny_threshould2 = %d " %
                              self._canny_threshould2.value)
            parameters.append("self._param_canny_color_component = %d " %
                              self._canny_colorComponent.value)
            parameters.append("self._param_canny_color_domain = %d " %
                              self._canny_colorDomain.value)
            #END SET
        else:
            #SET OTPColorFilter
            files_to_copy.append('OTPColorFilter')
            parameters.append("self._param_color_domain = %d " %
                              self._colorDomain.value)
            parameters.append("self._param_filter_algorithm = '%s' " %
                              self._textAlgo.value)
            parameters.append("self._param_a_min = %d " % self._minR.value)
            parameters.append("self._param_a_max = %d " % self._maxR.value)
            parameters.append("self._param_b_min = %d " % self._minG.value)
            parameters.append("self._param_b_max = %d " % self._maxG.value)
            parameters.append("self._param_c_min = %d " % self._minB.value)
            parameters.append("self._param_c_max = %d " % self._maxB.value)
            #END SET

        #SET OTPBlur
        if self._useBlur.value:
            files_to_copy.append('OTPBlur')
            parameters.append("self._param_kernel_size = %d " %
                              self._kernelSize.value)
            parameters.append("self._param_blur_threshould = %d " %
                              self._blurThreshold.value)
        #END SET

        #SET OTPMaskImage
        if isinstance(self._video.value, OTModuleMaskFromGeometry):
            files_to_copy.append('OTPMaskImage')
            parameters.append("self._param_mi_polygons = np.array(%s)" %
                              str(self._video.value._all_polygons))
            imports.append("import numpy as np")
        #END SET

        #SET OTPFindBlobs
        if self._exportFindBlobs.value:
            files_to_copy.append('OTPFindBlobs')
            parameters.append("self._param_min_area = %d " %
                              self._minArea.value)
            parameters.append("self._param_max_area = %d " %
                              self._maxArea.value)
        #END SET

        #SET OTPSelectBiggerBlobs
        if self._selectBiggests.value:
            files_to_copy.append('OTPSelectBiggerBlobs')
            parameters.append('self._param_n_blobs = %d' % self._howMany.value)
        #END SET

        classes += files_to_copy
        for file_to_copy in files_to_copy:
            filename = file_to_copy + ".py"
            originalfilepath = tools.getFileInSameDirectory(
                __file__, filename)
            destinyfilepath = os.path.join(folder, filename)
            f = open(originalfilepath, 'r')
            text = f.read()
            f.close()
            text = text.replace("from mcvgui.core.controllers.", "from ")
            f = open(destinyfilepath, 'w')
            f.write(text)
            f.close()
            imports.append("from %s import %s" % (file_to_copy, file_to_copy))

        return classes, imports, constructer_params, parameters