import cv2 import numpy as np import sys winname = 'Diff' def tovalues(values, histo): return [ 0 if x < histo[1][1] else 2 if x > histo[1][2] else 1 for x in values ] def frameiter(fname): #vc = cv2.VideoCapture('output.mp4') #vc = cv2.VideoCapture('PXL_20220806_231420638.mp4') #vc = cv2.VideoCapture('PXL_20220806_231644224.mp4') #vc = cv2.VideoCapture('PXL_20220808_233318199.mp4') vc = cv2.VideoCapture('PXL_20220809_162724414.mp4') while True: r, frame = vc.read() if not r: break # base image processing frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY, 1) yield frame def pixtot(frame): colsum = np.sum(frame, 0, np.float64) colsum = np.sum(colsum, 0, np.float64) return colsum def numpixels(frame): return pixtot(frame) / 255 sumhist = [] cont = False #cont = True key = 0 valuehist = [] basefr = None for frame in frameiter('output.mp4'): if basefr is None: basefr = frame continue frdiff = cv2.absdiff(basefr, frame) #hist = np.histogram(frdiff, bins=5) #print(repr(hist)) #frdiff = frame - basefr #frdiffbin = cv2.threshold(frdiff, 50, 100, cv2.THRESH_BINARY) frdiffbin = cv2.compare(frdiff, 50, cv2.CMP_GE) kernel = np.ones((4,4), np.uint8) frdiffbin = cv2.erode(frdiffbin, kernel, iterations = 2) numpix = numpixels(frdiffbin) print('np:', repr(numpix)) if numpix: # detected change # get average pixel value selected = cv2.bitwise_and(frame, frdiffbin) avg = pixtot(selected) / numpix print('avg:', avg) valuehist.append(avg) cv2.imshow('selected', selected) cv2.moveWindow('Base Frame', 1200, 300) if len(valuehist) > 6: print(repr(sorted(valuehist))) hist = np.histogram(valuehist, bins=3) print('hist:', repr(hist)) #print(repr(frdiffbin)) #moments = cv2.moments(frdiffbin) #((x, y), radius) = cv2.minEnclosingCircle(conts[0][0]) #x = int(x) #y = int(y) #radius = int(radius) #circ = ((x, y), radius) #white = (255,) #print(repr(moments)) #frdiff = cv2.circle(frdiff, circ[0], circ[1], white) cv2.imshow('Base Frame', basefr) cv2.moveWindow('Base Frame', 300, 300) cv2.imshow('Diff', frdiffbin) cv2.moveWindow('Diff', 600, 300) cv2.imshow('Next Frame', frame) cv2.moveWindow('Next Frame', 900, 300) # sum up the diffs colsum = np.sum(frdiff, 0, np.float64) colsum = np.sum(colsum, 0, np.float64) colsum = np.sum(colsum, 0, np.float64) sumhist.append(colsum) print(repr(colsum)) if not cont: key = cv2.waitKey(0) if key == ord('q'): break elif key == ord('c'): cont = True basefr = frame print(len(sumhist)) hist = np.histogram(sumhist, bins=5) print(repr(hist)) print(len(hist)) print(len(hist[1])) print(repr(valuehist)) hist = np.histogram(valuehist, bins=3) print(repr(hist)) print(repr(tovalues(valuehist, hist)))