ObjectTracking bounding box

Typically: "How do I... ", "How can I... " questions
Post Reply
NandanUmrikar
Posts: 12
Joined: 11 Mar 2024, 09:45

ObjectTracking bounding box

Post by NandanUmrikar »

In the ObjectTracking example in coppeliasim, the sensor script generates a bounding box around the identified object. How do I make the bounding box into a circle/ellipse? I need this change in order to use the circular shape in further detailing. Adding the sensor script (responsible for the bounding box) below.

Code: Select all

# python

import numpy as np
import cv2 as cv

def readFrame():
    sim.handleVisionSensor(self.handle)
    buf, res = sim.getVisionSensorImg(self.handle)
    return np.frombuffer(buf, dtype=np.uint8).reshape(*res, 3)

def showImage(k, img):
    sim.setVisionSensorImg(sim.getObject(f':/{k}'), img.tobytes())

def sysCall_init():
    sim = require('sim')
    self.handle = sim.getObject('.')
    robot = sim.getObject(':')
    script = sim.getScript(sim.scripttype_childscript, robot)
    self.robotScriptFuncs = sim.getScriptFunctions(script)

def sysCall_thread():
    while True:
        frame = readFrame()
        imgw, imgh, imgc = frame.shape
        blurred = cv.GaussianBlur(frame, (13, 13), 0)
        hsv = cv.cvtColor(blurred, cv.COLOR_RGB2HSV)
        # construct a mask for the color "red", then perform
        # a series of dilations and erosions to remove any small
        # blobs left in the mask
        mask = cv.inRange(hsv, (0, 200, 64), (80, 255, 200))
        n = 5
        mask = cv.dilate(mask, None, iterations=n)
        mask = cv.erode(mask, None, iterations=n)
        maskdbg = cv.cvtColor(mask, cv.COLOR_GRAY2RGB)
        
        contours, hierarchy = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
        if contours:
            c = max(contours, key = cv.contourArea)
            x, y, w, h = cv.boundingRect(c)
            cv.rectangle(maskdbg, (x, y), (x+w, y+h), (0, 255, 0), 2)
            cv.arrowedLine(maskdbg, (x+w//2, y+h//2), (imgw//2, imgh//2), (255, 0, 0), 2)
            
            # normalize rect in -1 ... +1:
            normalize = lambda x: np.interp(x[0], (0, x[1]), (-1, 1))
            x, y, w, h = map(normalize, ((x, imgw), (y, imgh), (w, imgw), (h, imgh)))
            
            # box center:
            self.robotScriptFuncs.setBoxCenter(x + w/2, y + h/2)

        showImage('blurred', blurred)
        showImage('hsv', hsv)
        showImage('mask', maskdbg)
The bounding circle should adjust its size according to the grayscale/binary image size. The rest of the functions should work the same. Can it be done?
Thank you in advance!!!

fferri
Posts: 1230
Joined: 09 Sep 2013, 19:28

Re: ObjectTracking bounding box

Post by fferri »

NandanUmrikar wrote: 19 Mar 2024, 10:04 In the ObjectTracking example in coppeliasim, the sensor script generates a bounding box around the identified object. How do I make the bounding box into a circle/ellipse?
yes, change:
NandanUmrikar wrote: 19 Mar 2024, 10:04 cv.rectangle(maskdbg, (x, y), (x+w, y+h), (0, 255, 0), 2)
to some different drawing instruction.

Post Reply