Ejemplo n.º 1
0
    def doAnalysis(self):
        """
        Analyse the time series motion of the features being tracked
        to look for ones which are oscillating, which could indicate a
        seizure
        """
        nSamples = len(self.timeSeries)
        nFeatures = len(self.timeSeries[0][1])
        print "doAnalysis() - nSamples = %d, nFeatures = %d" % (nSamples,
                                                                nFeatures)

        # Create a matrix with feature speeds in the y direction,
        # and time (frame no) in the x direction.
        # This means we can do an FFT on each row to get
        # frequency components of each feature.
        dataMat = cv.CreateMat(nFeatures, nSamples - 1, cv.CV_32FC1)
        times = []
        for frameNo in range(nSamples - 1):
            dt = (self.timeSeries[frameNo + 1][0] -
                  self.timeSeries[frameNo][0]).total_seconds()
            if (frameNo == 0):
                times.append(dt)
            else:
                times.append(times[frameNo - 1] + dt)
            for featNo in range(nFeatures):
                ds = self.ptptdist(self.timeSeries[frameNo][1][featNo],
                                   self.timeSeries[frameNo + 1][1][featNo])
                v = ds / dt
                # set the direction
                #if(self.timeSeries[frameNo][1][featNo][1] >
                #   self.timeSeries[frameNo+1][1][featNo][1]):
                #    v*=-1
                dataMat[featNo, frameNo] = v

        #cv.ShowImage("dataMat",dataMat)

        self.fftMat = cv.CreateMat(nFeatures, nSamples - 1, cv.CV_32FC1)
        cv.DFT(dataMat, self.fftMat, cv.CV_DXT_ROWS)
        #cv.ShowImage("fft",self.fftMat)

        if (self.X11): self.doPlot(dataMat, self.fftMat, times)

        # Look for the dominant frequency of each feature.
        freqBinSize = 1.0 / (times[len(times) - 1] - times[0])
        print "freqBinSize = %f Hz" % (freqBinSize)
        self.maxAmpl = numpy.zeros((nFeatures))
        self.maxFreq = numpy.zeros((nFeatures))
        for featNo in range(nFeatures):
            self.maxAmpl[featNo] = self.FFT_AMPL_THRESH
            self.maxFreq[featNo] = 0
            for freqBin in range(1, nSamples / 2):
                if (self.fftMat[featNo, freqBin] > self.maxAmpl[featNo]):
                    self.maxAmpl[featNo] = self.fftMat[featNo, freqBin]
                    self.maxFreq[featNo] = freqBinSize * freqBin
        self.timeSeries = []
        return True
Ejemplo n.º 2
0
    dft_A = cv.CreateMat( dft_M, dft_N, cv.CV_64FC2 )
    image_Re = cv.CreateImage( (dft_N, dft_M), cv.IPL_DEPTH_64F, 1)
    image_Im = cv.CreateImage( (dft_N, dft_M), cv.IPL_DEPTH_64F, 1)

    # copy A to dft_A and pad dft_A with zeros
    tmp = cv.GetSubRect( dft_A, (0,0, im.width, im.height))
    cv.Copy( complexInput, tmp, None )
    if(dft_A.width > im.width):
        tmp = cv.GetSubRect( dft_A, (im.width,0, dft_N - im.width, im.height))
        cv.Zero( tmp )

    # no need to pad bottom part of dft_A with zeros because of
    # use nonzero_rows parameter in cv.FT() call below

    cv.DFT( dft_A, dft_A, cv.CV_DXT_FORWARD, complexInput.height )

    cv.NamedWindow("win", 0)
    cv.NamedWindow("magnitude", 0)
    cv.ShowImage("win", im)

    # Split Fourier in real and imaginary parts
    cv.Split( dft_A, image_Re, image_Im, None, None )

    # Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)
    cv.Pow( image_Re, image_Re, 2.0)
    cv.Pow( image_Im, image_Im, 2.0)
    cv.Add( image_Re, image_Im, image_Re, None)
    cv.Pow( image_Re, image_Re, 0.5 )

    # Compute log(1 + Mag)