X-Git-Url: https://git.ao2.it/experiments/gstreamer.git/blobdiff_plain/7bdb0839fbadd5c43133b7e14a49d41d3dd84e44..2e8d81473f8663741c2860a8ee6e92fc994bbf39:/python/gst-test-perspective.py?ds=sidebyside diff --git a/python/gst-test-perspective.py b/python/gst-test-perspective.py index b51591a..e40217d 100755 --- a/python/gst-test-perspective.py +++ b/python/gst-test-perspective.py @@ -1,33 +1,50 @@ -#!/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 cv +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(): 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)] + corners = np.array([(0, 0), (width, 0), (width, height), (0, height)], dtype=np.float32) + target = np.array([(top_x_shift, 0), (width - top_x_shift, 0), (width, height), (0, height)], dtype=np.float32) - mat = cv.CreateMat(3, 3, cv.CV_64F) - cv.GetPerspectiveTransform(corners, target, mat) + mat = cv2.getPerspectiveTransform(corners, target) + ret, inv_mat = cv2.invert(mat) - inv_mat = cv.CreateMat(3, 3, cv.CV_64F) - cv.Invert(mat, inv_mat) + return inv_mat.flatten() - matrix = [inv_mat[j, i] for j in range(mat.rows) for i in range(mat.cols)] - return matrix + +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(): @@ -40,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) @@ -65,7 +85,7 @@ def main(): pipeline.set_state(Gst.State.PLAYING) - loop = GObject.MainLoop() + loop = GLib.MainLoop() loop.run()