关于庐山派k230 类rect的角点元组顺序的问题

Viewed 134

重现步骤
返回矩形元素角点元组并打印即可

期待结果和实际结果
在通过rect相关方法返回角点元组时,感觉角点的顺序不太对。按照手册应该为左上角顺时针。而此时则为左下角逆时针

软硬件版本信息

错误日志

尝试解决过程

补充材料

完整代码:

import time
import os
import sys
import time

from media.sensor import *
from media.display import *
from media.media import *

sensor = None

try:
    print("camera_test")
    sensor = Sensor(width=320, height=240)
    sensor.reset()

    # 鼠标悬停在函数上可以查看允许接收的参数
    # 对于寻找矩形函数 最好设置分辨率为320,240 帧率大大提高
    sensor.set_framesize(width=320, height=240, chn=CAM_CHN_ID_0)
    sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)

    Display.init(Display.LT9611, to_ide=True)
    # 初始化媒体管理器
    MediaManager.init()
    # 启动 sensor
    sensor.run()

    clock = time.clock()

    while True:
        clock.tick()
        os.exitpoint()
        img = sensor.snapshot(chn=CAM_CHN_ID_0)
        img_rect = img.to_grayscale(copy = True) #将原img转化灰度img 桥梁 记得写copy参数
        img_rect = img_rect.binary([(0, 50)]) 
        rects = img_rect.find_rects(threshold = 100000)

        #遍历列表中的矩形
        for index,rect in enumerate(rects,start = 1):
            #rect.corners() 返回矩形对象的四个角的坐标,也是一个列表
            #[(x1,y1),(x2 ,y2),(x3,y3),(x4,y4)]
            corner = rect.corners()
            img.draw_line(corner[0][0],corner[0][1],corner[1][0],corner[1][1],color = (0,0,255),thickness = 10)
            img.draw_line(corner[2][0],corner[2][1],corner[1][0],corner[1][1],color = (0,0,255),thickness = 10)
            img.draw_line(corner[2][0],corner[2][1],corner[3][0],corner[3][1],color = (0,0,255),thickness = 10)
            img.draw_line(corner[0][0],corner[0][1],corner[3][0],corner[3][1],color = (0,0,255),thickness = 10)
            print(f"{index},左上角{corner[0]}")
            print(f"{index},右上角{corner[1]}")
            print(f"{index},右下角{corner[2]}")
            print(f"{index},左下角{corner[3]}")

        #打印fps至图片上
        img.draw_string_advanced(15,10,20,"fps:{}".format(clock.fps()),color = (0,255,255))
        img.compressed_for_ide() #将缩小后的图片压缩到帧缓冲区中央
        Display.show_image(img)
        

except KeyboardInterrupt as e:
    print("用户停止: ", e)
except BaseException as e:
    print(f"异常: {e}")
finally:
    if isinstance(sensor, Sensor):
        sensor.stop()
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    MediaManager.deinit()

2 Answers

你好,你是对的,这个应该是文档写的有问题

最近又尝试了多次,感觉有的时候角点元组是按手册的顺序,有时候角点是按文中所说的顺序,这是因为什么呢,是由什么因素决定的呢

我也遇到了这样的情况,识别两个矩形给的顺序不一样:一个循环内先识别到的矩形返回的角点和后识别到的起点是不同的

下面给出了测试代码,你可以试试

你好,我经过验证,矩形区域的角点坐标是正确的,只是顺序不对,应该是左下角起始,逆时针顺序。
下面给出的代码可以对含有矩形的图片进行测试,可以找一张图进行调试:

import os,sys,gc
import ulab.numpy as np
import image
from media.display import *
from media.media import *

if __name__=="__main__":
    img_path="/sdcard/test_1.jpg"
    img_data = image.Image(img_path)
    img_rgb=img_data.to_rgb565()
    rects=img_rgb.find_rects(roi=(0,0,img_rgb.width(),img_rgb.height()),threshold = 1000)
    for r in rects:
        img_rgb.draw_rectangle([v for v in r.rect()], color = (128, 0, 0))
        print("=========================================")
        print("1:",r.corners()[0][0],r.corners()[0][1])
        img_rgb.draw_string_advanced(r.corners()[0][0],r.corners()[0][1],24,"1",color=(128,0,0))
        img_rgb.draw_cross(r.corners()[0][0],r.corners()[0][1],color=(128,0,0),size=5,thickness=2)
        print("2:",r.corners()[1][0],r.corners()[1][1])
        img_rgb.draw_string_advanced(r.corners()[1][0],r.corners()[1][1],24,"2",color=(0,128,0))
        img_rgb.draw_cross(r.corners()[1][0],r.corners()[1][1],color=(0,128,0),size=5,thickness=2)
        print("3:",r.corners()[2][0],r.corners()[2][1])
        img_rgb.draw_string_advanced(r.corners()[2][0],r.corners()[2][1],24,"3",color=(0,0,128))
        img_rgb.draw_cross(r.corners()[2][0],r.corners()[2][1],color=(0,0,128),size=5,thickness=2)
        print("4:",r.corners()[3][0],r.corners()[3][1])
        img_rgb.draw_string_advanced(r.corners()[3][0],r.corners()[3][1],24,"4",color=(128,128,128))
        img_rgb.draw_cross(r.corners()[3][0],r.corners()[3][1],color=(128,128,128),size=5,thickness=2)
        print("=========================================")
    img_rgb.compress_for_ide()
    gc.collect()

结果如下图:
image.png