openmv中模块解析

模块解析
1. sensor摄像头模块:包含了感光芯片与图像预处理的各项操作.
sensor.reset()#重置并初始化OpenMV
sensor.set_pixformat(sensor.RGB565)#选择颜色空间与像素格式RGB565/GRAYSCALE,设定选择颜色空间为RGB, 选择像素格式为RGB565.颜色存储红色(8位)绿色(8位)蓝色(8位).各通道的取值范围0-255, RGB565就是R(5位)G(6位)B(5位)相对于普通的RGB进行压缩
sensor.set_framesize(sensor.QVGA)#选择窗口分辨率为320*240,VGA640×480,QQVGA160×120
sensor.skip_frames([n, time])# skip_frame() 一共有两种传参方式, 一种是设定跳过的帧数n:sensor.skip_frame(20),一种是指定等待的时间time单位为ms,sensor.skip_frames(time = 2000)
img = sensor.snapshot() #截取当前sensor读取的画面,返回一个Image对象,赋值给img变量
2. time计时模块,micropython的time模块与python标准库的time模块不是一个包, 这里的time模块主要起计时的作用,用于追踪过去的时间。
clock = time.clock()#创建一个 clock实例。
clock.tick()#开始计时,是开始计时追踪过去的时间。此操作就等同于摁一下手里的秒表,开始计时。
clock.fps()#这个函数做的事情是记录从clock.tick()开始。 中间做了一些其他操作, 然后到执行到clock.fps()这个函数之间一共花费了多久的时间, 我们记为t.然后再将这个时间t转换为帧率fps.
3. image图像基本运算模块
image.get_pixel(x, y):获取一个像素点的值,对于灰度图: 返回(x,y)坐标的灰度值,对于彩色图: 返回(x,y)坐标的(r,g,b)的tuple.
image.set_pixel(x, y, pixel):设置一个像素点的值,img.set_pixcel(10,10,(255,0,0))
image.width()返回图像的宽度(像素)image.height()返回图像的高度(像素)image.size()返回图像的大小(byte)
image.difference(image)从这张图片减去另一个图片
image.draw_line((10,10,20,30), color=(255,0,0))在图像中画一条直线line_tuple格式是(x0, y0, x1, y1),(x0, y0)到(x1, y1)的直线。
image.draw_rectangle(rect_tuple, color=White) 在图像中画一个矩形框,rect_tuple 的格式是 (x, y, w, h)。
image.draw_circle(x, y, radius, color=White) 在图像中画一个圆。x,y是圆心坐标,radius是圆的半径
寻找色块:由image.find_blobs返回。
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge= False, margin=0, threshold_cb=None, merge_cb=None)寻找色块。
       thresholds是颜色的阈值,注意:这个参数是一个列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。
      roi是“感兴趣区”,格式是(x, y, w, h)的tupple。
      x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2。
      y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1。
      area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉。
      pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉
      merge 合并,如果设置为True,那么合并所有重叠的blob为一个。 注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。
     find_blobs对象返回的是多个blob的列表。而一个blobs列表里包含很多blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息。
     blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。
     blob.x() 返回色块的外框即目标颜色区域左上顶点的x坐标(int),也可以通过blob[0]来获取。
     blob.y() 返回色块的外框即左上顶点的y坐标(int),也可以通过blob[1]来获取。
     blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
     blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。
     blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。
     blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
     blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
     blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,么这个值为0~180°。如果色块是一个圆,这个值是无用的。如果色块完全没有对称性会得到0~360°,也可以通过blob[7]来获取。
     [8]代表与此目标区域交叉的目标个数。
     blob.code() 返回一个16bit数字,每个bit对应一个阈值用来分辨该区域是用哪个颜色阈值识别出来的,也可以通过blob[9]来获取。
寻找直线:直线由image.find_lines , image.find_line_segments 或  image.get_regression返回的。
image.find_lines(roi, x_stride=2, y_stride=1, threshold=1000, theta_margin=25, rho_margin=25)使用霍夫变换查找图像中的所有直线。返回一个 image.line对象的列表。
    roi 是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。操作范围仅限于 roi 区域内的像素。
    x_stride 是霍夫变换时需要跳过的x像素的数量。若已知直线较大,可增加 x_stride 。
    y_stride 是霍夫变换时需要跳过的y像素的数量。若已知直线较大,可增加 y_stride 。
    threshold 控制从霍夫变换中监测到的直线。只返回大于或等于 threshold 的直线。 应用程序的正确的 threshold 值取决于图像。注意:一条直线的模(magnitude)是组成直线所有sobel滤波像素大小的总和。
    theta_margin/rho_margin控制所监测的直线的合并。 直线角度为 theta_margin 的部分和直线p值为 rho_margin 的部分合并。
    该方法通过在图像上运行索贝尔滤波器,并利用该滤波器的幅值和梯度响应来进行霍夫变换。 无需对图像进行任何预处理。但是,清理图像过滤器可得到更为稳定的结果。
