OpenMV色块寻找

OpenMV入门,从入门到入坟>_<

此文章大部分内容取自OpenMV官方中文参考文档

详情看OpenMV官方中文参考文档

文章目录

  • 一、sensor.snapshot()拍一张照片
  • 二、image.find_blogs()查找色块
  • 三、image.find_lines()查找直线
  • 四、image.find_line_segments()查找线段
  • 五、image.find_circles()查找圆形
  • 六、image.find_rects()查找矩形
  • 七、image.draw_rectangle()画一个矩阵
  • 八、blob.rect()

一、sensor.snapshot()拍一张照片

img = sensor.snapshot()

拍摄一张照片,snapshot()函数返回一个image对象

二、image.find_blogs()查找色块

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是一个列表对象,里面有许多数值范围的定义;
  • roi:为感兴趣区域,即图像操作范围;
  • x_stride:是查找某色块时需要跳过的x像素大小的色块,如果查找的色块较大时,x_stride可以适度增加,减小误差并提高色块查找速度,y_stride同理;
  • pixels_threshold:像素个数的阈值,如果像素数量低于这个值就会被过滤掉;
  • area_threshold:面积阈值,色块被框起来的面积如果小于这个值就会被过滤掉;
  • merge:若为True,则合并所有没有被过滤的色块,这些色块的边界
  • margin:可在相交测试中用来增大或减小色块边界矩形的大小。例如:边缘为1、相互间边界矩形为1的色块将被合并;

官方说明:

  合并色块使颜色代码追踪得以实现。每个色块对象有一个代码值 code ,该值为一个位向量。 例如:若您在 image.find_blobs 中输入两个颜色阈值,则第一个阈值代码为1,第二个代码为2(第三个代码为4,第四个代码为8,以此类推)。 合并色块对所有的code使用逻辑或运算,以便您知道产生它们的颜色。这使得您可以追踪两个颜色,若您用两种颜色得到一个色块对象,则可能是一种颜色代码。
  若您使用严格的颜色范围,无法完全追踪目标对象的所有像素,您可能需要合并色块。
  最后,若您想要合并色块,但不想两种不同阈值颜色的色块被合并,只需分别两次调用 image.find_blobs ,不同阈值色块就不会被合并。
threshold_cb 可设置为用以调用阈值筛选后的每个色块的函数,以便将其从将要合并的色块列表中过滤出来。 回调函数将收到一个参数:要被筛选的色块对象。然后回调函数需返回True以保留色块或返回False以过滤色块。
  merge_cb 可设置为用以调用两个即将合并的色块的函数,以禁止或准许合并。回调函数将收到两个参数—两个将被合并的色块对象。 回调函数须返回True以合并色块,或返回False以防止色块合并。

三、image.find_lines()查找直线

image.find_lines(roi,x_stride=2,y_stride=1,threshold=1000,theta_margin=25,rho_margin=25)
  • roi:为感兴趣区域,即图像操作范围;
  • x_stride:是查找某直线时需要跳过的x像素大小的直线,如果查找的直线较大时,x_stride可以适度增加,减小误差并提高直线查找速度,y_stride同理;
  • threshold:控制图像中的直线,若只返回大于或等于阈值为threshold的直线。应用程序的正确的 threshold 值取决于图像。注意:一条直线的模(magnitude)是组成直线所有sobel滤波像素大小的总和;
  • theta_margin 控制所监测的直线的合并。直线角度为 theta_margin 的部分和直线p值为 rho_margin 的部分合并;
  • rho_margin 控制所监测的直线的合并。 直线角度为 theta_margin 的部分和直线p值为 rho_margin的部分合并;

四、image.find_line_segments()查找线段

image.find_line_segments(roi, merge_distance=0,max_theta_difference=15)
  • roi:为感兴趣区域,即图像操作范围;
  • merge_distance 指定两条线段之间的可以相互分开而不被合并的最大像素数;
  • max_theta_difference 是上面merge_distancede 要合并的的两个线段的最大角度差值;

五、image.find_circles()查找圆形

image.find_circles(roi,x_stride=2,y_stride=1,threshold=2000,x_margin=10,y_margin=10,r_margin=10,r_min=2,r_max,r_step=2)
  • roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定, ROI 即图像矩形。操作范围仅限于roi区域内的像素;
  • threshold:通过控制像素点阈值来过滤掉比这个值小的圆;
  • x_stride:是查找圆形时需要跳过的x像素大小的圆形,如果查找的圆形较大时,x_stride可以适度增加,减小误差并提高圆形的查找速度,y_stride同理;
  • x_margin 控制所检测的圆的合并。 圆像素为 x_margin 、 y_margin 和 r_margin 的部分合并;y_margin 控制所检测的圆的合并。 圆像素为 x_margin 、 y_margin 和 r_margin 的部分合并;r_margin 控制所检测的圆的合并。 圆像素为 x_margin 、 y_margin 和 r_margin 的部分合并;
  • r_min 控制检测到的最小圆半径。增加此值可以加速算法; r_max控制检测到的最大圆半径。减少此值可以加快算法;
  • r_step 控制如何逐步检测半径;

六、image.find_rects()查找矩形

 image.find_rects(roi=Auto, threshold=10000)

  返回一个 image.rect 对象的列表;roi和threshold同上。

七、image.draw_rectangle()画一个矩阵

 image.draw_rectangle(x, y, w, h,color,thickness=1,fill=False)
  • 可以单独传递x,y,w,h或作为元组(x,y,w,h)传递;
  • color是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值;
  • thickness 控制线的粗细像素;
  • 将 fill 设置为True以填充矩形;

画圆同理可得

image.draw_circle(x, y,radius,color,thickness=1,fill=False)

可以单独传递x,y,(这里的x,y指圆心的坐标)半径或作为元组(x,y,radius)传递

八、blob.rect()

    返回一个矩形元组(x,y,w,h),用于如色块边界框的 image.draw_rectangle 等 其他的 image 方法;
  同理可得:

  • 返回对象的4个角的4 (x,y)元组列表,从左上方开始按顺时针顺序返回角:blob.corners();
  • 返回色块周围的边框面积(w*h):blob.area();
  • 返回色块的密度比:blob.density();(这是在色块边界框区域内的像素点的数量。 总的来说,较低的密度比意味着这个对象的锁定得不是很好,结果在0和1之间。)
  • 返回色块的边界框的x坐标(int):blob.x();
  • 返回色块的边界框的y坐标(int):blob.y();
  • 返回色块的边界框的y坐标(int):blob.w();
  • 返回色块的边界框的y坐标(int):blob.h()
  • 返回从属于色块(int)一部分的像素数量:blob.pixels();
  • 返回色块(int)的中心x位置:blob.cx()、blob.cy();

你可能感兴趣的:(OpenMV,Python,python,计算机视觉)