summaryrefslogtreecommitdiff
path: root/stabilize.py
diff options
context:
space:
mode:
Diffstat (limited to 'stabilize.py')
-rw-r--r--stabilize.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/stabilize.py b/stabilize.py
new file mode 100644
index 0000000..3692b2b
--- /dev/null
+++ b/stabilize.py
@@ -0,0 +1,101 @@
+import cv2
+import math
+import numpy
+from math import sin,cos
+
+cap = cv2.VideoCapture("../vid.mp4")
+writer = cv2.VideoWriter("../outvid.avi",cv2.cv.CV_FOURCC(*'MP42'),25,(1600,600),1)
+
+###### CONFIG ######
+
+feature_params = dict( maxCorners = 100,
+ qualityLevel = 0.3,
+ minDistance = 20,
+ blockSize = 7 )
+
+scale_factor=0.5
+scr_width=1600
+scr_height=600
+
+
+# Parameters for lucas kanade optical flow
+lk_params = dict( winSize = (15,15),
+ maxLevel = 2,
+ criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
+
+
+
+
+###### INITALISATION ######
+
+ret,oldframe=cap.read()
+oldgray=cv2.cvtColor(oldframe,cv2.COLOR_BGR2GRAY)
+
+height, width, bpp = oldframe.shape
+
+mask = numpy.ones((height,width, 1), numpy.uint8) * 255
+screencontent = numpy.zeros((scr_height, scr_width,3), numpy.uint8)
+
+total_angle=0.
+total_x=1500
+total_y=-300
+
+while(cap.isOpened()):
+ ret, frame = cap.read()
+ gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
+
+
+ # calculate movement, rotation and stretch. (we will ignore the stretch factor.)
+ mat = cv2.estimateRigidTransform(gray,oldgray,False)
+ angle = math.atan2(mat[0,1],mat[0,0])
+ stretch = int((math.sqrt(mat[0,1]**2+mat[0,0]**2)-1)*100)
+
+ # calculate shift_x and _y is if one would rotate-and-stretch around the center of the image, not the topleft corner
+ shift_x = mat[0,2] - width/2 + ( mat[0,0]*width/2 + mat[0,1]*height/2 )
+ shift_y = mat[1,2] - height/2 + ( mat[1,0]*width/2 + mat[1,1]*height/2 )
+
+
+ # accumulate values
+ total_x = total_x + shift_x
+ total_y = total_y + shift_y
+ total_angle=total_angle+angle
+
+ print angle/3.141592654*180,'deg\t',stretch,"%\t", shift_x,'\t',shift_y
+
+ # rotate and move current frame into a global context
+ mat2=cv2.getRotationMatrix2D((width/2,height/2), total_angle/3.141593654*180, scale_factor)
+ mat2[0,2] = mat2[0,2]+total_x*scale_factor
+ mat2[1,2] = mat2[1,2]+total_y*scale_factor
+
+
+ frame2= cv2.warpAffine(frame, mat2, (scr_width,scr_height) )
+ mask2 = cv2.warpAffine(mask, mat2, (scr_width,scr_height) )
+ ret, mask2 = cv2.threshold(mask2, 254, 255, cv2.THRESH_BINARY)
+ mask3 = cv2.erode(mask2, numpy.ones((20,200),numpy.uint8)) # strip off the potentially-badlooking edges. left/right borders are darkened, strip them off
+ mask4 = cv2.erode(mask2, numpy.ones((1,1),numpy.uint8))
+
+ screencontent = cv2.bitwise_and(screencontent,screencontent, mask=cv2.bitwise_not(mask3)) # blank out
+ screencontent = cv2.add(screencontent, cv2.bitwise_and(frame2,frame2,mask=mask3)) # and redraw
+
+ screencontent2=screencontent.copy()
+ screencontent2=cv2.bitwise_and(screencontent2,screencontent2, mask=cv2.bitwise_not(mask4))
+ screencontent2=cv2.add(screencontent2, cv2.bitwise_and(frame2,frame2,mask=mask4))
+
+ cv2.imshow('frame', frame)
+ cv2.imshow('screencontent', screencontent)
+ cv2.imshow('screencontent2', screencontent2)
+
+ writer.write(screencontent2)
+
+ oldframe=frame
+ oldgray=gray
+
+ key = cv2.waitKey(1) & 0xFF
+ if key == ord("q"):
+ break
+
+ if key == ord("r"):
+ total_angle=0.
+ total_x=700
+ total_y=-200
+ screencontent = numpy.zeros((scr_height, scr_width,3), numpy.uint8)