Caroline
Caroline

Reputation: 41

Using gstreamer videocrop with asymmetric values ​distorts the image

My gstreamer code generates a distorted image if the values ​​passed to videocrop to remove pixels from the left side of the image are different from the values ​​passed to remove pixels from the right side. In the code, if crop_left is different from crop_right, the image is distorted. Are all the values ​​positive, even and within the image limits. How to solve?

def buildCameraEnvVar(self, lenght_cam=None, width_cam=200, center_cam=15):

        def round_up_to_even(f):
            return math.ceil(f / 2.) * 2

        
        self.gstCamera = Gst.Pipeline()
        
        if not self.gstCamera:
            self.error = True

        src = Gst.ElementFactory.make('v4l2src', "camera")
        if not src:
            self.error = True
        
        src.set_property("io-mode", int(2))    
                
        caps_filter = Gst.ElementFactory.make("capsfilter","capsFilter")
        if not caps_filter:
            self.error = True
        
        filter = Gst.Caps.from_string(self.PLV_CAM_CAPS_FILTER1)
        caps_filter.set_property('caps', filter)

        pixels_by_cm = 1120 / width_cam
        pixels_rm    = pixels_by_cm*(width_cam - 200)
        crop         = int(80 + pixels_rm/2)
        crop         = np.clip(crop, 0, 1280/2)


        center_cam_pixel = (center_cam - 15)*pixels_by_cm
        crop_left  = crop - center_cam_pixel/2
        crop_right = crop + center_cam_pixel/2
        crop_left  = round_up_to_even(np.clip(crop_left, 0, 1280/2))
        crop_right = round_up_to_even(np.clip(crop_right, 0, 1280/2))
  
        
        cutter = Gst.ElementFactory.make('videocrop', "cutter")
        cutter.set_property("top", 180)  #180
        cutter.set_property("bottom", 0)
        cutter.set_property("left", (crop_left))  #80
        cutter.set_property("right", (crop_right)) #80

        largura_img = int(1280 - (crop_left) - (crop_right))

        
        queue2 = Gst.ElementFactory.make("queue", "queue2")
        queue3 = Gst.ElementFactory.make("queue", "queue3")
        queue  = Gst.ElementFactory.make("queue", "queue")
        convert = Gst.ElementFactory.make("videoconvert","convert")

        sink = Gst.ElementFactory.make("appsink","sink")
        if not sink:
            self.error = True

        sink.set_property('emit-signals', 1)

        #### Dumping into pipeline
        self.gstCamera.add(src)
        self.gstCamera.add(caps_filter)
        self.gstCamera.add(queue)
        self.gstCamera.add(queue2)
        self.gstCamera.add(queue3)
        self.gstCamera.add(convert)
        self.gstCamera.add(cutter)
        self.gstCamera.add(sink)

        #### Linking elements
        src.link(caps_filter)
        caps_filter.link(queue)
        queue.link(cutter)
        cutter.link(queue3)
        queue3.link(convert)
        convert.link(sink)

        #### Adding function to 'new-sample' signal
        self.handler_id = sink.connect("new-sample", self.__on_new_sample)

Upvotes: 0

Views: 13

Answers (0)

Related Questions