Beispiel #1
0
 def updateDevice(self, i_index):
     self.__timer.stop()
     (cam, is_data) = self.__device.itemData(i_index).toInt()
     #FIXME: We shouldn't have to release the memory in Python?
     self.__frame_grabber_cam.release()
     self.__frame_grabber_cam = FrameGrabberWebCam(
         i_scale=self.__scale_select.value(), i_camera=cam)
     self.__head_tracker.clearRoi()
     self.__timer.start()
Beispiel #2
0
 def updateDevice(self,i_index):
     self.__timer.stop()
     (cam, is_data) = self.__device.itemData(i_index).toInt()
     #FIXME: We shouldn't have to release the memory in Python?
     self.__frame_grabber_cam.release()
     self.__frame_grabber_cam = FrameGrabberWebCam(i_scale=self.__scale_select.value(),i_camera=cam)
     self.__head_tracker.clearRoi()
     self.__timer.start()
Beispiel #3
0
class HeadTrackerDisplay(QtGui.QWidget):
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.__active_box.setChecked(False)

    def __init__(self, i_head_tracker, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.__display = qt_image_display.ImageDisplayAndRecord()
        #Recording button
        self.__record_button = QtGui.QPushButton(self)
        self.__record_button.setCheckable(True)
        self.__record_button.setObjectName("recordButton")
        self.__record_button.setText("Record")
        self.connect(self.__record_button, QtCore.SIGNAL("clicked(bool)"),
                     self.recordSlot)

        #File playback button
        self.__file_button = QtGui.QPushButton(self)
        self.__file_button.setCheckable(True)
        self.__file_button.setObjectName("fileButton")
        self.__file_button.setText("Display .avi")
        self.connect(self.__file_button, QtCore.SIGNAL("clicked(bool)"),
                     self.fileSlot)

        #Run Viola Jones on each frame and get the largest face
        self.__face_button = QtGui.QPushButton(self)
        self.__face_button.setCheckable(True)
        self.__face_button.setObjectName("detectButton")
        self.__face_button.setText("Detect faces")
        #Tracking checkBox
        self.__tracking_box = QtGui.QCheckBox()
        self.__tracking_box.setChecked(True)
        self.__tracking_box.setObjectName("trackingBox")
        self.__tracking_box.setText("Enable tracking")
        #Enable xy coordinate out put
        self.__active_box = QtGui.QCheckBox()
        self.__active_box.setChecked(False)
        self.__active_box.setObjectName("activeBox")
        self.__active_box.setText("Activate Cursor Control (ESC to exit)")
        #The scroll bar
        self.__scrollbar_gain_x = QtGui.QScrollBar()
        self.__scrollbar_gain_x.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_x.setMinimum(1)
        self.__scrollbar_gain_y = QtGui.QScrollBar()
        self.__scrollbar_gain_y.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_y.setMinimum(1)
        slider_max = 100
        self.__scrollbar_gain_x.setMaximum(slider_max)
        self.__scrollbar_gain_x.setProperty("value",
                                            QtCore.QVariant(slider_max / 2))
        self.__scrollbar_gain_x.setSliderPosition(slider_max / 2)
        self.__scrollbar_gain_x.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_x.setObjectName("scrollbar_gain")
        self.__scrollbar_gain_y.setMaximum(slider_max)
        self.__scrollbar_gain_y.setProperty("value",
                                            QtCore.QVariant(slider_max / 2))
        self.__scrollbar_gain_y.setSliderPosition(slider_max / 2)
        self.__scrollbar_gain_y.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_y.setObjectName("scrollbar_gain")
        self.__label_gain_x = QtGui.QLabel()
        self.__label_gain_x.setText(QtCore.QString("X gain"))
        self.__label_gain_y = QtGui.QLabel()
        self.__label_gain_y.setText(QtCore.QString("Y gain"))

        #Camera capture settings
        self.__scale_select = QtGui.QDoubleSpinBox()
        self.__scale_select.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__scale_select.setMaximum(1.0)
        self.__scale_select.setMinimum(0.1)
        self.__scale_select.setSingleStep(0.25)
        self.__scale_select.setProperty("value", QtCore.QVariant(1.0))
        self.__scale_label = QtGui.QLabel()
        self.__scale_label.setText(QtCore.QString("Image scale"))

        self.__device = QtGui.QComboBox(self)
        self.__device.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__device.setObjectName("device")
        for n in range(0, 6):
            self.__device.addItem(QtCore.QString(str(n)), QtCore.QVariant(n))

        self.__device.setCurrentIndex(0)
        self.__device_label = QtGui.QLabel()
        self.__device_label.setText(QtCore.QString("Device number"))

        #Set the layout
        g_layout = QtGui.QGridLayout()
        g_layout.addWidget(self.__face_button, 0, 0)
        g_layout.addWidget(self.__record_button, 1, 0)
        g_layout.addWidget(self.__file_button, 2, 0)
        g_layout.addWidget(self.__tracking_box, 3, 0)
        g_layout.addWidget(self.__active_box, 4, 0)
        g_layout.addWidget(self.__label_gain_x, 5, 0)
        g_layout.addWidget(self.__scrollbar_gain_x), 6, 0
        g_layout.addWidget(self.__label_gain_y, 7, 0)
        g_layout.addWidget(self.__scrollbar_gain_y, 8, 0)
        g_layout.addWidget(self.__scale_label, 9, 0)
        g_layout.addWidget(self.__scale_select, 10, 0)
        g_layout.addWidget(self.__device_label, 11, 0)
        g_layout.addWidget(self.__device, 12, 0)
        v_layout = QtGui.QVBoxLayout()
        v_layout.addWidget(self.__display)
        spacer = QtGui.QSpacerItem(10, 100, QtGui.QSizePolicy.Expanding,
                                   QtGui.QSizePolicy.Minimum)
        v_layout.addItem(spacer)

        g_layout.addLayout(v_layout, 0, 1, 12, 1)

        self.setLayout(g_layout)
        #Screen size
        desktop = QtGui.QDesktopWidget()
        screen_size = QtCore.QRectF(
            desktop.screenGeometry(desktop.primaryScreen()))
        x = screen_size.x() + screen_size.width()
        y = screen_size.y() + screen_size.height()
        self.__current_pos = [x / 2., y / 2.]

        #Init the core algorithms
        self.__frame_grabber_file = FrameGrabberFile("out.avi")
        (cam, is_data) = self.__device.itemData(
            self.__device.currentIndex()).toInt()
        self.__frame_grabber_cam = FrameGrabberWebCam(
            i_scale=self.__scale_select.value(), i_camera=cam)
        self.__frame_grabber = self.__frame_grabber_cam
        self.__head_tracker = i_head_tracker

        #Connect signals
        QtCore.QObject.connect(self.__scale_select,
                               QtCore.SIGNAL("valueChanged(double)"),
                               self.updateImageScale)
        QtCore.QObject.connect(self.__device,
                               QtCore.SIGNAL("currentIndexChanged(int)"),
                               self.updateDevice)

        #Main functions
        self.__timer = QtCore.QTimer()
        QtCore.QObject.connect(self.__timer, QtCore.SIGNAL("timeout()"),
                               self.update)
        self.__timer.start(20)

    def updateDevice(self, i_index):
        self.__timer.stop()
        (cam, is_data) = self.__device.itemData(i_index).toInt()
        #FIXME: We shouldn't have to release the memory in Python?
        self.__frame_grabber_cam.release()
        self.__frame_grabber_cam = FrameGrabberWebCam(
            i_scale=self.__scale_select.value(), i_camera=cam)
        self.__head_tracker.clearRoi()
        self.__timer.start()

    def updateImageScale(self, i_value):
        self.__frame_grabber.setScale(i_value)
        self.__head_tracker.clearRoi()

    def update(self):
        current_frame = self.__frame_grabber.nextFrame()
        if current_frame == None:
            print "No image available from selected device"
        else:
            if self.__face_button.isChecked():
                self.__head_tracker.clearRoi()
            (delta_x, delta_y, x, y, w, h) = self.__head_tracker.update(
                current_frame, i_track=self.__tracking_box.isChecked())
            gain_x = float(self.__scrollbar_gain_x.value())
            gain_y = float(self.__scrollbar_gain_y.value())
            self.__current_pos[0] += (delta_x * gain_x)
            self.__current_pos[1] += (delta_y * gain_y)

            desktop = QtGui.QDesktopWidget()
            screen_size = QtCore.QRectF(
                desktop.screenGeometry(desktop.primaryScreen()))
            if self.__current_pos[0] < screen_size.x():
                self.__current_pos[0] = screen_size.x()
            if self.__current_pos[0] > (screen_size.x() + screen_size.width()):
                self.__current_pos[0] = screen_size.x() + screen_size.width()
            if self.__current_pos[1] < screen_size.y():
                self.__current_pos[1] = screen_size.y()
            if self.__current_pos[1] > (screen_size.y() +
                                        screen_size.height()):
                self.__current_pos[1] = screen_size.y() + screen_size.height()

            qt_image = image_utils.Ipl2QImage(
                image_utils.IplGrayToRGB(self.__frame_grabber.currentFrame()))
            roi = self.__head_tracker.getRoi()
            if roi is not None:
                point = numpy.atleast_2d(numpy.array([x, y]))
                self.__display.drawPoints(qt_image, point)
                self.__display.drawRectangleRaw(qt_image,
                                                y - 0.5 * h,
                                                x - 0.5 * w,
                                                y + 0.5 * h,
                                                x + 0.5 * h,
                                                i_color=QtGui.QColor("red"),
                                                i_pen_width=2)

            if self.__display.isRecord():
                ipl_image = self.__frame_grabber.currentFrame('Ipl')
                self.__display.addFrame(image_utils.IplRGBToGray(ipl_image))

            fps = "Capture rate: " + str(
                self.__frame_grabber.frameRate()) + " fps"
            im_size = "Image size: " + str(qt_image.width()) + " x " + str(
                qt_image.height()) + "\n"
            disp_str = im_size + fps
            self.__display.setImage(qt_image, i_text=QtCore.QString(disp_str))

            if self.__active_box.isChecked():
                QtGui.QCursor.setPos(self.__current_pos[0],
                                     self.__current_pos[1])

    ###########################################################################
    #Recording
    ###########################################################################
    def recordSlot(self, checked):
        if checked:
            self.__timer.stop()
            filename = QtGui.QFileDialog.getSaveFileName(
                self, "Select output file", os.getcwd(), "Avi Files (*.avi)")
            if len(filename) > 0:
                self.__record_button.setText("Stop recording")
                self.__display.setRecorderParams(str(filename), i_fps=20)
                self.__display.startRecord()
            self.__timer.start()
        else:
            self.__display.stopRecording()
            self.__record_button.setText("Record")

    ###########################################################################
    #Change capturing device to be from file not from webcam
    ###########################################################################
    def fileSlot(self, checked):
        if checked:
            self.__timer.stop()
            filename = QtGui.QFileDialog.getOpenFileName(
                self, "Select output file", os.getcwd(), "Avi Files (*.avi)")
            if len(filename) > 0:
                self.__frame_grabber_file.restart(i_file=str(filename),
                                                  i_loop_back=True)
                self.__frame_grabber = self.__frame_grabber_file
                self.__file_button.setText("Stop display from .avi")
            self.__timer.start()
        else:
            self.__frame_grabber = self.__frame_grabber_cam
            self.__file_button.setText("Display .avi")
Beispiel #4
0
    def __init__(self, i_head_tracker, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.__display = qt_image_display.ImageDisplayAndRecord()
        #Recording button
        self.__record_button = QtGui.QPushButton(self)
        self.__record_button.setCheckable(True)
        self.__record_button.setObjectName("recordButton")
        self.__record_button.setText("Record")
        self.connect(self.__record_button, QtCore.SIGNAL("clicked(bool)"),
                     self.recordSlot)

        #File playback button
        self.__file_button = QtGui.QPushButton(self)
        self.__file_button.setCheckable(True)
        self.__file_button.setObjectName("fileButton")
        self.__file_button.setText("Display .avi")
        self.connect(self.__file_button, QtCore.SIGNAL("clicked(bool)"),
                     self.fileSlot)

        #Run Viola Jones on each frame and get the largest face
        self.__face_button = QtGui.QPushButton(self)
        self.__face_button.setCheckable(True)
        self.__face_button.setObjectName("detectButton")
        self.__face_button.setText("Detect faces")
        #Tracking checkBox
        self.__tracking_box = QtGui.QCheckBox()
        self.__tracking_box.setChecked(True)
        self.__tracking_box.setObjectName("trackingBox")
        self.__tracking_box.setText("Enable tracking")
        #Enable xy coordinate out put
        self.__active_box = QtGui.QCheckBox()
        self.__active_box.setChecked(False)
        self.__active_box.setObjectName("activeBox")
        self.__active_box.setText("Activate Cursor Control (ESC to exit)")
        #The scroll bar
        self.__scrollbar_gain_x = QtGui.QScrollBar()
        self.__scrollbar_gain_x.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_x.setMinimum(1)
        self.__scrollbar_gain_y = QtGui.QScrollBar()
        self.__scrollbar_gain_y.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_y.setMinimum(1)
        slider_max = 100
        self.__scrollbar_gain_x.setMaximum(slider_max)
        self.__scrollbar_gain_x.setProperty("value",
                                            QtCore.QVariant(slider_max / 2))
        self.__scrollbar_gain_x.setSliderPosition(slider_max / 2)
        self.__scrollbar_gain_x.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_x.setObjectName("scrollbar_gain")
        self.__scrollbar_gain_y.setMaximum(slider_max)
        self.__scrollbar_gain_y.setProperty("value",
                                            QtCore.QVariant(slider_max / 2))
        self.__scrollbar_gain_y.setSliderPosition(slider_max / 2)
        self.__scrollbar_gain_y.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_y.setObjectName("scrollbar_gain")
        self.__label_gain_x = QtGui.QLabel()
        self.__label_gain_x.setText(QtCore.QString("X gain"))
        self.__label_gain_y = QtGui.QLabel()
        self.__label_gain_y.setText(QtCore.QString("Y gain"))

        #Camera capture settings
        self.__scale_select = QtGui.QDoubleSpinBox()
        self.__scale_select.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__scale_select.setMaximum(1.0)
        self.__scale_select.setMinimum(0.1)
        self.__scale_select.setSingleStep(0.25)
        self.__scale_select.setProperty("value", QtCore.QVariant(1.0))
        self.__scale_label = QtGui.QLabel()
        self.__scale_label.setText(QtCore.QString("Image scale"))

        self.__device = QtGui.QComboBox(self)
        self.__device.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__device.setObjectName("device")
        for n in range(0, 6):
            self.__device.addItem(QtCore.QString(str(n)), QtCore.QVariant(n))

        self.__device.setCurrentIndex(0)
        self.__device_label = QtGui.QLabel()
        self.__device_label.setText(QtCore.QString("Device number"))

        #Set the layout
        g_layout = QtGui.QGridLayout()
        g_layout.addWidget(self.__face_button, 0, 0)
        g_layout.addWidget(self.__record_button, 1, 0)
        g_layout.addWidget(self.__file_button, 2, 0)
        g_layout.addWidget(self.__tracking_box, 3, 0)
        g_layout.addWidget(self.__active_box, 4, 0)
        g_layout.addWidget(self.__label_gain_x, 5, 0)
        g_layout.addWidget(self.__scrollbar_gain_x), 6, 0
        g_layout.addWidget(self.__label_gain_y, 7, 0)
        g_layout.addWidget(self.__scrollbar_gain_y, 8, 0)
        g_layout.addWidget(self.__scale_label, 9, 0)
        g_layout.addWidget(self.__scale_select, 10, 0)
        g_layout.addWidget(self.__device_label, 11, 0)
        g_layout.addWidget(self.__device, 12, 0)
        v_layout = QtGui.QVBoxLayout()
        v_layout.addWidget(self.__display)
        spacer = QtGui.QSpacerItem(10, 100, QtGui.QSizePolicy.Expanding,
                                   QtGui.QSizePolicy.Minimum)
        v_layout.addItem(spacer)

        g_layout.addLayout(v_layout, 0, 1, 12, 1)

        self.setLayout(g_layout)
        #Screen size
        desktop = QtGui.QDesktopWidget()
        screen_size = QtCore.QRectF(
            desktop.screenGeometry(desktop.primaryScreen()))
        x = screen_size.x() + screen_size.width()
        y = screen_size.y() + screen_size.height()
        self.__current_pos = [x / 2., y / 2.]

        #Init the core algorithms
        self.__frame_grabber_file = FrameGrabberFile("out.avi")
        (cam, is_data) = self.__device.itemData(
            self.__device.currentIndex()).toInt()
        self.__frame_grabber_cam = FrameGrabberWebCam(
            i_scale=self.__scale_select.value(), i_camera=cam)
        self.__frame_grabber = self.__frame_grabber_cam
        self.__head_tracker = i_head_tracker

        #Connect signals
        QtCore.QObject.connect(self.__scale_select,
                               QtCore.SIGNAL("valueChanged(double)"),
                               self.updateImageScale)
        QtCore.QObject.connect(self.__device,
                               QtCore.SIGNAL("currentIndexChanged(int)"),
                               self.updateDevice)

        #Main functions
        self.__timer = QtCore.QTimer()
        QtCore.QObject.connect(self.__timer, QtCore.SIGNAL("timeout()"),
                               self.update)
        self.__timer.start(20)
Beispiel #5
0
        else:
            img = image_utils.IplGrayToRGB(i_image)
            cv.highgui.cvWriteFrame( self.__videoWriter, img ) 
  

if __name__ ==  "__main__":
    from PyQt4 import QtCore, QtGui
    from sys import stdin, exit, argv
    import qt_image_display
    from frame_grabber import  FrameGrabberWebCam
   
    timer = QtCore.QTimer()
    app = QtGui.QApplication(argv)
  
    #frame_grabber = FrameGrabberFile("out.avi", i_loop_back = True, i_scale=1.0)
    frame_grabber = FrameGrabberWebCam( i_scale=1., i_camera=0)
    frame_recorder =  FrameRecorder( i_file_name="out.avi", i_fps=20, i_is_color=1 )
    display =  qt_image_display.ImageDisplay()

    def updateDisplay():
        current_frame = frame_grabber.nextFrame()  
        if current_frame == None:
            print "No image available"
            timer.stop()
        else:        
            frame_recorder.addFrame(current_frame)
            qt_image =  frame_grabber.currentFrame('QImage')
            frame_rate = str(frame_grabber.frameRate())
            w = str(qt_image.width())
            h = str(qt_image.height())
            disp_str =  frame_rate + " fps, width = " +  w  + ", height = " + h
Beispiel #6
0
    def __init__(self, i_head_tracker, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.__display =  qt_image_display.ImageDisplayAndRecord()
        #Recording button 
        self.__record_button = QtGui.QPushButton(self)
        self.__record_button.setCheckable(True)
        self.__record_button.setObjectName("recordButton")
        self.__record_button.setText("Record")
        self.connect( self.__record_button, QtCore.SIGNAL("clicked(bool)"),  self.recordSlot )
        
        #File playback button 
        self.__file_button = QtGui.QPushButton(self)
        self.__file_button.setCheckable(True)
        self.__file_button.setObjectName("fileButton")
        self.__file_button.setText("Display .avi")
        self.connect( self.__file_button, QtCore.SIGNAL("clicked(bool)"),  self.fileSlot )  
    
        #Run Viola Jones on each frame and get the largest face
        self.__face_button = QtGui.QPushButton(self)
        self.__face_button.setCheckable(True)
        self.__face_button.setObjectName("detectButton")
        self.__face_button.setText("Detect faces")
        #Tracking checkBox
        self.__tracking_box = QtGui.QCheckBox()
        self.__tracking_box.setChecked(True)
        self.__tracking_box.setObjectName("trackingBox")
        self.__tracking_box.setText("Enable tracking")
        #Enable xy coordinate out put
        self.__active_box = QtGui.QCheckBox()
        self.__active_box.setChecked(False)
        self.__active_box.setObjectName("activeBox")
        self.__active_box.setText("Activate Cursor Control (ESC to exit)")
        #The scroll bar
        self.__scrollbar_gain_x = QtGui.QScrollBar()
        self.__scrollbar_gain_x.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_x.setMinimum(1)
        self.__scrollbar_gain_y = QtGui.QScrollBar()
        self.__scrollbar_gain_y.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_y.setMinimum(1)
        slider_max = 100
        self.__scrollbar_gain_x.setMaximum(slider_max)
        self.__scrollbar_gain_x.setProperty("value", QtCore.QVariant(slider_max/2))
        self.__scrollbar_gain_x.setSliderPosition(slider_max/2)
        self.__scrollbar_gain_x.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_x.setObjectName("scrollbar_gain")
        self.__scrollbar_gain_y.setMaximum(slider_max)
        self.__scrollbar_gain_y.setProperty("value", QtCore.QVariant(slider_max/2))
        self.__scrollbar_gain_y.setSliderPosition(slider_max/2)
        self.__scrollbar_gain_y.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_y.setObjectName("scrollbar_gain")
        self.__label_gain_x = QtGui.QLabel()
        self.__label_gain_x.setText(QtCore.QString("X gain"))
        self.__label_gain_y = QtGui.QLabel()
        self.__label_gain_y.setText(QtCore.QString("Y gain"))
        
        #Camera capture settings
        self.__scale_select = QtGui.QDoubleSpinBox()
        self.__scale_select.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__scale_select.setMaximum(1.0)
        self.__scale_select.setMinimum(0.1)
        self.__scale_select.setSingleStep(0.25)
        self.__scale_select.setProperty("value", QtCore.QVariant(1.0))
        self.__scale_label = QtGui.QLabel()
        self.__scale_label.setText(QtCore.QString("Image scale"))     
        
        
        self.__device = QtGui.QComboBox(self)
        self.__device.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__device.setObjectName("device")
        for n in range(0, 6):
            self.__device.addItem(QtCore.QString(str(n)), QtCore.QVariant(n))  
        
        self.__device.setCurrentIndex(0)
        self.__device_label = QtGui.QLabel()
        self.__device_label.setText(QtCore.QString("Device number"))    
        
        #Set the layout
        g_layout = QtGui.QGridLayout()  
        g_layout.addWidget(self.__face_button, 0, 0)
        g_layout.addWidget(self.__record_button,1,0)
        g_layout.addWidget(self.__file_button, 2, 0)
        g_layout.addWidget(self.__tracking_box,3,0)
        g_layout.addWidget(self.__active_box,4, 0)
        g_layout.addWidget(self.__label_gain_x,5,0)
        g_layout.addWidget(self.__scrollbar_gain_x),6,0
        g_layout.addWidget(self.__label_gain_y,7,0)
        g_layout.addWidget(self.__scrollbar_gain_y,8,0)
        g_layout.addWidget(self.__scale_label,9,0)
        g_layout.addWidget(self.__scale_select,10,0)
        g_layout.addWidget(self.__device_label,11,0)
        g_layout.addWidget(self.__device,12,0)
        v_layout = QtGui.QVBoxLayout()  
        v_layout.addWidget(self.__display)
        spacer = QtGui.QSpacerItem(10, 100, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        v_layout.addItem(spacer)
        
        g_layout.addLayout(v_layout, 0, 1,12,1)
      
        self.setLayout(g_layout)
        #Screen size
        desktop = QtGui.QDesktopWidget()
        screen_size = QtCore.QRectF(desktop.screenGeometry(desktop.primaryScreen()))
        x = screen_size.x() + screen_size.width()
        y = screen_size.y() + screen_size.height()
        self.__current_pos = [x/2., y/2.] 
         
        #Init the core algorithms
        self.__frame_grabber_file=  FrameGrabberFile("out.avi")
        (cam, is_data) = self.__device.itemData(self.__device.currentIndex()).toInt()
        self.__frame_grabber_cam = FrameGrabberWebCam(i_scale=self.__scale_select.value(),i_camera=cam)
        self.__frame_grabber = self.__frame_grabber_cam
        self.__head_tracker = i_head_tracker

        #Connect signals
        QtCore.QObject.connect(self.__scale_select, QtCore.SIGNAL("valueChanged(double)"), self.updateImageScale )
        QtCore.QObject.connect(self.__device, QtCore.SIGNAL("currentIndexChanged(int)"), self.updateDevice )
       
        #Main functions
        self.__timer = QtCore.QTimer()
        QtCore.QObject.connect(self.__timer, QtCore.SIGNAL("timeout()"), self.update )
        self.__timer.start( 20 )
Beispiel #7
0
class HeadTrackerDisplay(QtGui.QWidget):
 
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.__active_box.setChecked(False)
    
    def __init__(self, i_head_tracker, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.__display =  qt_image_display.ImageDisplayAndRecord()
        #Recording button 
        self.__record_button = QtGui.QPushButton(self)
        self.__record_button.setCheckable(True)
        self.__record_button.setObjectName("recordButton")
        self.__record_button.setText("Record")
        self.connect( self.__record_button, QtCore.SIGNAL("clicked(bool)"),  self.recordSlot )
        
        #File playback button 
        self.__file_button = QtGui.QPushButton(self)
        self.__file_button.setCheckable(True)
        self.__file_button.setObjectName("fileButton")
        self.__file_button.setText("Display .avi")
        self.connect( self.__file_button, QtCore.SIGNAL("clicked(bool)"),  self.fileSlot )  
    
        #Run Viola Jones on each frame and get the largest face
        self.__face_button = QtGui.QPushButton(self)
        self.__face_button.setCheckable(True)
        self.__face_button.setObjectName("detectButton")
        self.__face_button.setText("Detect faces")
        #Tracking checkBox
        self.__tracking_box = QtGui.QCheckBox()
        self.__tracking_box.setChecked(True)
        self.__tracking_box.setObjectName("trackingBox")
        self.__tracking_box.setText("Enable tracking")
        #Enable xy coordinate out put
        self.__active_box = QtGui.QCheckBox()
        self.__active_box.setChecked(False)
        self.__active_box.setObjectName("activeBox")
        self.__active_box.setText("Activate Cursor Control (ESC to exit)")
        #The scroll bar
        self.__scrollbar_gain_x = QtGui.QScrollBar()
        self.__scrollbar_gain_x.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_x.setMinimum(1)
        self.__scrollbar_gain_y = QtGui.QScrollBar()
        self.__scrollbar_gain_y.setGeometry(QtCore.QRect(0, 190, 291, 20))
        self.__scrollbar_gain_y.setMinimum(1)
        slider_max = 100
        self.__scrollbar_gain_x.setMaximum(slider_max)
        self.__scrollbar_gain_x.setProperty("value", QtCore.QVariant(slider_max/2))
        self.__scrollbar_gain_x.setSliderPosition(slider_max/2)
        self.__scrollbar_gain_x.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_x.setObjectName("scrollbar_gain")
        self.__scrollbar_gain_y.setMaximum(slider_max)
        self.__scrollbar_gain_y.setProperty("value", QtCore.QVariant(slider_max/2))
        self.__scrollbar_gain_y.setSliderPosition(slider_max/2)
        self.__scrollbar_gain_y.setOrientation(QtCore.Qt.Horizontal)
        self.__scrollbar_gain_y.setObjectName("scrollbar_gain")
        self.__label_gain_x = QtGui.QLabel()
        self.__label_gain_x.setText(QtCore.QString("X gain"))
        self.__label_gain_y = QtGui.QLabel()
        self.__label_gain_y.setText(QtCore.QString("Y gain"))
        
        #Camera capture settings
        self.__scale_select = QtGui.QDoubleSpinBox()
        self.__scale_select.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__scale_select.setMaximum(1.0)
        self.__scale_select.setMinimum(0.1)
        self.__scale_select.setSingleStep(0.25)
        self.__scale_select.setProperty("value", QtCore.QVariant(1.0))
        self.__scale_label = QtGui.QLabel()
        self.__scale_label.setText(QtCore.QString("Image scale"))     
        
        
        self.__device = QtGui.QComboBox(self)
        self.__device.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.__device.setObjectName("device")
        for n in range(0, 6):
            self.__device.addItem(QtCore.QString(str(n)), QtCore.QVariant(n))  
        
        self.__device.setCurrentIndex(0)
        self.__device_label = QtGui.QLabel()
        self.__device_label.setText(QtCore.QString("Device number"))    
        
        #Set the layout
        g_layout = QtGui.QGridLayout()  
        g_layout.addWidget(self.__face_button, 0, 0)
        g_layout.addWidget(self.__record_button,1,0)
        g_layout.addWidget(self.__file_button, 2, 0)
        g_layout.addWidget(self.__tracking_box,3,0)
        g_layout.addWidget(self.__active_box,4, 0)
        g_layout.addWidget(self.__label_gain_x,5,0)
        g_layout.addWidget(self.__scrollbar_gain_x),6,0
        g_layout.addWidget(self.__label_gain_y,7,0)
        g_layout.addWidget(self.__scrollbar_gain_y,8,0)
        g_layout.addWidget(self.__scale_label,9,0)
        g_layout.addWidget(self.__scale_select,10,0)
        g_layout.addWidget(self.__device_label,11,0)
        g_layout.addWidget(self.__device,12,0)
        v_layout = QtGui.QVBoxLayout()  
        v_layout.addWidget(self.__display)
        spacer = QtGui.QSpacerItem(10, 100, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        v_layout.addItem(spacer)
        
        g_layout.addLayout(v_layout, 0, 1,12,1)
      
        self.setLayout(g_layout)
        #Screen size
        desktop = QtGui.QDesktopWidget()
        screen_size = QtCore.QRectF(desktop.screenGeometry(desktop.primaryScreen()))
        x = screen_size.x() + screen_size.width()
        y = screen_size.y() + screen_size.height()
        self.__current_pos = [x/2., y/2.] 
         
        #Init the core algorithms
        self.__frame_grabber_file=  FrameGrabberFile("out.avi")
        (cam, is_data) = self.__device.itemData(self.__device.currentIndex()).toInt()
        self.__frame_grabber_cam = FrameGrabberWebCam(i_scale=self.__scale_select.value(),i_camera=cam)
        self.__frame_grabber = self.__frame_grabber_cam
        self.__head_tracker = i_head_tracker

        #Connect signals
        QtCore.QObject.connect(self.__scale_select, QtCore.SIGNAL("valueChanged(double)"), self.updateImageScale )
        QtCore.QObject.connect(self.__device, QtCore.SIGNAL("currentIndexChanged(int)"), self.updateDevice )
       
        #Main functions
        self.__timer = QtCore.QTimer()
        QtCore.QObject.connect(self.__timer, QtCore.SIGNAL("timeout()"), self.update )
        self.__timer.start( 20 )
    
    def updateDevice(self,i_index):
        self.__timer.stop()
        (cam, is_data) = self.__device.itemData(i_index).toInt()
        #FIXME: We shouldn't have to release the memory in Python?
        self.__frame_grabber_cam.release()
        self.__frame_grabber_cam = FrameGrabberWebCam(i_scale=self.__scale_select.value(),i_camera=cam)
        self.__head_tracker.clearRoi()
        self.__timer.start()
    
    def updateImageScale(self,i_value):
        self.__frame_grabber.setScale(i_value)
        self.__head_tracker.clearRoi()
        
    def update(self):
        current_frame = self.__frame_grabber.nextFrame()  
        if current_frame == None:
            print "No image available from selected device"
        else:       
            if self.__face_button.isChecked():
                self.__head_tracker.clearRoi() 
            (delta_x, delta_y, x, y, w, h) = self.__head_tracker.update(current_frame, i_track=self.__tracking_box.isChecked())    
            gain_x = float(self.__scrollbar_gain_x.value())
            gain_y = float(self.__scrollbar_gain_y.value())
            self.__current_pos[0] += (delta_x * gain_x)
            self.__current_pos[1] += (delta_y * gain_y)
            
            desktop = QtGui.QDesktopWidget()
            screen_size = QtCore.QRectF(desktop.screenGeometry(desktop.primaryScreen()))
            if self.__current_pos[0] < screen_size.x():
                self.__current_pos[0] = screen_size.x()
            if self.__current_pos[0] > ( screen_size.x() +  screen_size.width()):
                self.__current_pos[0] = screen_size.x() +  screen_size.width()
            if self.__current_pos[1] < screen_size.y():
                self.__current_pos[1] = screen_size.y()
            if self.__current_pos[1] > ( screen_size.y() +  screen_size.height()):
                self.__current_pos[1] = screen_size.y() +  screen_size.height()
            
            qt_image = image_utils.Ipl2QImage( image_utils.IplGrayToRGB(self.__frame_grabber.currentFrame()))
            roi = self.__head_tracker.getRoi()
            if roi is not None:
                point  = numpy.atleast_2d(numpy.array([x, y]))
                self.__display.drawPoints( qt_image, point)
                self.__display.drawRectangleRaw(qt_image,y-0.5*h,x-0.5*w,y+0.5*h,x+0.5*h, i_color=QtGui.QColor("red") , i_pen_width=2)
            
            
            if self.__display.isRecord():
                ipl_image = self.__frame_grabber.currentFrame( 'Ipl')
                self.__display.addFrame( image_utils.IplRGBToGray(ipl_image) )
           
            fps = "Capture rate: " + str(self.__frame_grabber.frameRate()) + " fps"
            im_size = "Image size: " + str(qt_image.width()) + " x " + str(qt_image.height()) + "\n"
            disp_str = im_size + fps
            self.__display.setImage(qt_image, i_text=QtCore.QString(disp_str))
    
            if self.__active_box.isChecked():
                QtGui.QCursor.setPos(self.__current_pos[0], self.__current_pos[1] )
   
    ###########################################################################
    #Recording
    ###########################################################################
    def recordSlot(self, checked):
        if checked:
            self.__timer.stop()
            filename = QtGui.QFileDialog.getSaveFileName( self, "Select output file",os.getcwd(), "Avi Files (*.avi)")
            if len(filename) > 0:
                self.__record_button.setText("Stop recording")
                self.__display.setRecorderParams( str(filename), i_fps =20)
                self.__display.startRecord()
            self.__timer.start()
        else:
            self.__display.stopRecording()
            self.__record_button.setText("Record") 
            
    ###########################################################################
    #Change capturing device to be from file not from webcam
    ###########################################################################
    def fileSlot(self, checked):
        if checked:
            self.__timer.stop()
            filename = QtGui.QFileDialog.getOpenFileName( self, "Select output file",os.getcwd(), "Avi Files (*.avi)")
            if len(filename) > 0:
                self.__frame_grabber_file.restart( i_file=str(filename), i_loop_back = True)
                self.__frame_grabber = self.__frame_grabber_file
                self.__file_button.setText("Stop display from .avi")
            self.__timer.start()
        else:
            self.__frame_grabber = self.__frame_grabber_cam
            self.__file_button.setText("Display .avi")