python: update python examples to modern python, Gst, and Glib versions
[experiments/gstreamer.git] / python / gst-test-perspective.py
index 9a74823..e40217d 100755 (executable)
@@ -1,17 +1,18 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
-# test program for the "perspective" geometric tranform element
+# test program for the "perspective" geometric transform element
 
 import cv2
 import numpy as np
+from math import cos, sin, radians
 
 import gi
 gi.require_version('Gst', '1.0')
 from gi.repository import Gst
 Gst.init(None)
 
+from gi.repository import GLib
 from gi.repository import GObject
-GObject.threads_init()
 
 
 def calc_matrix():
@@ -27,6 +28,24 @@ def calc_matrix():
     return inv_mat.flatten()
 
 
+def calc_rotation_matrix():
+    width, height = 800, 480
+
+    pivot = (width / 2, height / 2)
+    angle = 10
+    theta = radians(angle)
+
+    # The dimensions of the bounding box of the rotated rectangle
+    W = width * abs(cos(theta)) + height * abs(sin(theta))
+    H = width * abs(sin(theta)) + height * abs(cos(theta))
+
+    scale_factor = 1 / min(width / W, height / H)
+
+    mat = cv2.getRotationMatrix2D(pivot, angle, scale_factor)
+    mat = np.vstack([mat, [0, 0, 1]])
+
+    return mat.flatten()
+
 
 def main():
     pipeline = Gst.ElementFactory.make('pipeline', None)
@@ -38,15 +57,18 @@ def main():
     perspective = Gst.ElementFactory.make("perspective", None)
     pipeline.add(perspective)
 
-    print perspective.get_property("matrix")
+    print(perspective.get_property("matrix"))
 
-    M = calc_matrix()
-    perspective.set_property("matrix", M)
-    print perspective.get_property("matrix")
+    M = calc_rotation_matrix()
+    M2 = GObject.ValueArray()
+    for v in M:
+        M2.append(float(v))
+    perspective.set_property("matrix", M2)
+    print(perspective.get_property("matrix"))
 
     # This should fail!
     perspective.set_property("matrix", [0])
-    print perspective.get_property("matrix")
+    print(perspective.get_property("matrix"))
 
     videoconvert = Gst.ElementFactory.make("autovideoconvert", None)
     pipeline.add(videoconvert)
@@ -63,7 +85,7 @@ def main():
 
     pipeline.set_state(Gst.State.PLAYING)
 
-    loop = GObject.MainLoop()
+    loop = GLib.MainLoop()
     loop.run()