企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Image 类_ 图像对象( `import image` ) `Image` 类_图像对象是机器视觉操作的基本对象 ***** ## **构造函数:** * [ ] **构造图像对象** ``` class image.Image(path[,copy_to_fb=False]) ``` > 打开一个新的图像对象 *参数:* * `path`: 图像对象路径, 比如`/sd/MixPY.jpg`,支持`bmp` `pgm` `ppm` `jpg` `jpeg`格式的图像文件 * `copy_to_fb`:图像介质 * `True`,图像会直接载入帧缓冲区,可以加载大幅图片了 * `False`,图像会载入MicroPython的堆中,堆远比帧缓冲区小 *返回:* * 返回一个对象, 根据不同格式返回的对象不同 > 对于JPEG图像而言,“\[\]”使得您可以访问压缩的节数组形式的JPEG图像色块。由于JPEG图像是压缩的字节流形式,因而对数据组的读取和写入是不透明的。 > > 图像还支持读缓冲区操作。您可以把图像当作节数组对象,将图像输入所有类型的MicroPython函数。若您想传送一个图像,可以将它传递给UART /SPI/ I2C写入函数,可实现自动传送。 ***** ## **方法:** * [ ] **获取图像的宽度** ``` .width() ``` > 获取以像素计的图像的宽度 *参数:* * 无 *返回:* * 返回以像素计的图像的宽度 ***** * [ ] **获取图像的高度** ``` .height() ``` > 获取以像素计的图像的高度 *参数:* * 无 *返回:* * 返回以像素计的图像的高度 ***** * [ ] **获取图像的格式** ``` .format() ``` > 获取图像的格式 *参数:* * 无 *返回:* * `int`类型的图像的格式 * `1`:? * `2`:RGB图像的`sensor.RGB565`格式 * `3`:? * `4`:灰度图的`sensor.GRAYSCALE`格式 ***** * [ ] **获取图像大小** ``` .size() ``` > 获取图像大小 *参数:* * 无 *返回:* * 返回以字节计的图像大小 ***** * [ ] **获取图像某点像素值** ``` .get_pixel(x,y) ``` > 获取图像某点像素值 *参数:* * `x`,`y`:图像的`(x, y)`位置点 *返回:* * ` RGB565`图像,返回`(x, y)`位置的RGB888像素元组`(r, g, b)` * `GRAYSCALE`图像, 返回`(x, y)`位置的像素值 > 不支持压缩图像 ***** * [ ] **设置图像某点像素值** ``` .set_pixel(x,y [,rgbtuple]) ``` > 设置图像某点像素值 *参数:* * `x`,`y`:图像的`(x, y)`位置点 * `rgbtuple`:设置点颜色`RGB888`元组, 比如`(236, 36, 36)`,默认白色 *返回:* * ` RGB565`图像,返回`(x, y)`位置的RGB888像素元组`(r, g, b)` * `GRAYSCALE`图像, 返回`(x, y)`位置的像素值 > 不支持压缩图像 ***** * [ ] **原图缩小图像** ``` .mean_pool(x_div,y_div) ``` > 在原来图像上快速缩小图像 *参数:* * `x_div`,`y_div`:把图像进行`x_div` `y_div`缩小的倍数(int类型) *返回:* * 返回缩小修改图像 > 不支持压缩图像 ***** * [ ] **创建缩小图像** ``` .mean_pooled(x_div,y_div) ``` > 创建缩小的图像副本 *参数:* * `x_div`,`y_div`:把图像进行`x_div` `y_div`缩小的倍数(int类型) *返回:* * 返回缩小新图像 > 不支持压缩图像 ***** * [ ] **图像转换为灰度图** ``` .to_grayscale([copy=False]) ``` > 将图像转换为灰度图像 *参数:* * `copy`:为True才能在堆上创建新的修改图像 *返回:* * 返回灰度图像对象 > 不支持压缩图像 ***** * [ ] **图像转换为彩色图** ``` .to_rgb565([copy=False]) ``` > 将图像转换为彩色图像 *参数:* * `copy`:为True才能在堆上创建新的修改图像 *返回:* * 返回彩色图像对象 > 不支持压缩图像 ***** * [ ] **图像转换为彩虹图** ``` .to_rainbow([copy=False]) ``` > 将图像转换为彩虹图像 *参数:* * `copy`:为True才能在堆上创建新的修改图像 *返回:* * 返回彩虹图像对象 > 不支持压缩图像 > 彩虹图像是彩色图像,对于图像中的每个8位掩模灰度照明值具有唯一的颜色值。 例如,它为热图像提供热图颜色。 ***** * [ ] **复制图像** ``` .copy([roi[,copy_to_fb=False]]) ``` > 复制一个图像对象的副本 *参数:* * `Roi`:复制的矩形的感兴趣区域`(x, y, w, h)`,若未指定,`Roi`即复制整个图像的图像矩形 * `copy_to_fb`:若为True,则将帧缓冲替换为图像 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **保存图像** ``` .save(path[,roi[,quality=50]]) ``` > 将图像的副本保存到`path`中的文件系统。 *参数:* * `path`: 图像对象路径, 比如`/sd/MixPY.jpg`,支持`bmp` `pgm` `ppm` `jpg` `jpeg`格式的图像文件 * `Roi`:保存的矩形的感兴趣区域(x, y, w, h),若未指定,`Roi`即保存整个图像的图像矩形 *`quality` :指在图像尚未被压缩时将图像保存为JPEG格式的JPEG压缩质量 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **像素设置为零** ``` .clear() ``` > 将图像中的所有像素设置为零 *参数:* * 无 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制直线** ``` .draw_line(x0,y0,x1,y1[,color[,thickness=1]]) ``` > 图像上绘制一条从(x0,y0)到(x1,y1)的线 *参数:* * `x0`,`y0`,`x1`,`y1`:绘制的直线的起点坐标与终点坐标,可以为单独传递,也可以为元组 * `color`:绘制的直线颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `thickness`:控制线的粗细像素 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制矩形** ``` .draw_rectangle(x,y,w,h[,color[,thickness=1[,fill=False]]]) ``` > 图像上绘制一个矩形 *参数:* * `x`,`y`,`w`,`h`:绘制的矩形的起点坐标与长宽参数,可以为单独传递,也可以为元组 * `color`:绘制的矩形颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `thickness`:控制矩形的条框线粗细像素 * `fill`:为True以填充矩形 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制圆形** ``` .draw_circle(x,y,radius[,color[,thickness=1[,fill=False]]]) ``` > 图像上绘制一个圆形 *参数:* * `x`,`y`,`radius`:绘制的圆形的圆心坐标与半径,可以为单独传递,也可以为元组 * `color`:绘制的圆形颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `thickness`:控制圆形的条框粗细像素 * `fill`:为True以填充圆形 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制文本** ``` .draw_string(x,y,text[,color[,scale=1[,x_spacing=0[,y_spacing=0[,mono_space=True]]]]]) ``` >在 图像中的(x, y)起点位置开始绘制文本 *参数:* * `x`,`y`:绘制的文本的起点坐标(左上角),可以为单独传递,也可以为元组 * `color`:绘制的圆形颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `scale`设置图像上文本的大小(字号) * `x_spacing`:设置字符间距,字符之间添加(如果是正数)或减去(如果是负数)x像素 * `y_spacing`:设置行间距,字符之间添加(如果是正数)或减去(如果是负数)y像素 * `mono_space`:默认为`True`,强制文本间距固定,设置`False`以获得非固定宽度的字符间距 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制十字** ``` .draw_cross(x,y[,color[,size=5[,thickness=1]]]) ``` > 图像上绘制一个十字 *参数:* * `x`,`y`:绘制的十字的中心坐标,可以为单独传递,也可以为元组 * `color`:绘制的圆形颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `size`:控制十字的延伸长度像素 * `thickness`:控制十字的条框粗细像素 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制箭头** ``` .draw_arrow(x0,y0,x1,y1[,color[,thickness=1]]) ``` > 图像上绘制一个箭头 *参数:* * `x0`,`y0`,`x1`,`y1`:绘制的箭头的起点坐标与终点坐标,可以为单独传递,也可以为元组 * `color`:绘制的箭头颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `thickness`:控制箭头的粗细像素 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制图像** ``` .draw_image(image,x,y[,x_scale=1.0[,y_scale=1.0[,mask=None]]]) ``` > 绘制一个`image`图像 *参数:* * `image`:传入一个`image`类型图像 * `x`,`y`:绘制的图像的起点坐标(左上角),可以为单独传递,也可以为元组 * `x_scale`:控制图像在x方向(浮点数)缩放的程度 * `y_scale`:控制图像在y方向(浮点数)缩放的程度 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **绘制特征点** ``` .draw_keypoints(keypoints[,color[,size=10[,thickness=1[,fill=False]]]]) ``` > 绘制一个特征点对象的各个点 *参数:* * `keypoints`:传入一个特征点对象(可以用`.find_keypoints`方法获取) * `color`:绘制特征点颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `size`:控制特征点的大小 * `thickness`:控制线的粗细像素 * `fill`:设置为True以填充特征点 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **填充图像** ``` .flood_fill(x,y[,seed_threshold=0.05[,floating_threshold=0.05[,color[,invert=False[,clear_background=False[,mask=None]]]]]]) ``` > 像洪水一样填充图像中低矮凹陷的地方(洪水填充) *参数:* * `x`,`y`:从`x,y`位置开始填充图像的区域,可以为单独传递,也可以为元组 * `seed_threshold`:控制填充区域中的像素与原始起始像素的差异 * `floating_threshold`:控制填充区域中的像素与任何相邻像素的差异 * `color`:区域填充的颜色(默认白色): * `RGB565`16 位的颜色值,比如`0xFFFF` * `RGB888`元组, 比如`(236, 36, 36)` * `GRAYSCALE`灰度图素值`(0-255)` * `invert`:若为True,以重新填充`flood_fill`连接区域外的所有内容 * `clear_background`:若为True,将其余的`flood_fill`没有重新着色的像素归零 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像二值化** ``` .binary(thresholds[,invert=False[,zero=False[,mask=None[,to_bitmap=False[,copy=False]]]]]) ``` > 将给定值追踪的颜色像素设置为黑、白色二值化 *参数:* * `thresholds`:追踪的颜色阈值,必须是元组列表`[ ]` * 若灰度图像,每个元组需要包含两个值,最小灰度值和最大灰度值 * 若彩色图像,每个元组需要有六个值`(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi)`,为LAB L,A和B通道的最小值和最大值 * `invert`:若为`True`反转阈值操作 * `zero`:若为`True`来使阈值像素为零,并使不在阈值列表中的像素保持不变 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 `to_bitmap`:若为`True`将图像数据转换为二进制位图图像 `copy`:若为`True`创建二值化映像的副本 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像反转** ``` .invert() ``` > 翻转图像中的所有像素值 *参数:* * 无 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像反转** ``` .invert() ``` > 翻转图像中的所有像素值 *参数:* * 无 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像腐蚀** ``` .erode(size[,threshold[,mask=None]]) ``` > 图像腐蚀,从分割区域的边缘删除像素(白色目标区域) *参数:* * `size`:通过卷积图像上`((size*2)+1)x((size*2)+1)`像素的核来实现 * ` threshold`:若未设定,功能如标准腐蚀方法一样。若设定,可以指定腐蚀的特定像素 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像膨胀** ``` .dilate(size[,threshold[,mask=None]]) ``` > 图像膨胀,将像素添加到分割区域的边缘中(白色目标区域) *参数:* * `size`:通过卷积图像上`((size*2)+1)x((size*2)+1)`像素的核来实现 * ` threshold`:若未设定,功能如标准膨胀方法一样。若设定,可以指定膨胀的特定像素 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像反转** ``` .negate() ``` > 非常快速地翻转图像中的所有像素值 *参数:* * 无 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像替换** ``` .replace(image[,hmirror=False[,vflip=False[,mask=None]]]) ``` > 用新图像替换原有图像 *参数:* * `image`:传入一个`image`类型图像 * `hmirror`:设置为True以水平镜像替换图像。 * `vflip`:设置为True以垂直翻转替换图像 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像相加** ``` .add(image[,mask=None]) ``` > 将两个图像彼此按像素相加 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像相减** ``` .sub(image[,reverse=False[,mask=None]) ``` > 将两个图像彼此按像素相减 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `reverse`:设置为True可以将减法操作从`this_image-image`反转为`image-this_image` * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像相乘** ``` .mul(image[,invert=False[,mask=None]) ``` > 将两个图像彼此按像素相乘 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `invert`:设置为True可将乘法运算从`a*b`改为`1/((1/a)*(1/b))`,这使图像变亮而不是使图像变暗 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像相除** ``` .div(image[,invert=False[,mask=None]) ``` > 将两个图像彼此按像素相除 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 *`invert`:设置为True可将除法方向从`a/b`改为`b/a` * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **最小像素值刷选** ``` .min(image[,mask=None]) ``` > 在像素级 用此图像和另一个图像之间的最小像素值替换此图像中的像素 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **最大像素值刷选** ``` .max(image[,mask=None]) ``` > 在像素级 用此图像和另一个图像之间的最大像素值替换此图像中的像素 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像绝对值** ``` .difference(image[,mask=None]) ``` > 将两个图像彼此按像素取绝对值 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **图像融合** ``` .blend(image[,mask=None]) ``` > 将另外一张图像与这一图像融合 *参数:* * `image`:传入一个`image`类型图像,也可以是RGB888元组或灰度图像素值 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **直方图均衡算法** ``` .histeq([adaptive=False[,clip_limit=-1[,mask=None]]]) ``` > 在图像上运行直方图均衡算法,直方图均衡化使图像中的对比度和亮度标准化 *参数:* * `adaptive`:若为True,将在图像上运行自适应直方图均衡方法 * `clip_limit`:提供了一种限制自适应直方图均衡的对比度的方法 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **均值滤波** ``` .mean(size,[threshold=False, [offset=0, [invert=False, [mask=None]]]]) ``` > 使用盒式滤波器的标准均值模糊滤波 *参数:* *`size`: 是内核的大小,取1 (3x3 内核)、2 (5x5 内核)或更高值 * `threshold`:若为`True`,启动图像的自适应阈值处理, 根据环境像素的亮度,将像素设置为1或者0 * `offset`:值将更多像素设置为1,而正值仅将最强对比度设置为1 * `invert`:反转二进制图像的结果输出 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** * [ ] **中值滤波** ``` .median(size,[threshold=False, [offset=0, [invert=False, [mask=None]]]]]) ``` > 使用盒式滤波器的标准均值模糊滤波 *参数:* *`size`: 是内核的大小,取1 (3x3 内核)、2 (5x5 内核)或更高值 * `threshold`:若为`True`,启动图像的自适应阈值处理, 根据环境像素的亮度,将像素设置为1或者0 * `offset`:值将更多像素设置为1,而正值仅将最强对比度设置为1 * `invert`:反转二进制图像的结果输出 * `mask`:绘图操作的像素级掩码的图像。掩码为一个只有黑色或白色像素的图像,和绘制的`image`大小相同 *返回:* * 返回一个图像对象 > 不支持压缩图像 ***** `image.to_bitmap`(\[*copy=False*\]) Converts an image to a bitmap image (1 bit per pixel). This method modifies the underlying image pixels changing the image size in bytes too so it can only be done in place on a Grayscale or an RGB565 image. Otherwise`copy`must be True to create a new modified image on the heap. Returns the image object so you can call another method using`.`notation. Not supported on compressed images or bayer images. ` `image.draw_image`(*image*,*x*,*y*\[,*x\_scale=1.0*\[,*y\_scale=1.0*\[,*mask=None*\]\]\]) 绘制一个`image`,其左上角从位置x,y开始。 您可以单独传递x,y,也可以传递给元组(x,y)。 `x_scale`控制图像在x方向(浮点数)缩放的程度。 `y_scale`控制图像在y方向(浮点数)缩放的程度。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 您可以使用mask掩码进行绘制操作。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.draw_keypoints`(*keypoints*\[,*color*\[,*size=10*\[,*thickness=1*\[,*fill=False*\]\]\]\]) 在图像上画出一个特征点对象的各个点。 `color`是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 `size`控制特征点的大小。 `thickness`控制线的粗细像素。 将`fill`设置为True以填充特征点。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.flood_fill`(*x*,*y*\[,*seed\_threshold=0.05*\[,*floating\_threshold=0.05*\[,*color*\[,*invert=False*\[,*clear\_background=False*\[,*mask=None*\]\]\]\]\]\]) 从位置x,y开始填充图像的区域。 您可以单独传递x,y,也可以传递给元组(x,y)。 `seed_threshold`控制填充区域中的像素与原始起始像素的差异。 `floating_threshold`控制填充区域中的像素与任何相邻像素的差异。 `color`是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 将`invert`传递为True,以重新填充flood\_fill连接区域外的所有内容。 将`clear_background`传递为True,将其余的flood\_fill没有重新着色的像素归零。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩膜中设置的像素会在flood\_fill时被评估。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.binary`(*thresholds*\[,*invert=False*\[,*zero=False*\[,*mask=None*\[,*to\_bitmap=False*\[,*copy=False*\]\]\]\]\]) 根据像素是否在阈值列表`thresholds`中的阈值内,将图像中的所有像素设置为黑色或白色。 `thresholds`必须是元组列表。`[(lo,hi),(lo,hi),...,(lo,hi)]`定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于RGB565图像,每个元组需要有六个值(l\_lo,l\_hi,a\_lo,a\_hi,b\_lo,b\_hi) - 分别是LAB L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 注解 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是`thresholds`的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的`工具->机器视觉->阈值编辑器`并从GUI窗口中拖动滑块来确定颜色阈值。 `invert`反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 设置`zero`为True来使阈值像素为零,并使不在阈值列表中的像素保持不变。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 `to_bitmap`turns the image data into a binary bitmap image where each pixel is stored in 1 bit. Set`copy`to True when using`to_bitmap`. `copy`if True creates a copy of the binarized image on the heap versus modifying the source image. 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.invert`() 将二进制图像0(黑色)变为1(白色),1(白色)变为0(黑色),非常快速地翻转二进制图像中的所有像素值。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和Bayer图像。 `image.b_and`(*image*\[,*mask=None*\]) 用另一图像与这一图像进行逻辑与运算。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.b_nand`(*image*\[,*mask=None*\]) 用另一图像与这一图像进行逻辑与非运算。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.b_or`(*image*\[,*mask=None*\]) 用另一图像与这一图像进行逻辑或运算。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``b_nor`(*image*\[,*mask=None*\]) 用另一图像与这一图像进行逻辑或非运算。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``b_xor`(*image*\[,*mask=None*\]) 用另一图像与这一图像进行逻辑异或运算。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``b_xnor`(*image*\[,*mask=None*\]) 用另一图像与这一图像进行逻辑同或运算。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``erode`(*size*\[,*threshold*\[,*mask=None*\]\]) 从分割区域的边缘删除像素。 这一方法通过卷积图像上((size\*2)+1)x((size\*2)+1)像素的核来实现,如果相邻像素集的总和小于`threshold`,则对内核的中心像素进行归零。 若`threshold`未设定,这个方法的功能如标准腐蚀方法一样。若threshold设定,您就可以指定腐蚀的特定像素,例如:设置低于2个的像素周围阈值为2。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``dilate`(*size*\[,*threshold*\[,*mask=None*\]\]) 将像素添加到分割区域的边缘中。 这一方法通过卷积图像上((size\*2)+1)x((size\*2)+1)像素的核来实现,如果相邻像素集的总和大于`threshold`,则将内核的中心像素进行设置。 若`threshold`未设定,这个方法的功能如标准腐蚀方法一样。若threshold设定,您就可以指定腐蚀的特定像素,例如:设置低于2个的像素周围阈值为2。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``open`(*size*\[,*threshold*\[,*mask=None*\]\]) 按顺序对图像执行腐蚀和膨胀。有关更多信息,请参阅`image.erode()`和`image.dilate()`。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``close`(*size*\[,*threshold*\[,*mask=None*\]\]) 按顺序对图像执行膨胀和腐蚀。有关更多信息,请参阅`image.erode()`和`image.dilate()`。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``top_hat`(*size*\[,*threshold*\[,*mask=None*\]\]) 返回原图像和执行`image.open()`函数后图像的差异。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 不支持压缩图像和bayer图像。 `image.``black_hat`(*size*\[,*threshold*\[,*mask=None*\]\]) 返回原图像和执行`image.close()`函数后图像的差异。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 不支持压缩图像和bayer图像。 `image.``negate`() 非常快速地翻转(数字反转)图像中的所有像素值。对每个颜色通道的像素值进行数值转换。例: (255 - pixel). 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``replace`(*image*\[,*hmirror=False*\[,*vflip=False*\[,*mask=None*\]\]\]) `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 将`hmirror`设置为True以水平镜像替换图像。 将`vflip`设置为True以垂直翻转替换图像。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``add`(*image*\[,*mask=None*\]) 将两个图像彼此按像素相加。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``sub`(*image*\[,*reverse=False*\[,*mask=None*\]\]) 将两个图像彼此按像素相减。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 将`reverse`设置为True可以将减法操作从`this_image-image`反转为`image-this_image`。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``mul`(*image*\[,*invert=False*\[,*mask=None*\]\]) 将两个图像彼此按像素相乘。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 将`invert`设置为True可将乘法运算从`a*b`改为`1/((1/a)*(1/b))`。 特别是,这使图像变亮而不是使图像变暗(例如,乘法与刻录操作)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``div`(*image*\[,*invert=False*\[,*mask=None*\]\]) 将此图像除以另一个图像。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 将`invert`设置为True可将除法方向从`a/b`改为`b/a`。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``min`(*image*\[,*mask=None*\]) 在像素级 用此图像和另一个图像之间的最小像素值替换此图像中的像素。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 这个方法在OpenMV4上不可用. `image.``max`(*image*\[,*mask=None*\]) 在像素级 用此图像和另一个图像之间的最大像素值替换此图像中的像素。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``difference`(*image*\[,*mask=None*\]) 将两个图像彼此按像素取绝对值。例:对于每个颜色通道而言,将每个像素替换为ABS(this.pixel-image.pixel)。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``blend`(*image*\[,*alpha=128*\[,*mask=None*\]\]) 将另外一张图像`image`与这一图像融合。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 `alpha`控制要混合到这个图像中的其他图像的多少.`alpha`应该是0到256之间的整数值。接近零的值会将更多其他图像混合到此图像中,接近256则相反。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``histeq`(\[*adaptive=False*\[,*clip\_limit=-1*\[,*mask=None*\]\]\]) 在图像上运行直方图均衡算法。 直方图均衡化使图像中的对比度和亮度标准化。 如果`adaptive`传递为True,那么将在图像上运行自适应直方图均衡方法,这通常比非自适应直方图限定更好,但运行时间更长。 `clip_limit`提供了一种限制自适应直方图均衡的对比度的方法。 使用较小的值(例如10)可以生成良好的直方图均衡对比度受限图像。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``mean`(*size, \[threshold=False, \[offset=0, \[invert=False, \[mask=None\]\]\]\]\]*) 使用盒式滤波器的标准均值模糊滤波。 `Size` 是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `median`(*size, percentile=0.5, threshold=False, offset=0, invert=False, mask\]*) 在图像上运行中值滤波。在保留边缘的条件下,中值滤波是用来平滑表面的最佳滤波,但是运行速度极慢。 `Size` 是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 `percentile` 控制内核中所使用值的百分位数。默认情况下,每个像素都使用相邻的第五十个百分位数(中心)替换。使用最小滤波时,您可将此值设置为0,使用下四分位数滤波时设置为0.25,使用上四分位数滤波时设置为0.75,使用最大滤波时设置为1。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``mode`(*size*\[,*threshold=False*,*offset=0*,*invert=False*,*mask*\]) 在图像上运行众数滤波,用相邻像素的模式替换每个像素。这一方法在灰度图上运行效果良好。但由于这一操作的非线性特性,会在RGB图像边缘上产生许多伪像。 `Size` 是内核的大小。取1 (3x3 内核)、2 (5x5 内核)。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``midpoint`(*size*\[,*bias=0.5*,*threshold=False*,*offset=0*,*invert=False*,*mask*\]) 在图像上运行中点滤波。此滤波器找到图像中每个像素邻域的中点((max-min)/2)。 `size`是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 `bias`控制图像混合的最小/最大程度。0只适用于最小滤波,1仅用于最大滤波。您可以通过`bias`对图像进行最小/最大化过滤。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``morph`(*size*,*kernel*,*mul=Auto*,*add=0*) 通过过滤器内核对图像进行卷积。这允许您对图像执行通用卷积。 `size`将内核的大小控制为((size\*2)+1)x((size\*2)+1)像素。 `kernel`用来卷积图像的内核,可为一个元组或一个取值\[-128:127\]的列表。 `mul`是用以与卷积像素结果相乘的数字。若不设置,则默认一个值,该值将防止卷积输出中的缩放。 `add`是用来与每个像素卷积结果相加的数值。 `mul`可进行全局对比度调整,add可进行全局亮度调整。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``gaussian`(*size*\[,*unsharp=False*\[,*mul*\[,*add=0*\[,*threshold=False*\[,*offset=0*\[,*invert=False*\[,*mask=None*\]\]\]\]\]\]\]) 通过平滑高斯核对图像进行卷积。 `size`是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 如果`unsharp`设置为True,那么这种方法不会仅进行高斯滤波操作,而是执行非锐化掩模操作,从而提高边缘的图像清晰度。 `mul`是用以与卷积像素结果相乘的数字。若不设置,则默认一个值,该值将防止卷积输出中的缩放。 `add`是用来与每个像素卷积结果相加的数值。 `mul`可进行全局对比度调整,add可进行全局亮度调整。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `image.``laplacian`(*size*\[,*sharpen=False*\[,*mul*\[,*add=0*\[,*threshold=False*\[,*offset=0*\[,*invert=False*\[,*mask=None*\]\]\]\]\]\]\]) 通过边缘检测拉普拉斯核来对图像进行卷积。 `size`是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 如果`sharpen`被设置为True,那么这种方法将改为锐化图像,而不是仅输出未经过阈值处理的边缘检测图像。 增加内核大小然后增加图像清晰度。 `mul`是用以与卷积像素结果相乘的数字。若不设置,则默认一个值,该值将防止卷积输出中的缩放。 `add`是用来与每个像素卷积结果相加的数值。 `mul`可进行全局对比度调整,add可进行全局亮度调整。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``bilateral`(*size*\[,*color\_sigma=0.1*\[,*space\_sigma=1*\[,*threshold=False*\[,*offset=0*\[,*invert=False*\[,*mask=None*\]\]\]\]\]\]) 通过双边滤波器对图像进行卷积。 双边滤波器使图像平滑,同时保持图像中的边缘。 `size`是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 `color_sigma`控制使用双边滤波器匹配颜色的接近程度。增加此值可增加颜色模糊。 `space_sigma`控制像素在空间方面相互模糊的程度。增加此值可增加像素模糊。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递`threshold=True`参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数`offset`值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置`invert`以反转二进制图像的结果输出。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``cartoon`(*size*\[,*seed\_threshold=0.05*\[,*floating\_threshold=0.05*\[,*mask=None*\]\]\]) 漫游图像并使用flood-fills算法填充图像中的所有像素区域。 这通过使图像的所有区域中的颜色变平来有效地从图像中去除纹理。 为了获得最佳效果,图像应具有大量对比度,以使区域不会太容易相互渗透。 `seed_threshold`控制填充区域中的像素与原始起始像素的差异。 `floating_threshold`控制填充区域中的像素与任何相邻像素的差异。 `mask`是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的`image`大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``remove_shadows`(\[*image*\]) 从该图像中移除阴影。 如果当前图像没有“无阴影”版本出现,则此方法将尝试从图像中去除阴影,但没有真实无阴影的图像依据。 这种算法适用于去除平坦均匀背景中的阴影。 请注意,此方法需要多秒才能运行,并且仅适用于实时移除阴影,动态生成无阴影版本的图像。 该算法的未来版本将适用于更多的环境,但同样缓慢。 如果当前图像有“无阴影”版本出现,则此方法将使用“真实源”背景无阴影图像去除图像中的所有阴影以滤除阴影。 非阴影像素不会被过滤掉,因此您可以向场景中添加以前不存在的新对象,并且这些对象中的任何非阴影像素都将显示出来。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 只支持RGB565图像。 此方法在OpenMV Cam M4 上不可用。 `image.``chrominvar`() 从图像中删除照明效果,仅留下颜色渐变。比`image.illuminvar()`更快但受阴影影响。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 仅支持RGB565图像。 此方法在OpenMV Cam M4 上不可用。 `image.``illuminvar`() 从图像中删除照明效果,仅留下颜色渐变。比`image.chrominvar()`慢但不受阴影影响。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 仅支持RGB565图像。 此方法在OpenMV Cam M4 上不可用。 `image.``linpolar`(\[*reverse=False*\]) 图像从笛卡尔坐标到线性极坐标重新投影。 设置`reverse=True`可以在相反的方向重新投影。 线性极坐标重新投影将图像旋转转换为x平移。 不支持压缩图像。 此方法在OpenMV Cam M4 上不可用。 `image.``logpolar`(\[*reverse=False*\]) 图像从笛卡尔坐标到对数极坐标重新投影。 设置`reverse=True`可以在相反的方向重新投影。 对数极坐标重新投影将图像的旋转转换为x平移和缩放到y平移。 不支持压缩图像。 此方法在OpenMV Cam M4 上不可用。 `image.``lens_corr`(\[*strength=1.8*\[,*zoom=1.0*\]\]) 进行镜头畸变校正,以去除镜头造成的图像鱼眼效果。 `strength` 是一个浮点数,该值确定了对图像进行去鱼眼效果的程度。在默认情况下,首先试用取值1.8,然后调整这一数值使图像显示最佳效果。 `zoom` 是在对图像进行缩放的数值。默认值为 1.0 。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 `img.``rotation_corr`(\[*x\_rotation=0.0*\[,*y\_rotation=0.0*\[,*z\_rotation=0.0*\[,*x\_translation=0.0*\[,*y\_translation=0.0*\[,*zoom=1.0*\]\]\]\]\]\]) 通过执行帧缓冲区的3D旋转来纠正图像中的透视问题。 `x_rotation`是围绕x轴在帧缓冲器中旋转图像的度数(这使图像上下旋转)。 `y_rotation`是帧缓冲区中围绕y轴旋转图像的度数(即左右旋转图像)。 `z_rotation`是围绕z轴在帧缓冲器中旋转图像的度数(即,使图像旋转到适当位置)。 `x_translation`是旋转后将图像移动到左侧或右侧的单位数。因为这个变换是应用在三维空间的,单位不是像素… `y_translation`是旋转后将图像上移或下移的单位数。因为这个变换是应用在三维空间的,单位不是像素… `zoom`是通过图像缩放的量。默认情况下1.0。 返回图像对象,以便您可以使用`.`表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``get_similarity`(*image*) 返回一个“相似度”对象,描述两幅图像使用SSIM算法来比较两幅图像之间的8x8像素色块的相似度。 `image`可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``get_histogram`(\[*thresholds*\[,*invert=False*\[,*roi*\[,*bins*\[,*l\_bins*\[,*a\_bins*\[,*b\_bins*\]\]\]\]\]\]\]) 在`roi`的所有颜色通道上进行标准化直方图运算,并返回`histogram`对象。 请参考`histogram`对象以获取更多信息。您也可以使用`image.get_hist`或`image.histogram`来调用这一方法。如果传递`thresholds`列表,则直方图信息将仅从阈值列表中的像素计算得出。 `thresholds`必须是元组列表。`[(lo,hi),(lo,hi),...,(lo,hi)]`定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于RGB565图像,每个元组需要有六个值(l\_lo,l\_hi,a\_lo,a\_hi,b\_lo,b\_hi) - 分别是LAB L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 注解 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是`thresholds`的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的`工具->机器视觉->阈值编辑器`并从GUI窗口中拖动滑块来确定颜色阈值。 `invert`反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 除非您需要使用颜色统计信息进行高级操作,否则只需使用`image.get\_statistics()` 方法代替此方法查看图像中的像素区域。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `bins`和其他bin是用于直方图通道的箱数。对于灰度图像,使用`bins`, 对于RGB565图像,使用其他每个通道。每个通道的bin计数必须大于2。 另外,将bin计数设置为大于每个通道的唯一像素值的数量是没有意义的。 默认情况下,直方图将具有每个通道的最大bin数。 不支持压缩图像和bayer图像。 `image.``get_statistics`(\[*thresholds*\[,*invert=False*\[,*roi*\[,*bins*\[,*l\_bins*\[,*a\_bins*\[,*b\_bins*\]\]\]\]\]\]\]) 计算`roi`中每个颜色通道的平均值、中值、众值、标准偏差、最小值、最大值、下四分值和上四分值,并返回一个数据对象。 请参见`statistics`对象以获取更多信息。您也可以使用`image.get_stats`或`image.statistics`来调用这一方法。 如果传递`thresholds`列表,则直方图信息将仅从阈值列表中的像素计算得出。 `thresholds`必须是元组列表。`[(lo,hi),(lo,hi),...,(lo,hi)]`定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于RGB565图像,每个元组需要有六个值(l\_lo,l\_hi,a\_lo,a\_hi,b\_lo,b\_hi) - 分别是LAB L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 注解 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是`thresholds`的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的`工具->机器视觉->阈值编辑器`并从GUI窗口中拖动滑块来确定颜色阈值。 `invert`反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 您可以在需要获取图像中一个像素区域信息时使用这一方法。例如:若您想用帧差法来检测运动时, 您需要使用这一方法来确定图像颜色通道的变化,从而触发运动检测阈值。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `bins`和其他bin是用于直方图通道的箱数。对于灰度图像,使用`bins`, 对于RGB565图像,使用其他每个通道。每个通道的bin计数必须大于2。 另外,将bin计数设置为大于每个通道的唯一像素值的数量是没有意义的。 默认情况下,直方图将具有每个通道的最大bin数。 不支持压缩图像和bayer图像。 `image.``get_regression`(*thresholds*\[,*invert=False*\[,*roi*\[,*x\_stride=2*\[,*y\_stride=1*\[,*area\_threshold=10*\[,*pixels\_threshold=10*\[,*robust=False*\]\]\]\]\]\]\]) 对图像所有阈值像素进行线性回归计算。这一计算通过最小二乘法进行,通常速度较快,但不能处理任何异常值。 若`robust`为True,则使用Theil-Sen线性回归算法,它计算图像中所有阈值像素的斜率的中位数。 若在阈值处理后有太多像素,即使在80x60的图像上,这个O(N^2)操作也可能将您的FPS降到5帧以下。 但是,只要阈值转换后的像素数量较少,即使在高达30%的阈值像素是异常值的情况下也依然有效,鲁棒性好。 这一方法返回的是一个`image.line`对象。如何轻松运用直线对象, `thresholds`必须是元组列表。`[(lo,hi),(lo,hi),...,(lo,hi)]`定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于RGB565图像,每个元组需要有六个值(l\_lo,l\_hi,a\_lo,a\_hi,b\_lo,b\_hi) - 分别是LAB L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 注解 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是`thresholds`的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的`工具->机器视觉->阈值编辑器`并从GUI窗口中拖动滑块来确定颜色阈值。 `invert`反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `x_stride`是调用函数时要跳过的x像素数。 `y_stride`是调用函数时要跳过的y像素数。 如果回归后的边界框区域小于`area_threshold`,则返回None。 如果回归后的像素数小于`pixel_threshold`,则返回None。 不支持压缩图像和bayer图像。 `image.``find_blobs`(*thresholds*\[,*invert=False*\[,*roi*\[,*x\_stride=2*\[,*y\_stride=1*\[,*area\_threshold=10*\[,*pixels\_threshold=10*\[,*merge=False*\[,*margin=0*\[,*threshold\_cb=None*\[,*merge\_cb=None*\]\]\]\]\]\]\]\]\]\]) 查找图像中所有色块,并返回一个包括每个色块的色块对象的列表。请观察`image.blob`对象以获取更多信息。 `thresholds`必须是元组列表。`[(lo,hi),(lo,hi),...,(lo,hi)]`定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于RGB565图像,每个元组需要有六个值(l\_lo,l\_hi,a\_lo,a\_hi,b\_lo,b\_hi) - 分别是LAB L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 注解 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是`thresholds`的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的`工具->机器视觉->阈值编辑器`并从GUI窗口中拖动滑块来确定颜色阈值。 `invert`反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `x_stride`是查找某色块时需要跳过的x像素的数量。找到色块后,直线填充算法将精确像素。 若已知色块较大,可增加`x_stride`来提高查找色块的速度。 `y_stride`是查找某色块时需要跳过的y像素的数量。找到色块后,直线填充算法将精确像素。 若已知色块较大,可增加`y_stride`来提高查找色块的速度。 若一个色块的边界框区域小于`area_threshold`,则会被过滤掉。 若一个色块的像素数小于`pixel_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以防止色块合并。 不支持压缩图像和bayer图像。 `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`控制所监测的直线的合并。 直线角度为`theta_margin`的部分和直线p值为`rho_margin`的部分合并。 `rho_margin`控制所监测的直线的合并。 直线角度为`theta_margin`的部分和直线p值为`rho_margin`的部分合并。 该方法通过在图像上运行索贝尔滤波器,并利用该滤波器的幅值和梯度响应来进行霍夫变换。 无需对图像进行任何预处理。但是,清理图像过滤器可得到更为稳定的结果。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_line_segments`(\[*roi*\[,*merge\_distance=0*\[,*max\_theta\_difference=15*\]\]\]) 使用霍夫转换来查找图像中的线段。返回一个 `image.line`对象的列表。 `roi`是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,`ROI`即图像矩形。操作范围仅限于roi区域内的像素。 `merge_distance`指定两条线段之间的可以相互分开而不被合并的最大像素数。 `max_theta_difference`是上面`merge_distancede`要合并的的两个线段的最大角度差值。 此方法使用LSD库来查找图像中的线段。这有点慢,但是非常准确,线段不会跳跃。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `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*\]\]\]\]\]\]\]\]\]\]) 使用霍夫变换在图像中查找圆。返回一个`image.circle`对象列表(见上)。 `roi`是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,`ROI`即图像矩形。操作范围仅限于roi区域内的像素。 `x_stride`是霍夫变换时需要跳过的x像素的数量。若已知圆较大,可增加`x_stride`。 `y_stride`是霍夫变换时需要跳过的y像素的数量。若已知圆较大,可增加`y_stride`。 `threshold`控制从霍夫变换中监测到的圆。只返回大于或等于`threshold`的圆。 应用程序的正确的`threshold`值取决于图像。注意:一个圆的大小(magnitude)是组成圆所有索贝尔滤波像素大小的总和。 `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`controls the minimum circle radius detected. Increase this to speed up the algorithm. Defaults to 2. `r_max`controls the maximum circle radius detected. Decrease this to speed up the algorithm. Defaults to min(roi.w/2, roi.h/2). `r_step`controls how to step the radius detection by. Defaults to 2. 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_rects`(\[*roi=Auto*,*threshold=10000*\]) 使用用于查找AprilTAg的相同的quad detection算法来查找图像中的矩形。 最适用与背景形成鲜明对比的矩形。AprilTag的quad detection可以处理任意缩放/旋转/剪切的矩形。 返回一个`image.rect`对象的列表。 `roi` 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定, ROI即图像矩形。操作范围仅限于`roi`区域内的像素。 边界大小(通过在矩形边缘上的所有像素上滑动索贝尔算子并相加该值)小于 `threshold`的矩形会从返回列表中过滤出来。`threshold`的正确值取决于您的应用程序/场景。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_qrcodes`(\[*roi*\]) 查找`roi`内的所有二维码并返回一个`image.qrcode`对象的列表。 请参考`image.qrcode`对象以获取更多信息。 为使这一方法成功运行,图像上二维码需比较平展。通过使用`sensor.set_windowing` 函数在镜头中心放大、`image.lens_corr` 函数来消解镜头的桶形畸变或通过更换视野较为狭小的镜头, 您可得到一个不受镜头畸变影响的更为平展的二维码。有些机器视觉镜头不会造成桶形失真,但是其造价远比OpenMV提供的标准镜片高,这种镜头为无畸变镜头。 `roi` 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即整幅图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_apriltags`(\[*roi*\[,*families=image.TAG36H11*\[,*fx*\[,*fy*\[,*cx*\[,*cy*\]\]\]\]\]\]) 查找`roi`内的所有AprilTag, 并返回一个`image.apriltag`对象的列表。请参考 `image.apriltag`对象以获取更多信息。 与二维码相比,AprilTags可在更远距离、较差光线和更扭曲的图像环境下被检测到。 AprilTags可应对所有种类的图像失真问题,而二维码并不能。也就是说,AprilTags只能将数字ID编码作为其有效载荷。 AprilTags也可用于本地化。每个`image.apriltag`对象都从摄像机返回其三维位置信息和旋转角度。 位置信息由`fx`、`fy`、`cx`和`cy`决定,分别为X和Y方向上图像的焦距和中心点。 注解 使用OpenMV IDE内置的标签生成器工具来创建AprilTags。标签生成器可创建可打印的8.5“x11”AprilTags。 `roi` 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即整幅图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `families`是要解码的标签家族的位掩码。是一个逻辑或: > * `image.TAG16H5` > * `image.TAG25H7` > * `image.TAG25H9` > * `image.TAG36H10` > * `image.TAG36H11` > * `image.ARTOOLKIT` 默认设置为最好用的 `image.TAG36H11`标签家族。注意:每启用一个标签家族,`find_apriltags`的速度都会略有放慢。 `fx`是以像素为单位的相机x方向的焦距。标准OpenMV Cam的值为(2.8 / 3.984) \* 656, 该值通过毫米计的焦距值除以X方向上感光元件的长度,再乘以X方向上感光元件的像素数量得来(对OV7725感光元件而言)。 `fy`是以像素为单位的相机y方向的焦距。标准OpenMV Cam的值为(2.8 / 2.952) \* 488, 该值通过毫米计的焦距值除以Y方向上感光元件的长度,再乘以Y方向上感光元件的像素数量得来(对OV7725感光元件而言)。 `cx`是图像的中心,即`image.width()/2`,而非`roi.w()/2`。 `cy`是图像的中心,即`image.height()/2`,而非`roi.h()/2`。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_datamatrices`(\[*roi*\[,*effort=200*\]\]) 查找`roi`内的所有数据矩阵并返回一个`image.datamatrix`对象的列表。 请参考`image.datamatrix`对象以获取更多信息。 为使这一方法成功运行,图像上矩形码需比较平展。通过使用`sensor.set_windowing`函数在镜头中心放大、`image.lens_corr` 函数来消解镜头的桶形畸变或通过更换视野较为狭小的镜头,您可得到一个不受镜头畸变影响的更为平展的矩形码。 有些机器视觉镜头不会造成桶形失真,但是其造价远比OpenMV提供的标准镜片高,这种镜头是无畸变镜头。 `roi`是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即整幅图像的图像矩形。操作范围仅限于`roi`区域内的像素。 `effort`控制用于查找矩形码匹配的时间。默认值为200应该适用于所有用例。 但是您也可能以帧速率为代价增加检测,或以检测为代价增加帧速率。 注意:若`effort`设置在约160以下,您就无法进行任何检测;相反,您可将其设置为您需要的任何高值,但是若设置值高于240,检测率将不会继续随之提高。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_barcodes`(\[*roi*\]) 查找`roi`内所有一维条形码并返回一个`image.barcode`对象列表。 请参考 `image.barcode`对象以获取更多信息。 为了获得最佳效果,请使用长640、宽40/80/160窗口。垂直程度越低,运行速度越快。由于条形码是线性一维图像,所以只需在一个方向上有较高分辨率, 而在另一方向上只需较低分辨率。注意:该函数进行水平和垂直扫描,所以您可使用宽40/80/160、长480的窗口。 最后,请一定调整镜头,这样条形码会定位在焦距产生最清晰图像的地方。模糊条码无法被解码。 该函数支持所有一维条形码: > * `image.EAN2` > * `image.EAN5` > * `image.EAN8` > * `image.UPCE` > * `image.ISBN10` > * `image.UPCA` > * `image.EAN13` > * `image.ISBN13` > * `image.I25` > * `image.DATABAR` > * `image.DATABAR_EXP` > * `image.CODABAR` > * `image.CODE39` > * `image.PDF417` > * `image.CODE93` > * `image.CODE128` `roi`是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即整幅图像的图像矩形。操作范围仅限于`roi`区域内的像素。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 `image.``find_displacement`(*template*\[,*roi*\[,*template\_roi*\[,*logpolar=False*\]\]\]) 从模板中查找此图像的变换偏移量。 这种方法可以用来做光流。 此方法返回一个`image.displacement`对象,其中包含使用相位相关的位移计算结果。 `roi`是需要处理的矩形区域(x,y,w,h)。如果未指定,则等于图像矩形。 `template_roi`是需要处理的矩形区域(x,y,w,h)。如果未指定,则等于图像矩形。 `roi`和`template`roi必须具有相同的w/h,但x/y可以为图像任意位置。您可以在较大图像上滑动较小的rois以获得光流渐变图像. `image.find_displacement`通常计算两个图像之间的x/y平移。但是,如果您设置`logpolar=True`, 它将会在两个图像之间找到旋转和缩放比例的变化。相同的`image.displacement`对象结果两种可能的反馈。 不支持压缩图像和bayer图像。 注解 请在长宽一致的图像(例如``sensor.B64X64``)上使用此方法。 此方法在OpenMV Cam M4 上不可用。 `image.``find_number`(*roi*) 运行在MINST数据集上训练的LENET-6 CNN(卷积神经网络),以检测位于图像上任何位置的28x28 ROI中的数字。 返回一个包含整数和浮点数的元组,表示检测到的数字(0-9)和检测的置信度(0-1)。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 仅支持灰度图像。 注解 这种方法是实验性的。如果未来运行使用Caffe在PC上训练的任何CNN,这种方法可能会删除。 最新3.0.0版本固件已删除此函数。 此方法在OpenMV Cam M4 上不可用。 `image.``classify_object`(*roi*) 在图像的ROI上运行CIFAR-10 CNN,以检测飞机,汽车,鸟类,猫,鹿,狗,青蛙,马,船和卡车。 此方法在内部自动将图像缩放到32x32以馈送到CNN。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 仅支持RGB565图像。 注解 这种方法是实验性的。如果未来运行使用Caffe在PC上训练的任何CNN,这种方法可能会删除。 `image.``find_template`(*template*,*threshold*\[,*roi*\[,*step=2*\[,*search=image.SEARCH\_EX*\]\]\]) 尝试使用归一化互相关(NCC)算法在图像中找到第一个模板匹配的位置。返回匹配位置的边界框元组(x, y, w, h),否则返回None。 `template`是一个与这个图像对象相匹配的小图像对象。注意:两图像须都为灰度图。 `threshold`是浮点数(0.0-1.0),其中较小的值在提高检测速率同时增加误报率。相反,较高的值会降低检测速率,同时降低误报率。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `step`是查找模板时需要跳过的像素数量。跳过像素可大大提高算法运行的速度。该方法只适用于SERACH\_EX模式下的算法。 `search`可为`image.SEARCH_DS`or`image.SEARCH_EX`.`image.SEARCH_DS`搜索模板所用算法较`image.SEARCH_EX`更快,但若模板位于图像边缘周围,可能无法成功搜索。`image.SEARCH_EX` 可对图像进行较为详尽的搜索,但其运行速度远低于`image.SEARCH_DS`。 仅支持灰度图像。 `image.``find_features`(*cascade*\[,*threshold=0.5*\[,*scale=1.5*\[,*roi*\]\]\]) 这个方法搜索与Haar Cascade匹配的所有区域的图像,并返回一个关于这些特征的边界框矩形元组(x,y,w,h)的列表。若未发现任何特征,则返回一个空白列表。 `cascade`是一个Haar Cascade对象。详细信息请查看`image.HaarCascade()`。 `threshold`是浮点数(0.0-1.0),其中较小的值在提高检测速率同时增加误报率。相反,较高的值会降低检测速率,同时降低误报率。 `scale`是一个必须大于1.0的浮点数。较高的比例因子运行更快,但其图像匹配相应较差。理想值介于1.35-1.5之间。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `image.``find_eye`(*roi*) 在眼睛周围的感兴趣区域(x, y, w, h)查找瞳孔。返回一个包含图像中瞳孔(x,y)位置的元组。若未发现瞳孔,则返回(0,0)。 使用这一函数之前,需首先使用`image.find_features()`和Haar算子`frontalface` 来搜索某人面部。 然后使用`image.find_features`和Haar算子`find_eye`在面部搜索眼睛。 最后,在调用`image.find_features`函数后返回的每个眼睛ROI上调用这一方法,以得到瞳孔的坐标。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 仅支持灰度图像。 `image.``find_lbp`(*roi*) 从ROI元组(x, y, w, h)中提取LBP(局部二值模式)键点。您可以使用`image.match_descriptor`函数来比较两组关键点,以获取匹配距离。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 仅支持灰度图像。 `image.``find_keypoints`(\[*roi*\[,*threshold=20*\[,*normalized=False*\[,*scale\_factor=1.5*\[,*max\_keypoints=100*\[,*corner\_detector=image.CORNER\_AGAST*\]\]\]\]\]\]) 从ROI元组(x, y, w, h)中提取ORB键点。您可以使用`image.match_descriptor`函数来比较两组关键点,以获取匹配区域。若未发现关键点,则返回None。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 `threshold`是控制提取的数量的数字(取值0-255)。对于默认的AGAST角点检测器,该值应在20左右。 对于FAST角点检测器,该值约为60-80。阈值越低,您提取的角点越多。 `normalized`是布尔值。若为True,在多分辨率下关闭提取键点。 若您不关心处理扩展问题,且希望算法运行更快,就将之设置为True。 `scale_factor`是一个必须大于1.0的浮点数。较高的比例因子运行更快,但其图像匹配相应较差。理想值介于1.35-1.5之间。 `max_keypoints`是一个键点对象所能容纳的键点最大数量。若键点对象过大导致内存问题,请降低该值。 `corner_detector`是从图像中提取键点所使用的角点检测器算法。 可为`image.CORNER_FAST`。FAST角点检测器运行速度更快,但其准确度较低。 仅支持灰度图像。 `image.``find_edges`(*edge\_type*\[,*threshold*\]) 将图像变为黑白,仅将边缘保留为白色像素。 > * image.EDGE\_SIMPLE - 简单的阈值高通滤波算法 > * image.EDGE\_CANNY - Canny边缘检测算法 `threshold`是一个包含一个低阈值和一个高阈值的二值元组。您可以通过调整该值来控制边缘质量。 默认为 (100, 200)。 仅支持灰度图像。 `find_hog`(\[*roi*\[,*size=8*\]\]) 用HOG(定向梯度直方图)线替换ROI中的像素。 `roi`是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于`roi`区域内的像素。 仅支持灰度图像。 此方法在OpenMV Cam M4 上不可用。 ## 常量 `image.``SEARCH_EX` 详尽的模板匹配搜索。 `image.``SEARCH_DS` 更快的模板匹配搜索。 `image.``EDGE_CANNY` 使用Canny边缘检测算法对图像进行边缘检测。 `image.``EDGE_SIMPLE` 使用阈值高通滤波算法对图像进行边缘检测。 `image.``CORNER_FAST` 用于ORB键点的高速低准确率角点检测算法 `image.``CORNER_AGAST` 用于ORB键点的低速高准确率算法。 `image.``TAG16H5` TAG1H5标签群的位掩码枚举。用于AprilTags。 `image.``TAG25H7` TAG25H7标签群的位掩码枚举。用于AprilTags。 `image.``TAG25H9` TAG25H9标签群的位掩码枚举。用于AprilTags。 `image.``TAG36H10` TAG36H10标签群的位掩码枚举。用于AprilTags。 `image.``TAG36H11` TAG36H11标签群的位掩码枚举。用于AprilTags。 `image.``ARTOOLKIT` ARTOOLKIT标签群的位掩码枚举。用于AprilTags。 `image.``EAN2` EAN2条形码类型枚举。 `image.``EAN5` EAN5条形码类型枚举。 `image.``EAN8` EAN8条形码类型枚举。 `image.``UPCE` UPCE条形码类型枚举。 `image.``ISBN10` ISBN10条形码类型枚举。 `image.``UPCA` UPCA条形码类型枚举。 `image.``EAN13` EAN13条形码类型枚举。 `image.``ISBN13` ISBN13条形码类型枚举。 `image.``I25` I25条形码类型枚举。 `image.``DATABAR` DATABAR条形码类型枚举。 `image.``DATABAR_EXP` DATABAR\_EXP条形码类型枚举。 `image.``CODABAR` CODABAR条形码类型枚举。 `image.``CODE39` CODE39条形码类型枚举。 `image.``PDF417` PDF417条形码类型枚举(目前尚不能运行)。 `image.``CODE93` CODE93条形码类型枚举。 `image.``CODE128` CODE128条形码类型枚举。