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
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)