コード例 #1
0
def main():
    if len(sys.argv) < 2:
        print 'USAGE: runtracker.py participant_id [save_location]'
        return

    S = MARKER_SIZE
    F = 1

    participant_id = sys.argv[1]

    save_location = DATA_DIR
    if len(sys.argv) >= 3:
        save_location = sys.argv[2]

    # Mouse callback for setting origin point
    def mouse_callback(event, x, y, flags, param):
        if datalog.is_running():
            return

        if event == cv2.EVENT_LBUTTONDOWN:
            # Set new origin_y
            tracker.set_origin(y)

    # Open webcam
    cap = cv2.VideoCapture(TRACKER_CAM)
    if not cap.isOpened():
        print 'Error opening tracker camera!'
        return

    # Open facecam (for separate recording)
    facecap = None
    if FACE_CAM is not None:
        facecap = cv2.VideoCapture(FACE_CAM)
        if not facecap.isOpened():
            print 'Error opening face camera!'
            facecap = None

    # Get video parameters (try to retain same attributes for output video)
    width = float(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = float(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = float(cap.get(cv2.CAP_PROP_FPS))

    # Create instances
    track_finder = mk.MarkerFinder(GREEN_COLOR_MIN, GREEN_COLOR_MAX)
    tracker = WristTracker(track_finder, S, F)
    tracker.set_origin(int(height / 2))

    cprstatus = CPRStatus(CPR_BUFFER_SIZE)
    statussender = StatusSender(SOCK_ADDR, SOCK_PORT)
    datalog = DataLogger(fps if (0 < fps <= 60) else 30, width, height,
                         save_location, facecap is not None)

    trainer_on = True

    cur_position = 0
    cur_size = 0

    last_rate, last_depth, last_recoil, last_code = 0, 0, 0, 0

    while True:
        # Get frame
        ret, frame = cap.read()
        if ret is False or frame is None:
            break

        faceframe = None
        if facecap:
            faceret, faceframe = facecap.read()

        # Get dimensions
        h, w, _ = frame.shape
        center = (w / 2, h / 2)
        '''
        Output Drawing
        '''

        # Make output image
        output = frame.copy()

        # Display program status
        cv2.putText(
            output,
            '<NOT RUNNING>' if not datalog.is_running() else 'RECORDING ' +
            datalog.get_filename() + ' [' + str(datalog.get_index()) + ']',
            (0, 30), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 0, 255), 2)
        cv2.putText(
            output, 'R: ' + str(last_rate) + ' D: ' + str(last_depth) +
            ' C: ' + str(last_recoil) + ' S: ' + str(last_code), (0, 60),
            cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 2)

        # Draw center and origin lines
        cv2.line(output, (center[0], 0), (center[0], h), (0, 0, 255), 1)
        cv2.line(output, (center[0] - 20, int(tracker.get_origin())),
                 (center[0] + 20, int(tracker.get_origin())), (0, 0, 255), 1)

        # Draw instructions
        if not datalog.is_running():
            cv2.putText(
                output, 'c - set clr at orig | t - trainer is ' +
                ('on' if trainer_on else 'off') + ' | space - tgl tracker',
                (0, h - 4), cv2.FONT_HERSHEY_PLAIN, 1, (255, 0, 0), 1)
        '''
        Tracking
        '''

        # Get tracked marker from image
        tracked_marker = tracker.get_marker(frame, output)
        if tracked_marker:
            draw_marker(output, tracked_marker.marker, tracked_marker.size,
                        tracked_marker.distance, tracked_marker.position)

            # Update cur position/size (for calibration)
            cur_position = tracked_marker.y
            cur_size = tracked_marker.size
        '''
        Analysis
        '''

        if datalog.is_running():
            if tracked_marker:
                # Analyze CPR status
                rate, depth, recoil, code = cprstatus.update(tracked_marker)

                if code is not None:
                    last_rate, last_depth, last_recoil, last_code = rate, depth, recoil, code  # Update
                    print 'R: ' + str(last_rate) + ' D: ' + str(
                        last_depth) + ' C: ' + str(last_recoil) + ' S: ' + str(
                            last_code)

                    # Send status if trainer is turned on
                    if trainer_on:
                        if not (last_rate == 0 and last_depth == 0
                                and last_recoil == 0):
                            print 'send status ' + str(code)
                            statussender.send_status(code)

                datalog.log(frame, output, tracker.get_origin(),
                            tracked_marker.position if tracked_marker else 0,
                            rate, depth, recoil, code, faceframe)
        '''
        Show Output
        '''

        # Resize frame
        #output = cv2.resize(output, (OUT_WIDTH, OUT_HEIGHT))

        # Show frame
        #cv2.imshow('Frame', frame)
        cv2.imshow('Output', output)
        cv2.setMouseCallback('Output', mouse_callback)

        if faceframe is not None:
            cv2.imshow('Face', faceframe)
        '''
        Process Keypresses
        '''

        k = cv2.waitKey(1)
        if k == 27:
            datalog.stop()
            break
        elif k == ord('v'):
            track_finder.set_color(VIOLET_COLOR_MIN, VIOLET_COLOR_MAX)
        elif k == ord('g'):
            track_finder.set_color(GREEN_COLOR_MIN, GREEN_COLOR_MAX)
        elif k == ord('y'):
            track_finder.set_color(YELLOW_COLOR_MIN, YELLOW_COLOR_MAX)
        elif k == ord('c'):
            # Calibrate tracker (color)
            color = (0, 0, 0)

            # Get origin pixel color
            pixel = frame[int(tracker.get_origin())][center[0]]
            hsv = cvt_bgr2hsv(pixel)
            print 'Calibrate color: ' + str(hsv) + ' | BGR: ' + str(pixel)

            # Apply HSV range
            '''
            lower_bound = tuple(map(lambda x, y: max(0, x - y), hsv, COLOR_VARIANCE))
            upper_bound = tuple(map(lambda x, y: min(255, x + y), hsv, COLOR_VARIANCE))
            '''
            lower_bound = (max(0, hsv[0] - COLOR_MIN[0]), COLOR_MIN[1],
                           COLOR_MIN[2])
            upper_bound = (min(255, hsv[0] + COLOR_MAX[0]), COLOR_MAX[1],
                           COLOR_MAX[2])
            #'''

            track_finder.set_color(lower_bound, upper_bound)
            print 'Color range: ' + str(lower_bound) + ' to ' + str(
                upper_bound)
        elif k == ord('t'):
            # Toggle trainer
            trainer_on = not trainer_on
        elif k == 32:
            # Toggle on/off
            if datalog.is_running():
                datalog.stop()
            else:
                # Reset logger
                cur_time = datetime.now()
                time_str = cur_time.strftime('%m-%d-%y_%H%M%S')
                datalog.start('CPR_' + str(participant_id) + '_' + time_str)
                cprstatus.reset()

                # Set tracker origin/size
                tracker.set_origin(cur_position)
                tracker.set_force_px_size(cur_size)

    cap.release()