Source code for pliers.extractors.video

'''
Extractors that operate primarily or exclusively on Video stimuli.
'''

import numpy as np

from pliers.stimuli.video import VideoStim
from pliers.extractors.base import Extractor, ExtractorResult
from pliers.utils import attempt_to_import, verify_dependencies

cv2 = attempt_to_import('cv2')


class VideoExtractor(Extractor):

    ''' Base Video Extractor class; all subclasses can only be applied to
    video. '''
    _input_type = VideoStim


[docs]class FarnebackOpticalFlowExtractor(VideoExtractor): ''' Extracts total amount of dense optical flow between every pair of video frames. Args: pyr_scale (float): specifying the image scale (<1) to build pyramids for each image; pyr_scale=0.5 means a classical pyramid, where each next layer is twice smaller than the previous one. levels (int): number of pyramid layers including the initial image; levels=1 means that no extra layers are created and only the original images are used. winsize (int): averaging window size; larger values increase the algorithm robustness to image noise and give more chances for fast motion detection, but yield more blurred motion field. iterations (int): number of iterations the algorithm does at each pyramid level poly_n (int): size of the pixel neighborhood used to find polynomial expansion in each pixel; larger values mean that the image will be approximated with smoother surfaces, yielding more robust algorithm and more blurred motion field, typically poly_n =5 or 7. poly_sigma (float): standard deviation of the Gaussian that is used to smooth derivatives used as a basis for the polynomial expansion; for poly_n=5, you can set poly_sigma=1.1, for poly_n=7, a good value would be poly_sigma=1.5. flags (int): operation flags, usually OPTFLOW_USE_INITIAL_FLOW or OPTFLOW_FARNEBACK_GAUSSIAN show (bool): flag for displaying flow image during extraction ''' _log_attributes = ('pyr_scale', 'levels', 'winsize', 'iterations', 'poly_n', 'poly_sigma', 'flags')
[docs] def __init__(self, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.2, flags=0, show=False): self.pyr_scale = pyr_scale self.levels = levels self.winsize = winsize self.iterations = iterations self.poly_n = poly_n self.poly_sigma = poly_sigma self.flags = flags self.show = show super().__init__()
def _extract(self, stim): verify_dependencies(['cv2']) flows = [] onsets = [] durations = [] for i, f in enumerate(stim): frame = f.data frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if i == 0: last_frame = frame flow = cv2.calcOpticalFlowFarneback(last_frame, frame, None, self.pyr_scale, self.levels, self.winsize, self.iterations, self.poly_n, self.poly_sigma, self.flags) flow = np.sqrt((flow ** 2).sum(2)) if self.show: cv2.imshow('frame', flow.astype('int8')) cv2.waitKey(1) last_frame = frame flows.append(flow.sum()) onsets.append(f.onset) durations.append(f.duration) return ExtractorResult(flows, stim, self, features=['total_flow'], onsets=onsets, durations=durations)