+#!/usr/bin/env python
+
+# test program for the "perspective" geometric tranform element
+
+import cv
+
+import gi
+gi.require_version('Gst', '1.0')
+from gi.repository import Gst
+Gst.init(None)
+
+from gi.repository import GObject
+GObject.threads_init()
+
+
+def calc_matrix():
+ top_x_shift = 200
+
+ width, height = 800, 480
+ corners = [(0, 0), (width, 0), (width, height), (0, height)]
+ target = [(top_x_shift, 0), (width - top_x_shift, 0), (width, height), (0, height)]
+
+ mat = cv.CreateMat(3, 3, cv.CV_64F)
+ cv.GetPerspectiveTransform(corners, target, mat)
+
+ inv_mat = cv.CreateMat(3, 3, cv.CV_64F)
+ cv.Invert(mat, inv_mat)
+
+ matrix = [inv_mat[j, i] for j in range(mat.rows) for i in range(mat.cols)]
+ return matrix
+
+
+def main():
+ pipeline = Gst.ElementFactory.make('pipeline', None)
+
+ videosrc = Gst.ElementFactory.make('videotestsrc', None)
+ pipeline.add(videosrc)
+
+ # Test the perspective element
+ perspective = Gst.ElementFactory.make("perspective", None)
+ pipeline.add(perspective)
+
+ print perspective.get_property("matrix")
+
+ M = calc_matrix()
+ perspective.set_property("matrix", M)
+ print perspective.get_property("matrix")
+
+ # This should fail!
+ perspective.set_property("matrix", [0])
+ print perspective.get_property("matrix")
+
+ videoconvert = Gst.ElementFactory.make("autovideoconvert", None)
+ pipeline.add(videoconvert)
+
+ videosink = Gst.ElementFactory.make("autovideosink", None)
+ pipeline.add(videosink)
+
+ caps = Gst.caps_from_string(
+ "video/x-raw,format=\"AYUV\",width=800,height=480")
+
+ videosrc.link_filtered(perspective, caps)
+ perspective.link(videoconvert)
+ videoconvert.link(videosink)
+
+ pipeline.set_state(Gst.State.PLAYING)
+
+ loop = GObject.MainLoop()
+ loop.run()
+
+
+if __name__ == '__main__':
+ main()