Find rects, accessing x,y,h,w &magnitude


Just purchased an H7 which is perfect for my project. The find rects demo program works well but I would like to use x y etc to trigger on output pin. I am very much a beginner, just starting a python course but it may be a while before I can figure out how to get at these variables. I note that the documentation lists rect.x rect.y . If anyone has the time to just add one of these parameter to the find rects code it would make my life easier and allow me to to move on with the project while still learning. Many thanks.

# Find Rects Example
# This example shows off how to find rectangles in the image using the quad threshold
# detection code from our April Tags code. The quad threshold detection algorithm
# detects rectangles in an extremely robust way and is much better than Hough
# Transform based methods. For example, it can still detect rectangles even when lens
# distortion causes those rectangles to look bent. Rounded rectangles are no problem!
# (But, given this the code will also detect small radius circles too)...

import sensor, image, time

sensor.set_pixformat(sensor.RGB565) # grayscale is faster (160x120 max on OpenMV-M7)
sensor.skip_frames(time = 2000)
clock = time.clock()

    img = sensor.snapshot()

    # `threshold` below should be set to a high enough value to filter out noise
    # rectangles detected in the image which have low edge magnitudes. Rectangles
    # have larger edge magnitudes the larger and more contrasty they are...

    for r in img.find_rects(threshold = 10000):
        img.draw_rectangle(r.rect(), color = (255, 0, 0))
        for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))

    print("FPS %f" % clock.fps())

Hi, you just do something like:

r.x() in the for loop to get the x position of a rect.


if r.x() == 5:
#do something
#do something else

Many thanks for the quick reply. Why would it be r.x and not rect.x ?

Hi, the Python object gets the name r from the for loop. The for r in list part creates an object called r which is the name of a rect from find rects. The rect then has methods that can be called to get the value.

You should Google how python code works for these types of questions. We run general python code so there’s tons of info on all of this on the web. You need not ask me questions on this.

Just to be clear, one of the methods the rect has is called rect() which returns a python tuple which has (x,y,w,h). Or, you can just call x() to just get x.

We have both methods in our lib because some functions take only the full rect() tuple.

The actual rect object returned by find_rects is not a basic (x,y,w,h) tuple but more complex. So, the access methods allow extraction of data from the object.


I have one problem from rect(), my problem is if the rectangle object in edge of the frame but it will not give proper detection. In this case the rectangle height will give maximum height or width will take maximum width of the frame. Detected Rectangles tuple is w,h,x,y,mag: 72 59 0 0 4118 respectively.
example pics

Picture 1:

Picture 1 will give number of detected rectangle objects in frame are 2 and it will give valid tuple data.

Picture 2:

Picture2 will give number of detected rectangle objects in frame is 1 and this detected object is object 1 but second object is ignored. but this case i want to centering the second object. what can i do this situation.

Actually proper objects are looks like below picture instant of Picture 2

Number of detected rectangle objects are 2.

So, How to remove error data from picture 2

Hi, you have to write code to process the rects and throw out what you don’t want. There’s nothing special about this.