image.find_line_segments([roi, merge_distance=0, max_theta_difference=15)使用霍夫转换来查找图像中的线段。返回一个 image.line对象的列表。
    roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定, ROI 即图像矩形。
    merge_distance 指定两条线段之间的可以相互分开而不被合并的最大像素数。
    max_theta_difference 是上面 merge_distancede 要合并的的两个线段的最大角度差值。此方法使用LSD库(也被OpenCV使用)来查找图像中的线段。这有点慢,但是非常准确,线段不会跳跃。
image.get_regression(thresholds, invert=False, roi, x_stride=2, y_stride=1, area_threshold=10, pixels_threshold=10, robust=False)函数返回回归后的线段对象line,有x1(), y1(), x2(), y2(), length(), theta(), rho(), magnitude()参数。x1 y1 x2 y2分别代表线段的两个顶点坐标,length是线段长度,theta是线段的角度。magnitude表示线性回归的效果,它是(0,+∞)范围内的一个数字,0代表一个圆。如果场景线性回归的越好,这个值越大。
    对图像所有阈值像素进行线性回归计算。这一计算通过最小二乘法进行,通常速度较快,但不能处理任何异常值。 若 robust 为True,则使用Theil-Sen线性回归算法,它计算图像中所有阈值像素的斜率的中位数。 若在阈值处理后有太多像素,即使在80x60的图像上,这个O(N^2)操作也可能将您的FPS降到5帧以下。 但是,只要阈值转换后的像素数量较少,即使在高达30%的阈值像素是异常值的情况下也依然有效,鲁棒性好。https://openmv.io/blogs/news/linear-regression-line-following
    thresholds 是元组列表。 [(lo, hi), (lo, hi), ..., (lo, hi)] 定义你想追踪的颜色范围.对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值.仅考虑落在这些阈值之间的像素区域. 对于RGB565图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi) - 分别是LAB通道的最小值和最大值,如果元组大于六个值,则忽略其余值。相反,如果元组太短则假定其余阈值处于最大范围。
    invert 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。
    roi 是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于 roi 区域内的像素。
    x_stride 是调用函数时要跳过的x像素数。
    y_stride 是调用函数时要跳过的y像素数。
    如果回归后的边界框区域小于 area_threshold ,则返回None。
    如果回归后的像素数小于 pixel_threshold ,则返回None。

3. pyb各种外设模块
pyb.LED(2)#LED灯亮,LED(1) -> 红LED,LED(2) -> 绿LED,LED(3) -> 蓝LED,LED(4) -> 红外LED,两个
pyb.millis() # 获取从启动开始计时的毫秒数
from pyb import UART串口信息,uart = UART(3, 19200)

  • 23
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你的代码已经包含了检测圆形和矩形的部分,但是缺少了检测三角形的部分。我会在代码添加检测三角形的功能,同时进行一些优化。以下是修改后的代码: ```python import sensor import image import time sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QQVGA) sensor.skip_frames(time=2000) clock = time.clock() while True: clock.tick() img = sensor.snapshot().lens_corr(1.8) # 检测圆形 for c in img.find_circles(threshold=3500, x_margin=10, y_margin=10, r_margin=10, r_min=2, r_max=100, r_step=2): img.draw_circle(c.x(), c.y(), c.r(), color=(255, 0, 0)) print(c) img = sensor.snapshot() # 检测矩形 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(r) # 检测三角形 sum_theta = 0 count = 0 for l in img.find_line_segments(merge_distance=10, max_theta_diff=10): img.draw_line(l.line(), color=(255, 0, 0)) sum_theta += l.theta() count += 1 avg_theta = sum_theta / count if count > 0 else 0 if 1 < avg_theta < 110: print('三角形') print("FPS %f" % clock.fps()) ``` 请注意,我添加了一个变量`sum_theta`和`count`来计算检测到的直线的平均角度。然后,根据平均角度判断是否为三角形。这只是一个简单的判断方式,您可以根据需求进行进一步优化。希望这对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值