:mod:`image` --- 机器视觉 =============================== .. module:: image :synopsis: machine vision ``image`` 模块用于计算机视觉技术的应用。 函数 --------- .. function:: image.binary_to_grayscale(binary_image_value) 返回二进制值(0-1)对应的灰度值(0-255)。 .. function:: image.binary_to_rgb(binary_image_value) 返回二进制值(0-1)对应的RGB888格式的元组(r, g, b)。 .. function:: image.binary_to_lab(binary_image_value) 返回二进制值(0-1)对应的LAB格式的元组(l, a, b)。 L的范围为0到100, A和B的范围为-128到128。 .. function:: image.binary_to_yuv(binary_image_value) 返回二进制值(0-1)对应的YUV格式的元组(y, u, v)。 Y的范围为0到255, U和V范围为-128到128。 .. function:: image.grayscale_to_binary(grayscale_value) 返回灰度值(0-255)对应的二进制值(0-1)。 .. function:: image.grayscale_to_rgb(grayscale_value) 返回灰度值(0-255)对应的RGB888格式的元组(r, g, b)。 .. note:: OpenMV Cam固件使用RGB565->RGB888进程进行转换,因此此方法不会像纯RGB888系统那样返回准确的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.grayscale_to_lab(grayscale_value) 返回灰度值(0-255)对应的LAB格式的元组(l, a, b)。 L的范围为0到100, A和B的范围为-128到128。 .. note:: OpenMV Cam固件使用RGB565->LAB进程进行转换,因此此方法不会像纯LAB系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.grayscale_to_yuv(grayscale_value) 返回灰度值(0-255)对应的YUV格式的元组(y, u, v)。 Y的范围为0到255, U和V范围为-128到128。 .. note:: OpenMV Cam固件使用RGB565->YUV进程进行转换,因此此方法不会像纯YUV系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.rgb_to_binary(rgb_tuple) 返回RGB888格式的元组(r, g, b)对应的中心范围阈值二进制值(0-1)。 .. note:: OpenMV Cam固件使用RGB888->RGB565进程进行转换,因此此方法不会像纯RGB888系统那样返回准确的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.rgb_to_grayscale(rgb_tuple) 返回RGB888格式的元组(r, g, b)对应的灰度值(0-255)。 .. note:: OpenMV Cam固件使用RGB888->RGB565进程进行转换,因此此方法不会像纯RGB888系统那样返回准确的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.rgb_to_lab(rgb_tuple) 返回RGB888格式的元组(r, g, b)对应的LAB格式的元组(l, a, b)。 L的范围为0到100, A和B的范围为-128到128。 .. note:: OpenMV Cam固件使用RGB888->RGB565进程进行转换,因此此方法不会像纯RGB888系统那样返回准确的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.rgb_to_yuv(rgb_tuple) 返回RGB888格式的元组(r, g, b)对应的YUV格式的元组(y, u, v)。 Y的范围为0到255, U和V范围为-128到128。 .. note:: OpenMV Cam固件使用RGB888->RGB565进程进行转换,因此此方法不会像纯RGB888系统那样返回准确的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.lab_to_binary(lab_tuple) 返回LAB格式的元组(l, a, b)对应的中心范围阈值二进制值(0-1)。 .. note:: OpenMV Cam固件使用LAB->RGB565进程进行转换,因此此方法不会像纯LAB系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.lab_to_grayscale(lab_tuple) 返回LAB格式的元组(l, a, b)对应的灰度值(0-255)。 .. note:: OpenMV Cam固件使用LAB->RGB565进程进行转换,因此此方法不会像纯LAB系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.lab_to_rgb(lab_tuple) 返回LAB格式的元组 ``lab_tuple`` (l, a, b)对应的RGB888格式的元组(r, g, b)。 .. note:: OpenMV Cam固件使用LAB->RGB565进程进行转换,因此此方法不会像纯LAB系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.lab_to_yuv(lab_tuple) 返回LAB格式的元组(l, a, b)对应的YUV格式的元组(y, u, v)。 Y的范围为0到255, U和V范围为-128到128。 .. note:: OpenMV Cam固件使用LAB->RGB565进程进行转换,因此此方法不会像纯LAB系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.yuv_to_binary(yuv_tuple) 返回YUV格式的元组(y, u, v)对应的中心范围阈值二进制值(0-1)。 .. note:: OpenMV Cam固件使用YUV->RGB565进程进行转换,因此此方法不会像纯YUV系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.yuv_to_grayscale(yuv_tuple) 返回YUV格式的元组(y, u, v)对应的灰度值(0-255)。 .. note:: OpenMV Cam固件使用YUV->RGB565进程进行转换,因此此方法不会像纯YUV系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.yuv_to_rgb(lab_tuple) 返回YUV格式的元组(y, u, v)对应的RGB888格式的元组(r, g, b)。 .. note:: OpenMV Cam固件使用YUV->RGB565进程进行转换,因此此方法不会像纯YUV系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.yuv_to_lab(yuv_tuple) 返回YUV格式的元组(y, u, v)对应的LAB格式的元组(l, a, b)。 L的范围为0到100, A和B的范围为-128到128。 .. note:: OpenMV Cam固件使用YUV->RGB565进程进行转换,因此此方法不会像纯YUV系统那样返回确切的值。 但是,图像库在内部这样工作是正确的。 .. function:: image.load_descriptor(path) 从磁盘上加载一个描述符对象(descriptor object). ``path`` 是描述符文件保存的路径。 .. function:: image.save_descriptor(path, descriptor) 保存描述符对象 ``descriptor`` 到磁盘。 ``path`` 是描述符文件保存的路径。 .. function:: image.match_descriptor(descritor0, descriptor1, [threshold=70, [filter_outliers=False]]) 对于LBP描述符来说,这个函数返回的是一个体现两个描述符之间区别的整数。这一距离测度尤为必要。这个距离是对相似度的一个度量。这个测度值越接近0,LBPF特征点匹配得就越好。 对于ORB描述符来说,这个函数返回的是kptmatch对象。见上。 ``threshold`` 是用来为ORB键点过滤不明确匹配服务的。 一个较低的 ``threshold`` 值将紧扣关键点匹配算法。 ``threshold`` 值位于0-100 (int)。默认值为70。 ``filter_outliers`` 是用来为ORB键点过滤异常值服务的。 特征点允许用户提高 ``threshold`` 值。默认设置为False。 HaarCascade 类 -- 特征描述符 ======================================= Haar Cascade特征描述符用于 `image.find_features()` 方法。它没有供用户调用的方法。 .. class:: image.HaarCascade(path, [stages=Auto]) 从一个Haar Cascade二进制文件(适合OpenMV Cam的格式)加载一个Haar Cascade。 如果您传递“frontalface”字符串 而非一条路径,这个构造函数将会把一个内置的正脸Haar Cascade载入内存。 此外,您也可以通过“eye”来把Haar Cascade载入内存。 最后,这个方法会返回载入的Haar Cascade对象,用来使用 `image.find_features()` 。 ``stages`` 默认值为Haar Cascade中的阶段数。然而,您可以指定一个较低的数值来加速运行特征检测器,当然这会带来较高的误报率。 .. note:: 您可以制作自己的Haar Cascades 来配合您的OpenMV Cam 使用。 首先,使用谷歌搜索“ Haar Cascade”,检测是否有人已经为您想要检测的对象制作了OpenCV Haar Cascade。 如果没有,那您需要自己动手制作(工作量巨大)。 关于如何制作自己的Haar Cascade,`见此 `_ 关于如何把OpenCV Haar Cascades转化成您的OpenMV Cam可以读取的模式, `见此script `_ 问:Haar Cascade 是什么? 答:Haar Cascade是一系列用来确定一个对象是否存在于图像中的对比检查。 这一系列的对比检查分成了多个阶段,后一阶段的运行以先前阶段的完成为前提。 对比检查并不复杂,不过是像检查图像的中心垂直是否比边缘更轻微之类的过程。 大范围的检查在前期阶段首先进行,在后期进行更多更小的区域检查。 问:Haar Cascades 是如何制作而成的? 答:Haar Cascades通过标有正负的图像对发生器算法进行训练。 比如,用数百张含有猫(已被标记为内含猫)的图片和数百张不含有猫形物的图片(已作出不同标记)来训练这个生成算法。 这个生成算法最后会产生一个用来检测猫的Haar Cascades。 Histogram 类 -- 直方图对象 =================================== 直方图对象是由 `image.get_histogram` 返回。 灰度直方图有一个包含多个二进制的通道。 所有二进制都进行标准化,使其总和为1。 RGB565有三个包含多个二进制的通道。所有二进制都进行标准化,使其总和为1。 .. class:: image.histogram() 请调用 `image.get_histogram()` 函数来创建此对象。 .. method:: histogram.bins() 返回灰度直方图的浮点数列表。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: histogram.l_bins() 返回RGB565直方图LAB的L通道的浮点数列表。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: histogram.a_bins() 返回RGB565直方图LAB的A通道的浮点数列表。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: histogram.b_bins() 返回RGB565直方图LAB的B通道的浮点数列表。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: histogram.get_percentile(percentile) 计算直方图频道的CDF,返回一个传递 ``percentile`` (0.0 - 1.0) (浮点数)中的直方图的值。 因此,若您传入0.1,该方法会告知您,当累加入累加器时,哪一个二进制会使累加器跨过0.1。 在没有异常效用破坏您的自适应色跟踪结果时,这对于确定颜色分布的最小值(0.1)和max(0.9)甚是有效。 .. method:: histogram.get_threshold() 使用Otsu's 方法计算最佳阈值,将直方图分的每个通道为两半。 该方法返回一个 `image.threshold` 对象。 这个方法对确定最佳的 `image.binary()` 阈值特别有用。 .. method:: histogram.get_statistics() 计算直方图中每个颜色通道的平均值、中值、众值、标准差、最小值、最大值、下四分值和上四分值, 并返回一个statistics对象。 您也可以使用 ``histogram.statistics()`` 和 ``histogram.get_stats()`` 作为这个方法的别名。 Percentile 类 -- 百分比值对象 ===================================== 百分比值对象由 `histogram.get_percentile` 返回。 灰度百分比值有一个通道。不使用 ``l_*`` 、 ``a_*`` 或 ``b_*`` 方法。 RGB565百分比值有三个通道。使用 ``l_*`` 、 ``a_*`` 和 ``b_*`` 方法。 .. class:: image.percentile() 请调用 `histogram.get_percentile()` 函数来创建此对象。 .. method:: percentile.value() 返回灰度百分比值(取值区间为0-255)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: percentile.l_value() 返回RGB565 LAB 的L通道的百分比值(取值区间为0-100)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: percentile.a_value() 返回RGB565 LAB 的A通道的百分比值(取值区间为-128-127)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: percentile.b_value() 返回RGB565 LAB 的B通道的百分比值(取值区间为-128-127)。 您也可以通过索引 ``[2]`` 取得这个值。 Threhsold 类 -- 阈值对象 =================================== 阈值对象由 ``histogram.get_threshold`` 返回。 灰度图像有一个通道。没有 ``l_*``, ``a_*``, 和 ``b_*`` 方法. RGB565 阈值有三个通道。使用 ``l_*``, ``a_*``, 和 ``b_*`` 方法。 .. class:: image.threshold() 请调用 `histogram.get_threshold()` 函数来创建此对象。 .. method:: threhsold.value() 返回灰度图的阈值 (between 0 and 255)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: threhsold.l_value() 返回RGB565图LAB中的L阈值 (between 0 and 100). 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: threhsold.a_value() 返回RGB565图LAB中的A阈值 (between -128 and 127). 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: threhsold.b_value() 返回RGB565图LAB中的B阈值 (between -128 and 127). 您也可以通过索引 ``[2]`` 取得这个值。 class Statistics -- 统计数据对象 ===================================== 统计数据对象是由 ``histogram.get_statistics``  或 ``image.get_statistics`` 返回的。 灰度统计数据有一个通道,使用非 ``l_*`` 、 ``a_*`` 或 ``b_*`` 方法。 RGB565百分比值有三个通道。使用 ``l_*`` 、 ``a_*`` 和 ``b_*`` 方法。 .. class:: image.statistics() 请调用 `histogram.get_statistics()` 或 `image.get_statistics()` 函数来创建此对象。 .. method:: statistics.mean() 返回灰度均值(0-255) (int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: statistics.median() 返回灰度中值(0-255) (int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: statistics.mode() 返回灰度众值(0-255) (int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: statistics.stdev() 返回灰度标准差(0-255) (int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: statistics.min() 返回灰度最小值(0-255) (int)。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: statistics.max() 返回灰度最大值(0-255) (int)。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: statistics.lq() 返回灰度下四分值(0-255) (int)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: statistics.uq() 返回灰度上四分值(0-255) (int)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: statistics.l_mean() 返回RGB5656 LAB 中L的均值(0-255) (int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: statistics.l_median() 返回RGB5656 LAB 中L的中值(0-255) (int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: statistics.l_mode() 返回RGB5656 LAB 中L的众值(0-255) (int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: statistics.l_stdev() 返回RGB5656 LAB 中L的标准偏差值(0-255) (int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: statistics.l_min() 返回RGB5656 LAB 中L的最小值(0-255) (int)。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: statistics.l_max() 返回RGB5656 LAB 中L的最大值(0-255) (int)。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: statistics.l_lq() 返回RGB5656 LAB 中L的下四分值(0-255) (int)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: statistics.l_uq() 返回RGB5656 LAB 中L的上四分值(0-255) (int)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: statistics.a_mean() 返回RGB5656 LAB 中A的均值(0-255) (int)。 您也可以通过索引 ``[8]`` 取得这个值。 .. method:: statistics.a_median() 返回RGB5656 LAB 中A的中值(0-255) (int)。 您也可以通过索引 ``[9]`` 取得这个值。 .. method:: statistics.a_mode() 返回RGB5656 LAB 中A的众值(0-255) (int)。 您也可以通过索引 ``[10]`` 取得这个值。 .. method:: statistics.a_stdev() 返回RGB5656 LAB 中A的标准偏差值(0-255) (int)。 您也可以通过索引 ``[11]`` 取得这个值。 .. method:: statistics.a_min() 返回RGB5656 LAB 中A的最小值(0-255) (int)。 您也可以通过索引 ``[12]`` 取得这个值。 .. method:: statistics.a_max() 返回RGB5656 LAB 中A的最大值(0-255) (int)。 您也可以通过索引 ``[13]`` 取得这个值。 .. method:: statistics.a_lq() 返回RGB5656 LAB 中A的下四分值(0-255) (int)。 您也可以通过索引 ``[14]`` 取得这个值。 .. method:: statistics.a_uq() 返回RGB5656 LAB 中A的上四分值(0-255) (int)。 您也可以通过索引 ``[15]`` 取得这个值。 .. method:: statistics.b_mean() 返回RGB5656 LAB 中B的均值(0-255) (int)。 您也可以通过索引 ``[16]`` 取得这个值。 .. method:: statistics.b_median() 返回RGB5656 LAB 中B的中值(0-255) (int)。 您也可以通过索引 ``[17]`` 取得这个值。 .. method:: statistics.b_mode() 返回RGB5656 LAB 中B的众值(0-255) (int)。 您也可以通过索引 ``[18]`` 取得这个值。 .. method:: statistics.b_stdev() 返回RGB5656 LAB 中B的标准差值(0-255) (int)。 您也可以通过索引 ``[19]`` 取得这个值。 .. method:: statistics.b_min() 返回RGB5656 LAB 中B的最小值(0-255) (int)。 您也可以通过索引 ``[20]`` 取得这个值。 .. method:: statistics.b_max() 返回RGB5656 LAB 中B的最大值(0-255) (int)。 您也可以通过索引 ``[21]`` 取得这个值。 .. method:: statistics.b_lq() 返回RGB5656 LAB 中B的下四分值(0-255) (int)。 您也可以通过索引 ``[22]`` 取得这个值。 .. method:: statistics.b_uq() 返回RGB5656 LAB 中B的上四分值(0-255) (int)。 您也可以通过索引 ``[23]`` 取得这个值。 Blob 类 -- 色块对象 ========================= 色块对象是由 ``image.find_blobs`` 返回的。 .. class:: image.blob() 请调用 `image.find_blobs()` 函数来创建此对象。 .. method:: blob.corners() 返回对象的4个角的4 (x,y)元组列表。从左上方开始按顺时针顺序返回角。 .. method:: blob.min_corners() 返回包含4个角的4 (x,y)元组的列表,该元组的边界大于该Blob的最小面积矩形的边界。 与 `blob.corners()` 不同,最小面积矩形的角并不一定位于blob上。 .. method:: blob.rect() 返回一个矩形元组(x, y, w, h) ,用于如色块边界框的 `image.draw_rectangle` 等 其他的 `image` 方法。 .. method:: blob.x() 返回色块的边界框的x坐标(int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: blob.y() 返回色块的边界框的y坐标(int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: blob.w() 返回色块的边界框的w坐标(int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: blob.h() 返回色块的边界框的h坐标(int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: blob.pixels() 返回从属于色块(int)一部分的像素数量。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: blob.cx() 返回色块(int)的中心x位置。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: blob.cxf() 返回blob(浮点数)的质心x位置。 .. method:: blob.cy() 返回色块(int)的中心y位置。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: blob.cyf() 返回blob(浮点数)的质心y位置。 .. method:: blob.rotation() 返回色块的旋转(单位:弧度)。如果色块类似铅笔或钢笔,那么这个值就是介于0-180之间的唯一值。 如果这个色块圆的,那么这个值就没有效用。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: blob.rotation_deg() 以度为单位返回blob的旋转角度。 .. method:: blob.rotation_rad() 以弧度为单位返回blob的旋转度数。这个方法比 `blob.rotation()` 更具描述性。 .. method:: blob.code() 返回一个32位的二进制数字,其中为每个颜色阈值设置一个位,这是色块的一部分。 例如,如果您通过 `image.find_blobs` 来寻找三个颜色阈值,这个色块可以设置为0/1/2位。 注意:除非以 ``merge=True`` 调用 `image.find_blobs` ,否则每个色块只能设置一位。 那么颜色阈值不同的多个色块就可以合并在一起了。 您也可以用这个方法以及多个阈值来实现颜色代码跟踪。 您也可以通过索引 ``[8]`` 取得这个值。 .. method:: blob.count() 返回合并到此Blob中的Blob数。 只有您以 ``merge=True`` 调用 `image.find_blobs` 时,这个数字才不是1。 您也可以通过索引 ``[9]`` 取得这个值。 .. method:: blob.perimeter() 返回该blob周长上的像素数。 .. method:: blob.roundness() 返回0到1之间的值,表示对象的圆度。一个圆将是1。 .. method:: blob.elongation() 返回一个介于0和1之间的值,该值表示对象的长度(不是圆形)。一条线将是1。 .. method:: blob.area() 返回色块周围的边框面积(w * h) .. method:: blob.density() 返回这个色块的密度比。这是在色块边界框区域内的像素点的数量。 总的来说,较低的密度比意味着这个对象的锁定得不是很好。 结果在0和1之间。 .. method:: blob.extent() 是 `blob.density()` 的别名。 .. method:: blob.compactness() 类似 `blob.density()` ,但是,使用blob的周长来衡量对象的密度,因此更准确。结果在0和1之间。 .. method:: blob.solidity() 类似 `blob.density()` ,但是,使用旋转的最小面积矩形与边界矩形来衡量密度。结果在0和1之间。 .. method:: blob.convexity() 返回一个0到1之间的值,表示对象的凸度。正方形是1。 .. method:: blob.x_hist_bins() 返回blob中所有列的x轴直方图。Bin值在0和1之间缩放。 .. method:: blob.y_hist_bins() 返回blob中所有行的y轴直方图。Bin值在0和1之间缩放。 .. method:: blob.major_axis_line() 返回blob的主轴(这条线穿过最小面积矩形的最长边)的行元组(x1, y1, x2, y2),可以使用 `image.draw_line()` 来绘制它。 .. method:: blob.minor_axis_line() 返回blob的次轴(这条线穿过最小面积矩形的最短边)的行元组(x1, y1, x2, y2),可以使用 `image.draw_line()` 来绘制它。 .. method:: blob.enclosing_circle() 返回一个圆(包围blob的最小面积矩形的圆)元组(x, y, r),可以使用 `image.draw_circle()` 来绘制它。 .. method:: blob.enclosed_ellipse() 返回一个椭圆(包围blob的最小面积矩形的椭圆)元组(x, y, rx, ry, rotation),可以使用 `image.draw_ellipse()` 来绘制它。 Line类 – 直线对象 ========================= 直线对象是由 `image.find_lines` , `image.find_line_segments` 或  `image.get_regression` 返回的。 .. class:: image.line() 请调用 `image.find_lines()`, `image.find_line_segments()`, 或 `image.get_regression()` 函数来创建此对象。 .. method:: line.line() 返回一个直线元组(x1, y1, x2, y2) ,用于如 `image.draw_line` 等其他的 `image` 方法。 .. method:: line.x1() 返回直线的p1顶点 x坐标分量。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: line.y1() 返回直线的p1 y分量。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: line.x2() 返回直线的p2 x分量。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: line.y2() 返回直线的p2 y分量。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: line.length() 返回直线长度即 sqrt(((x2-x1)^2) + ((y2-y1)^2). 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: line.magnitude() 返回霍夫变换后的直线的模(magnitude)。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: line.theta() 返回霍夫变换后的直线的角度(0-179度)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: line.rho() 返回霍夫变换后的直线p值。 您也可以通过索引 ``[8]`` 取得这个值。 Circle类 –圆形对象 ============================= 圆形对象是由 `image.find_circles` 返回的。 .. class:: image.circle() 请调用 `image.find_circles()` 函数来创建此对象。 .. method:: circle.x() 返回圆的x位置。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: circle.y() 返回圆的y位置。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: circle.r() 返回圆的半径。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: circle.magnitude() 返回圆的模(magnitude)。 您也可以通过索引 ``[3]`` 取得这个值。 Rect类 – 矩形对象 ============================== 矩形对象是由 `image.find_rects` 返回的。 .. class:: image.rect() 请调用 `image.find_rects()` 函数来创建此对象。 .. method:: rect.corners() 返回一个由矩形对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。 .. method:: rect.rect() 返回一个矩形元组(x, y, w, h),用于如 矩形的边界框的 `image.draw_rectangle` 等其他的 `image` 方法。 .. method:: rect.x() 返回矩形的左上角的x位置。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: rect.y() 返回矩形的左上角的y位置。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: rect.w() 返回矩形的宽度。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: rect.h() 返回矩形的高度。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: rect.magnitude() 返回矩形的模(magnitude)。 您也可以通过索引 ``[4]`` 取得这个值。 QRCode类 – 二维码对象 ============================= 二维码对象是由 `image.find_qrcodes` 返回的。 .. class:: image.qrcode() 请调用 `image.find_qrcodes()` 函数来创建此对象。 .. method:: qrcode.corners() 返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。 .. method:: qrcode.rect() 返回一个矩形元组(x, y, w, h),用于如二维码的边界框的 ``image.draw_rectangle`` 等其他的 ``image`` 方法。 .. method:: qrcode.x() 返回二维码的边界框的x坐标(int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: qrcode.y() 返回二维码的边界框的y坐标(int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: qrcode.w() 返回二维码的边界框的w坐标(int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: qrcode.h() 返回二维码的边界框的h坐标(int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: qrcode.payload() 返回二维码有效载荷的字符串,例如URL 。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: qrcode.version() 返回二维码的版本号(int)。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: qrcode.ecc_level() 返回二维码的ECC水平(int)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: qrcode.mask() 返回二维码的掩码(int)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: qrcode.data_type() 返回二维码的数据类型。 您也可以通过索引 ``[8]`` 取得这个值。 .. method:: qrcode.eci() 返回二维码的ECI。ECI储存了QR码中存储数据字节的编码。若您想要处理包含超过标准ASCII文本的二维码,您需要查看这一数值。 您也可以通过索引 ``[9]`` 取得这个值。 .. method:: qrcode.is_numeric() 若二维码的数据类型为数字式,则返回True。 .. method:: qrcode.is_alphanumeric() 若二维码的数据类型为文字数字式,则返回True。 .. method:: qrcode.is_binary() 若二维码的数据类型为二进制式,则返回True。如果您认真处理所有类型的文本,则需要检查eci是否为True,以确定数据的文本编码。通常它只是标准的ASCII,但是它也可能是有两个字节字符的UTF8。 .. method:: qrcode.is_kanji() 若二维码的数据类型为日本汉字,则返回True。设置为True后,您就需要自行解码字符串,因为日本汉字符号每个字符是10位,而MicroPython不支持解析这类文本。 AprilTag类 – AprilTag对象 ================================= AprilTag对象是由 `image.find_apriltags` 返回的。 .. class:: image.apriltag() 请调用 `image.find_apriltags()` 函数来创建此对象。 .. method:: apriltag.corners() 返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。 .. method:: apriltag.rect() 返回一个矩形元组(x, y, w, h),用于如AprilTag边界框的 `image.draw_rectangle` 等其他的 `image` 方法。 .. method:: apriltag.x() 返回AprilTag边界框的x坐标(int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: apriltag.y() 返回AprilTag边界框的y坐标(int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: apriltag.w() 返回AprilTag边界框的w坐标(int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: apriltag.h() 返回AprilTag边界框的h坐标(int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: apriltag.id() 返回AprilTag的数字ID。 * TAG16H5 -> 0 to 29 * TAG25H7 -> 0 to 241 * TAG25H9 -> 0 to 34 * TAG36H10 -> 0 to 2319 * TAG36H11 -> 0 to 586 * ARTOOLKIT -> 0 to 511 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: apriltag.family() 返回AprilTag的数字家庭。 * image.TAG16H5 * image.TAG25H7 * image.TAG25H9 * image.TAG36H10 * image.TAG36H11 * image.ARTOOLKIT 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: apriltag.cx() 返回AprilTag的中心x位置(int)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: apriltag.cy() 返回AprilTag的中心y位置(int)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: apriltag.rotation() 返回以弧度计的AprilTag的旋度(int)。 您也可以通过索引 ``[8]`` 取得这个值。 .. method:: apriltag.decision_margin() 返回AprilTag匹配的色饱和度(取值0.0 - 1.0),其中1.0为最佳。 您也可以通过索引 ``[9]`` 取得这个值。 .. method:: apriltag.hamming() 返回AprilTag的可接受的数位误差数值。 * TAG16H5 -> 最多可接受0位错误 * TAG25H7 -> 最多可接受1位错误 * TAG25H9 -> 最多可接受3位错误 * TAG36H10 -> 最多可接受3位错误 * TAG36H11 -> 最多可接受4位错误 * ARTOOLKIT -> 最多可接受0位错误 您也可以通过索引 ``[10]`` 取得这个值。 .. method:: apriltag.goodness() 返回AprilTag图像的色饱和度(取值0.0 - 1.0),其中1.0为最佳。 .. note:: 目前这一数值通常是0.0。未来我们可以启用一个称为“标签细化”的功能,以实现对更小的AprilTag的检测。然而,现在这个功能将帧速率降低到1 FPS以下。 您也可以通过索引 ``[11]`` 取得这个值。 .. method:: apriltag.x_translation() 返回距离摄像机x方向的变换,距离的单位未知。 这个方法对于确定远离摄像机的AprilTag的位置很有用。但是,AprilTag的大小以及您使用的镜头等因素都会影响X单元归属的确定。为使用方便,我们推荐您使用查找表将该方法的输出转换为对您的应用程序有用的信息。 注意:此处的方向为从左至右。 您也可以通过索引 ``[12]`` 取得这个值。 .. method:: apriltag.y_translation() 返回距离摄像机y方向的变换,距离的单位未知。 这个方法对于确定远离摄像机的AprilTag的位置很有用。但是,AprilTag的大小以及您使用的镜头等因素都会影响Y单元归属的确定。为使用方便,我们推荐您使用查找表将该方法的输出转换为对您的应用程序有用的信息。 注意:此处的方向为从上至下。 您也可以通过索引 ``[13]`` 取得这个值。 .. method:: apriltag.z_translation() 返回距离摄像机z方向的变换,距离的单位未知。 T这个方法对于确定远离摄像机的AprilTag的位置很有用。但是,AprilTag的大小以及您使用的镜头等因素都会影响Z单元归属的确定。为使用方便,我们推荐您使用查找表将该方法的输出转换为对您的应用程序有用的信息。 注意:此处的方向为从前至后。 您也可以通过索引 ``[14]`` 取得这个值。 .. method:: apriltag.x_rotation() 返回以弧度计的AprilTag在X平面上的旋度。例:目视AprilTag,从左至右移动摄像头。 您也可以通过索引 ``[15]`` 取得这个值。 .. method:: apriltag.y_rotation() 返回以弧度计的AprilTag在Y平面上的旋度。例:目视AprilTag,从上至下移动摄像头。 您也可以通过索引 ``[16]`` 取得这个值。 .. method:: apriltag.z_rotation() 返回以弧度计的AprilTag在Z平面上的旋度。例:目视AprilTag,旋转摄像头。 注意:这只是 `apriltag.rotation()` 的重命名版本。 您也可以通过索引 ``[17]`` 取得这个值。 DataMatrix类 – 数据矩阵对象 ===================================== 数据矩阵对象是由 `image.find_datamatrices` 返回的。 .. class:: image.datamatrix() 请调用 `image.find_datamatrices()` 函数来创建此对象。 .. method:: datamatrix.corners() 返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。 .. method:: datamatrix.rect() 返回一个矩形元组(x, y, w, h),用于如数据矩阵的边界框的 `image.draw_rectangle` 等其他的 `image` 方法。 .. method:: datamatrix.x() 返回数据矩阵的边界框的x坐标(int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: datamatrix.y() 返回数据矩阵的边界框的y坐标(int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: datamatrix.w() 返回数据矩阵的边界框的w宽度。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: datamatrix.h() 返回数据矩阵的边界框的h高度。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: datamatrix.payload() 返回数据矩阵的有效载荷的字符串。例:字符串。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: datamatrix.rotation() 返回以弧度计的数据矩阵的旋度(浮点数)。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: datamatrix.rows() 返回数据矩阵的行数(int)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: datamatrix.columns() 返回数据矩阵的列数(int)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: datamatrix.capacity() 返回这一数据矩阵所能容纳的字符的数量。 您也可以通过索引 ``[8]`` 取得这个值。 .. method:: datamatrix.padding() 返回这一数据矩阵中未使用的字符的数量。 您也可以通过索引 ``[9]`` 取得这个值。 BarCode类 – 条形码对象 =============================== 条形码对象是由 `image.find_barcodes` 返回的。 .. class:: image.barcode() 请调用 `image.find_barcodes()` 函数来创建此对象。 .. method:: barcode.corners() 返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。 .. method:: barcode.rect() 返回一个矩形元组(x, y, w, h),用于如数据矩阵的边界框的 `image.draw_rectangle` 等其他的 `image` 方法。 .. method:: barcode.x() 返回条形码的边界框的x坐标(int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: barcode.y() 返回条形码的边界框的y坐标(int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: barcode.w() 返回条形码的边界框的w宽度(int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: barcode.h() 返回条形码的边界框的h高度(int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: barcode.payload() 返回条形码的有效载荷的字符串。例:数量。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: barcode.type() 返回条形码的列举类型 (int)。 您也可以通过索引 ``[5]`` 取得这个值。 * 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 - 未来启用 (e.g. 现在还不能正常使用). * image.CODE93 * image.CODE128 .. method:: barcode.rotation() 返回以弧度计的条形码的旋度(浮点数)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: barcode.quality() 返回条形码在图像中被检测到的次数(int)。 扫描条形码时,每一条新的扫描线都能解码相同的条形码。每次进行这一过程,条形码的值都会随之增加。 您也可以通过索引 ``[7]`` 取得这个值。 Displacement类 -- 位移对象 ========================================= 位移对象由 `image.find_displacement` 返回。 .. class:: image.displacement() 请调用 `image.find_displacement()` 函数来创建此对象。 .. method:: displacement.x_translation() 返回两个图像之间的x平移像素。 这是精确的子像素,所以它是一个浮点数。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: displacement.y_translation() 返回两个图像之间的y平移像素。 这是精确的子像素,所以它是一个浮点数。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: displacement.rotation() 返回两个图像之间的z平移像素。 这是精确的子像素,所以它是一个浮点数。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: displacement.scale() 返回两个图像之间旋转的弧度。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: displacement.response() 返回两幅图像之间位移匹配结果的质量。 范围 0-1。响应小于0.1的 ``displacement`` 对象可能是噪声。 您也可以通过索引 ``[4]`` 取得这个值。 Kptmatch类 – 特征点对象 ================================= 特征点对象是由 `image.match_descriptor` 返回的。 .. class:: image.kptmatch() 请调用 `image.match_descriptor()` 函数来创建此对象。 .. method:: kptmatch.rect() 返回一个矩形元组(x, y, w, h),用于如特征点的边界框的 `image.draw_rectangle` 等其他的 `image` 方法。 .. method:: kptmatch.cx() 返回特征点的中心x位置(int)。 您也可以通过索引 ``[0]`` 取得这个值。 .. method:: kptmatch.cy() 返回特征点的中心y位置(int)。 您也可以通过索引 ``[1]`` 取得这个值。 .. method:: kptmatch.x() 返回特征点边界框的x坐标(int)。 您也可以通过索引 ``[2]`` 取得这个值。 .. method:: kptmatch.y() 返回特征点边界框的y坐标(int)。 您也可以通过索引 ``[3]`` 取得这个值。 .. method:: kptmatch.w() 返回特征点边界框的w宽度(int)。 您也可以通过索引 ``[4]`` 取得这个值。 .. method:: kptmatch.h() 返回特征点边界框的h高度(int)。 您也可以通过索引 ``[5]`` 取得这个值。 .. method:: kptmatch.count() 返回匹配的特征点的数量(int)。 您也可以通过索引 ``[6]`` 取得这个值。 .. method:: kptmatch.theta() 返回估计的特征点的旋度(int)。 您也可以通过索引 ``[7]`` 取得这个值。 .. method:: kptmatch.match() 返回匹配关键点的(x,y)元组列表。 您也可以通过索引 ``[8]`` 取得这个值。 class ImageIO -- ImageIO 对象 -------------------------------- ImageIO 对象允许您以原生形式将 OpenMV Image 对象读/写到磁盘或内存。 此类为加载/存储图像提供快速读/写随机访问。 .. class:: image.ImageIO(path, mode) 创建一个 ImageIO 对象。 如果 ``path`` 是磁盘上的文件名,那么如果 ``mode`` 是 ``'r'`` 将打开该文件进行读取, 如果 ``mode`` 是 ``'w'`` 则写。 ``path`` 也可以是一个 3 值元组 (w, h, bpp) 用于图像的内存存储。 在这种情况下,``mode`` 是要存储在内存中的图像缓冲区的数量。 请注意,内存中的存储缓冲区在分配后不允许增加大小。 二进制图像使用 ``bpp`` 值 0,灰度图像使用 1,rgb565 图像使用 2。 .. method:: size() 返回 ImageIO 对象使用的磁盘或内存上的字节数。 .. method:: write(img) 将新图像 ``img`` 写入 ImageIO 对象。 对于磁盘 ImageIO 对象,该文件将随着新图像的添加而增长。 对于内存中的 ImageIO 对象,这只是在前进到下一个位置之前将图像写入当前预分配的位置。 返回 ImageIO 对象。 .. method:: read([copy_to_fb=False, [loop=True, [pause=True]]]) 从 ImageIO 对象返回一个图像对象。 如果 ``copy_to_fb`` 为 False,则新图像将在 MicroPython 堆上分配。 但是,MicroPython 堆是有限的,如果耗尽,可能没有空间来存储新图像。 相反,将 ``copy_to_fb`` 设置为 True 以将帧缓冲区设置为新图像,从而使该函数像 `sensor.snapshot()` 一样工作。 ``loop`` 如果为 True 会自动使 ImageIO 对象在图像流的末尾寻找开头。 ``pause`` 如果为 True , 则此方法通过写入先前记录的毫秒数暂停,以匹配捕获图像数据的原始帧速率。 ``copy_to_fb`` 也可能是另一个图像对象。如果您想用新的图像数据替换该图像对象的内存缓冲区、类型、宽度和高度。 .. note:: 任何使用 ``copy_to_fb`` 都会使其覆盖的先前图像对象无效。 不要再使用对它覆盖的先前图像对象的任何引用。 也不要引用帧缓冲区、帧缓冲区堆栈或 MicroPython 堆上的图像的图像对象。 .. method:: seek(offset) 寻找 ImageIO 对象中的图像位置偏移 ``offset`` 。 您可以将其与写入和读取一起使用以实现图像先进先出fifo。 .. method:: close() 关闭 ImageIO 对象。 对于内存对象,这是释放分配的空间,对于磁盘文件,这将关闭文件并写出所有元数据。 Image类 – 图像对象 =========================== 图像对象是机器视觉操作的基本对象。 .. class:: image.Image(path, [copy_to_fb=False]) 或者,您可以传递一个宽度、高度和 `sensor.BINARY`, `sensor.GRAYSCALE`, 或 `sensor.RGB565` 来创建新的空白图像对象(初始化为0 -黑色)。 支持bmp/pgm/ppm/jpg/jpeg格式的图像文件。 若 ``copy_to_fb`` 为True,图像会直接载入帧缓冲区,您就可以加载大幅图片了。若为False,图像会载入MicroPython的堆中,堆远比帧缓冲区小。 你也可以将 ``copy_to_fb`` 设置为另一个图像对象,然后该缓冲区将被复制的图像覆盖, 从而更改传递的图像对象的像素格式和分辨率。 .. note:: 如果 ``copy_to_fb`` 设置为True或另一个图像对象,则不继续使用传递给这个方法的旧图像对象或帧缓冲区图像对象。 由于此旧参考现在已过时,请使用此方法返回的新图像对象参考。 图像支持“[]”记法。 令 ``image[index] = 8/16-bit value`` ,以便分配图像像素或 ``image[index]`` ,并得到一个图像像素,若是用于RGB图像的16位RGB565值的灰度图像, 这一像素则为8位。 对于JPEG图像而言,“[]”使得您可以访问压缩的节数组形式的JPEG图像色块。由于JPEG图像是压缩的字节流形式,因而对数据组的读取和写入是不透明的。 图像还支持读缓冲区操作。您可以把图像当作节数组对象,将图像输入所有类型的MicroPython函数。若您想传送一个图像,可以将它传递给UART /SPI/ I2C写入函数,可实现自动传送。 .. method:: image.width() 返回以像素计的图像的宽度。 .. method:: image.height() 返回以像素计的图像的高度。 .. method:: image.format() 返回用于灰度图的 `sensor.GRAYSCALE` 、用于RGB图像的 `sensor.RGB565` 和用于JPEG图像的 `sensor.JPEG` 。 .. method:: image.size() 返回以字节计的图像大小。 .. method:: image.bytearray() 返回一个 `bytearray` 对象,该对象指向图像数据以便进行字节级读/写访问。 .. note:: 当传递给需要类似 `bytes` 对象的 MicroPython 驱动程序时,图像对象会自动转换为 `bytes` 对象。这是只读访问。 调用 `bytearray()` 来获得读/写访问权限。 .. method:: image.get_pixel(x, y, [rgbtuple]) 灰度图:返回(x, y)位置的灰度像素值。 RGB565l:返回(x, y)位置的RGB888像素元组(r, g, b)。 Bayer图像: 返回(x, y)位置的像素值。 不支持压缩图像。 .. note:: `image.get_pixel()` 和 `image.set_pixel()`是允许你操作Bayer模式图像的唯一方法。 Bayer模式图像是文字图像。对于偶数行,其中图像中的像素是R/G/R/G/等。 对于奇数行,其中图像中的像素是G/B/G/B/等。 每个像素是8位。 .. method:: image.set_pixel(x, y, pixel) 灰度图:将(x, y) 位置的像素设置为灰度值 ``pixel`` 。 RGB图像:将(x, y) 位置的像素设置为RGB888元组(r, g, b) ``pixel`` 。 对于bayer模式图像:将位置(x, y)的像素值设置为 ``pixel``。 返回image对象,这样你可以使用 ``.`` 符号调用另一个方法。 ``x`` 和 ``y`` 可以独立传递,也可以作为元组传递。 ``pixel`` 可以是 RGB888 元组 (r, g, b) 或底层像素值(即 RGB565 图像的字节反转 RGB565 值或灰度图像的 8 位值。 不支持压缩图像。 .. note:: `image.get_pixel()` 和 `image.set_pixel()`是允许你操作Bayer模式图像的唯一方法。 Bayer模式图像是文字图像。对于偶数行,其中图像中的像素是R/G/R/G/等。 对于奇数行,其中图像中的像素是G/B/G/B/等。 每个像素是8位。 .. method:: image.mean_pool(x_div, y_div) 在图像中找到 ``x_div`` * ``y_div`` 正方形的平均值,并返回由每个正方形的平均值组成的修改图像。 此方法允许您在原来图像上快速缩小图像。 不支持压缩图像和bayer图像。 .. method:: image.mean_pooled(x_div, y_div) 在图像中找到 ``x_div`` * ``y_div`` 正方形的平均值,并返回由每个正方形的平均值组成的新图像。 此方法允许您创建缩小的图像副本。 不支持压缩图像和bayer图像。 .. method:: image.midpoint_pool(x_div, y_div, [bias=0.5]) 在图像中找到 ``x_div`` * ``y_div`` 正方形的中点值,并返回由每个正方形的中点值组成的修改图像。 ``bias`` 为0.0返回每个区域的最小值,而``bias`` 为1.0返回每个区域的最大值。 此方法允许您在原来图像上快速缩小图像。 不支持压缩图像和bayer图像。 .. method:: image.midpoint_pooled(x_div, y_div, [bias=0.5]) 在图像中找到 ``x_div`` * ``y_div`` 正方形的中点值,并返回由每个正方形的中点值组成的新图像。 ``bias`` 为0.0返回每个区域的最小值,而``bias`` 为1.0返回每个区域的最大值。 此方法允许您创建缩小的图像副本。 不支持压缩图像和bayer图像。 .. method:: image.to_bitmap([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy=False]]]]]]]]]]]) 将图像转换为位图图像(每像素 1 位)。 如果 ``copy`` 为 False,此方法将尝试就地修改图像。 如果 ``copy`` 为 True,则此方法将返回在堆上分配的新图像副本。 ``copy`` 也可能是另一个图像对象,在这种情况下,此方法将尝试重新使用该图像对象存储空间,并返回一个使用先前图像对象存储空间的新图像对象。 执行此操作后,不要再使用对旧图像对象的任何引用,因为它们将过时。 ``x_scale`` 控制绘制的图像在 x 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将水平翻转。 ``y_scale`` 控制绘制图像在 y 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将垂直翻转。 roi 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小, 则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 y_scale 来指定要绘制的图像的大小,则可以传递 y_size 并且 y_scale 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 .. note:: 位图图像就像只有两个像素值(0和1)的灰度图像一样。 此外,位图图像被打包,这样它们每个像素仅存储1位,因此非常小。 OpenMV图像库允许位图图像在所有位置的 `sensor.GRAYSCALE` 和 `sensor.RGB565` 中使用。 但是,将许多操作应用于位图图像时没有任何意义,因为位图图像只有2个值。 OpenMV建议在操作中对 ``mask`` 值使用位图图像,因为它们很容易适合MicroPython堆。 最后,将位图图像像素值0和1应用于 `sensor.GRAYSCALE` 或 `sensor.RGB565` 图像时, 将被解释为黑白。该库自动处理转换。 返回图像对象, 因此您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.to_grayscale([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy=False]]]]]]]]]]]) 将图像转换为灰度图像(每像素 8 位)。 如果 ``copy`` 为 False,此方法将尝试就地修改图像。 如果 ``copy`` 为 True,则此方法将返回在堆上分配的新图像副本。 ``copy`` 也可能是另一个图像对象,在这种情况下,此方法将尝试重新使用该图像对象存储空间,并返回一个使用先前图像对象存储空间的新图像对象。 执行此操作后,不要再使用对旧图像对象的任何引用,因为它们将过时。 ``x_scale`` 控制绘制的图像在 x 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将水平翻转。 ``y_scale`` 控制绘制图像在 y 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将垂直翻转。 roi 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 返回图像对象,以便您可以使用 ``.`` 符号调用另一个方法。 不支持压缩图像。 .. method:: image.to_rgb565([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy=False]]]]]]]]]]]) 将图像转换为 RGB565 图像(每像素 16 位)。 如果 ``copy`` 为 False,此方法将尝试就地修改图像。 如果 ``copy`` 为 True,则此方法将返回在堆上分配的新图像副本。 ``copy`` 也可能是另一个图像对象,在这种情况下,此方法将尝试重新使用该图像对象存储空间, 并返回一个使用先前图像对象存储空间的新图像对象。 执行此操作后,不要再使用对旧图像对象的任何引用,因为它们将过时。 ``x_scale`` 控制绘制的图像在 x 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将水平翻转。 ``y_scale`` 控制绘制图像在 y 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将垂直翻转。 roi 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.to_rgb565([copy=False, [rgb_channel=-1]]) 将图像转换为彩色图像。 此方法也会修改基础图像像素,以字节为单位更改图像大小,因此只能在RGB565图像上进行。 否则 ``copy`` 必须为True才能在堆上创建新的修改图像。 ``rgb_channel`` 如果设置为0/1/2,则分别从R/G/B通道创建RGB565图像(如果对RGB565图像调用此方法)。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.to_rainbow([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=sensor.PALETTE_RAINBOW, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy=False]]]]]]]]]]]) 将图像转换为 RGB565 彩虹图像(每像素 16 位)。 如果 ``copy`` 为 False,此方法将尝试就地修改图像。 如果 ``copy`` 为 True,则此方法将返回在堆上分配的新映像副本。 ``copy`` 也可能是另一个图像对象,在这种情况下,此方法将尝试重新使用该图像对象存储空间, 并返回一个使用先前图像对象存储空间的新图像对象。 执行此操作后,不要再使用对旧图像对象的任何引用,因为它们将过时。 ``x_scale`` 控制绘制的图像在 x 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将水平翻转。 ``y_scale`` 控制绘制图像在 y 方向上的缩放比例(float浮点数)。 如果此值为负,则图像将垂直翻转。 ``roi`` 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.compress([quality=50]) JPEG对图像进行适当压缩。使用这种方法与 ``image.compressed()`` 保存堆空间相比,使用更高quality的压缩率是以破坏原始图像为代价的。 返回图像对象,以便您可以使用 ``.`` 符号调用另一个方法。 ``quality`` 是压缩质量(0-100)(int)。 如果在压缩图像上调用,则返回压缩图像。 .. method:: image.compress_for_ide([quality=50]) JPEG对图像进行适当压缩。使用这种方法与 ``image.compressed()`` 保存堆空间相比,使用更高quality的压缩率是以破坏原始图像为代价的。 这个方法压缩图像,然后通过将每6比特编码为128 - 191之间的字节将JPEG数据格式化,转换为OpenMV IDE,以便显示。进行这一步是为防止JPEG数据被误认为是字节流中的其他文本数据。 您需要使用这一方法来格式化图像数据,以便在OpenMV IDE中通过“开放终端”创建的终端窗口中显示。 返回图像对象,以便您可以使用 ``.`` 符号调用另一个方法。 ``quality`` 是压缩质量(0-100)(int)。 如果在压缩的映像上调用,则返回为IDE压缩的图像。 不要在已经为IDE压缩的图像上调用此函数。 .. method:: image.compressed([quality=50]) 返回一个JPEG压缩图像—原始图像未经处理。但是,这个方法需要堆空间的大分配,所以图像压缩质量和图像分辨率必须很低,以便你可以使用 `image.compress()`. ``quality`` 是压缩质量(0-100)(int)。 如果在压缩的图像上调用,则返回为IDE副本压缩的图像。 .. method:: image.compressed_for_ide([quality=50]) 返回一个JPEG压缩图像—原始图像未经处理。但是,这个方法需要堆空间的大分配,所以图像压缩质量和图像分辨率必须很低。 这个方法压缩图像,然后通过将每6比特编码为128 - 191之间的字节将JPEG数据格式化,转换为OpenMV IDE,以便显示。进行这一步是为防止JPEG数据被误认为是字节流中的其他文本数据。 您需要使用这一方法来格式化图像数据,以便在OpenMV IDE中通过“开放终端”创建的终端窗口中显示。 ``quality`` 是压缩质量(0-100)(int)。 如果在压缩的图像上调用,则返回为IDE副本压缩的图像。 不要在已经为IDE压缩的图像上调用此函数。 .. method:: image.jpeg_encode_for_ide() 通过将每6位编码为一个介于128-191之间的字节,此格式将JPEG数据格式化以传输到OpenMV IDE进行显示。 这样做是为了防止将JPEG数据误解为字节流中的其他文本数据。 此方法进行原位格式化会破坏原始JPEG图像,并返回编码的jpeg图像。 您需要使用此方法将图像数据格式化,以便显示到通过OpenMV IDE中的"Open Terminal打开终端"创建的终端窗口。 返回图像对象,因此您可以使用 ``.`` 表示法调用另一个方法。 只适用于JPEG图像。 .. method: image.jpeg_encoded_for_ide() 通过将每 6 位编码为值在 128-191 之间的字节来格式化 JPEG 数据以传输到 OpenMV IDE 以进行显示。 这样做是为了防止 JPEG 数据被误解为字节流中的其他文本数据。 此方法对保留原始 JPEG 图像的异地格式化并返回一个新的编码 jpeg 图像。 您需要使用此方法格式化图像数据以显示到通过 OpenMV IDE 中的“打开终端”创建的终端窗口。 返回image对象,这样你可以使用 ``.`` 符号调用另一个方法 只适用于JPEG图像。 .. method:: image.copy([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy_to_fb=False]]]]]]]]]]]) 创建一个图像对象的副本。如果 ``copy_to_fb`` 为 False,则新图像将在 MicroPython 堆上分配。 但是,MicroPython 堆是有限的,如果耗尽,可能没有空间来存储新图像。 相反,将 ``copy_to_fb`` 设置为 True 以将帧缓冲区设置为新图像,从而使该函数像 `sensor.snapshot()` 一样工作。 ``x_scale`` 是一个浮点值,通过它可以在x方向上缩放图像。如果此值为负,则图像将水平翻转。 ``y_scale`` 是一个浮点值,通过它可以在y方向上缩放图像。If this ``y_scale`` 是一个浮点值,通过它可以在y方向上缩放图像。如果此值为负,则图像将垂直翻转。 ``roi`` 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 ``copy_to_fb`` 也可能是另一个图像对象。如果您想用新的图像数据替换该图像对象的内存缓冲区、类型、宽度和高度。 .. note:: 如果``copy_to_fb``设置为True或另一个图像对象, 则不继续使用传递给这个方法的旧图像对象或帧缓冲区图像对象。 由于此旧参考现在已过时,请使用此方法返回的新图像对象参考。 返回新的图像对象。 不支持压缩图像或bayer图像。 .. method:: image.crop([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy=False]]]]]]]]]]]) 在不更改基础图像类型的情况下就地修改图像。 如果 ``copy`` 为 False,此方法将尝试就地修改图像。 如果 ``copy`` 为 True,则此方法将返回在堆上分配的新图像副本。 ``copy`` 也可能是另一个图像对象,在这种情况下,此方法将尝试重新使用该图像对象存储空间, 并返回一个使用先前图像对象存储空间的新图像对象。 执行此操作后,不要再使用对旧图像对象的任何引用,因为它们将过时。 ``x_scale`` 是一个浮点值,通过它可以在x方向上缩放图像。 如果此值为负,则图像将水平翻转。 ``y_scale`` 是一个浮点值,通过它可以在y方向上缩放图像。 如果此值为负,则图像将垂直翻转。 ``roi`` 是要从中复制的感兴趣区域矩形(x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.scale([x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None, [copy=False]]]]]]]]]]]) 在不更改基础图像类型的情况下就地修改图像。 如果 ``copy`` 为 False,此方法将尝试就地修改图像。 如果 ``copy`` 为 True,则此方法将返回在堆上分配的新图像副本。 ``copy`` 也可能是另一个图像对象,在这种情况下,此方法将尝试重新使用该图像对象存储空间, 并返回一个使用先前图像对象存储空间的新图像对象。 执行此操作后,不要再使用对旧图像对象的任何引用,因为它们将过时。 ``x_scale`` 是一个浮点值,通过它可以在x方向上缩放图像。 如果此值为负,则图像将水平翻转。 ``y_scale`` 是一个浮点值,通过它可以在y方向上缩放图像。 如果此值为负,则图像将水平翻转。 roi 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制要混合到目标图像中的源图像的多少。 值为 256 时绘制不透明的源图像,而小于 256 的值会在源图像和目标图像之间产生混合。 0 不会修改目标图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.save(path, [roi, [quality=50]]) 将图像的副本保存到 ``path`` 中的文件系统。  支持bmp/pgm/ppm/jpg/jpeg格式的图像文件。注意:您无法将jpeg格式的压缩图像保存成未压缩的格式。 ``roi`` 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即复制整个图像的图像矩形。但这不适用于JPEG图像。 ``quality`` 指在图像尚未被压缩(0-100) (int)时将图像保存为JPEG格式的JPEG压缩质量。 返回image对象,这样你可以使用 ``.`` 符号调用另一个方法。 .. method:: image.flush() 使用相机帧缓冲区中的图像更新 IDE 中的帧缓冲区。 .. method:: image.clear([mask]) 将图像中的所有像素设置为零(非常快)。 ``mask`` 是用于操作的像素级掩码的另一个图像。 mask蒙版应该是只有黑色或白色像素的图像,并且应该与正在操作的图像大小相同。 仅修改mask蒙版中设置的像素。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像。 .. method:: image.draw_line(x0, y0, x1, y1, [color, [thickness=1]]) 在图像上绘制一条从(x0,y0)到(x1,y1)的线。 您可以单独传递x0,y0,x1,y1,也可以传递给元组(x0,y0,x1,y1)。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 ``thickness`` 控制线的粗细像素。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: 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以填充矩形。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.draw_circle(x, y, radius, [color, [thickness=1, [fill=False]]]) 在图像上绘制一个圆形。 您可以单独传递x,y,半径 或 作为元组(x,y,radius)传递。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 ``thickness`` 控制线的粗细像素。 将 ``fill`` 设置为True以填充圆形。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.draw_ellipse(cx, cy, rx, ry, rotation, [color, [thickness=1, [fill=False]]]) 在图像上绘制椭圆。您可以单独传递cx、cy、rx、ry和rotation(以度为单位),也可以作为元组传递(cx、yc、rx、ry、rotation)。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。 但是,您也可以为灰度图像传递基础像素值(0-255),或者为RGB565图像传递字节反转的RGB565值。 ``thickness`` 控制边缘的厚度,以像素为单位。 传递 ``fill`` 设置为True来填充椭圆。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。。 不支持压缩图像或bayer图像。 .. method:: image.draw_string(x, y, text, [color, [scale=1, [x_spacing=0, [y_spacing=0, [mono_space=True, [char_rotation=0, [char_hmirror=False, [char_vflip=False, [string_rotation=0, [string_hmirror=False, [string_vflip=False]]]]]]]]]]]) 从图像中的(x, y)位置开始绘制8x10文本。您可以单独传递x,y,也可以作为元组(x,y)传递。 ``text`` 是写入图像的字符串。 ``\n``, ``\r``, 和 ``\r\n`` 结束符将光标移至下一行。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 ``scale`` 可以放大/缩小图像上文本的大小。您可以传递大于0的整数或浮点值。 ``x_spacing`` 允许你在字符之间添加(如果是正数)或减去(如果是负数)x像素,设置字符间距。 ``y_spacing`` 允许你在字符之间添加(如果是正数)或减去(如果是负数)y像素,设置行间距。 ``mono_space`` 默认为True,强制文本间距固定。对于大文本,这看起来很糟糕。设置False以获得非固定宽度的字符间距,看起来好多了。 ``char_rotation``可以是0、90、180、270,来旋转字符串中的每个字符。 ``char_hmirror`` 如果为True,则水平镜像字符串中的所有字符。 ``char_vflip`` 如果为True,则垂直翻转字符串中的所有字符。 ``string_rotation`` 可以是0、90、180、270,来旋转字符串。 ``string_hmirror``如果为True,则水平镜像字符串。 ``string_vflip`` 如果为True,则垂直翻转字符串。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.draw_cross(x, y, [color, [size=5, [thickness=1]]]) 在图像上绘制一个十字。 您可以单独传递x,y或作为元组(x,y)传递。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 ``size`` 控制十字线的延伸长度。 ``thickness`` 控制边缘的像素厚度。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.draw_arrow(x0, y0, x1, y1, [color, [thickness=1]]) 在图像上绘制一条从(x0,y0)到(x1,y1)的箭头。 您可以单独传递x0,y0,x1,y1,也可以传递给元组(x0,y0,x1,y1)。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是, 您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 ``thickness`` 控制线的粗细像素。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.draw_edges(corners, [color, [size=0, [thickness=1, [fill=False]]]]) 在由 `blob.corners` 等方法返回的角列表之间绘制线边。 Coners是两个x/y元组的四值元组。 例如:[(x1, y1), (x2, y2), (x3, y3), (x4、y4)]。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。 但是,您也可以为灰度图像传递基础像素值(0-255),或者为RGB565图像传递字节反转的RGB565值。 ``size`` 如果大于0,则会将角绘制为半径为 ``size`` 的圆。 ``thickness`` 控制线条的粗细(以像素为单位)。 通过将 ``fill`` 设置为True来填充绘制的角圆。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.draw_image(image, x, y, [x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None]]]]]]]]]]) 绘制一个 ``image`` ,其左上角从位置x,y开始。 您可以单独传递x,y,也可以传递给元组(x,y)。 这种方法非常灵活,不需要在目标图像上绘制的图像具有相同的宽度/高度/或像素格式(灰度/RGB565)。 该方法还可以自动处理从目标图像边缘绘制的裁剪像素。 也就是说,上述灵活性是伴随着增加绘制时间的成本而来的。 使用更受限的方法,如 `image.replace` , 该方法要求两个图像都具有相同的宽度/高度,并使用蒙版,以在需要更高性能时更快地将一个图像渲染到另一个图像上。 ``x_scale`` 是一个浮点值,通过它可以在x方向上缩放图像。如果此值为负,则图像将水平翻转。 ``y_scale`` 是一个浮点值,通过它可以在y方向上缩放图像。如果此值为负,则图像将垂直翻转。 ``roi`` 是要绘制的源图像的感兴趣区域矩形元组 (x, y, w, h)。 这允许您仅提取 ROI 中的像素以在目标图像上进行缩放和绘制。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并渲染到目标图像上的 RGB 通道(0=R,G=1,B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取源 RGB565 图像的绿色通道并在目标图像上以灰度方式绘制该通道。 ``alpha`` 控制另一幅图像与这幅图像的混合程度。 ``alpha`` 应该是0到256之间的一个整数值。接近零的值会将更多其他图像混合到该图像中,而接近256的值则相反。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何源图像的灰度值的颜色查找表。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 以像素级别调制正在绘制的源图像的``alpha``值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变成更透明,直到 0。 如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的OR逻辑: * `image.AREA`: 与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`: 使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`: 使用双三次缩放而不是最近邻缩放的默认值。 * `image.CENTER`: 将要绘制的图像图像居中 (x, y)。 * `image.EXTRACT_RGB_CHANNEL_FIRST`: 在缩放之前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`: 在缩放之前应用调色板。 * `image.BLACK_BACKGROUND`: 假设目标图像是黑色的。 这加快了绘图速度。 如果没有传递 ``x_scale`` 来指定要绘制的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 均未指定,则 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 来指定要绘制的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.draw_keypoints(keypoints, [color, [size=10, [thickness=1, [fill=False]]]]) 在图像上绘制关键点对象的关键点。您还可以传递包含(x, y, rotation_angle_in_degrees)三个值元组的列表, 以重新使用此方法来绘制关键点字形,这些关键字形是具有指向特定方向的线的圆。 ``color`` 是用于灰度或RGB565图像的RGB888元组。默认为白色。但是,您也可以传递灰度图像的基础像素值(0-255)或RGB565图像的字节反转RGB565值。 ``size`` 控制特征点的大小。 ``thickness`` 控制线的粗细像素。 将 ``fill`` 设置为True以填充特征点。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: 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 上不可用。 .. method:: image.mask_rectange([x, y, w, h]) 将图像的矩形部分归零。如果未提供任何参数,则此方法会将图像的中心归零。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.mask_circle([x, y, radius]) 将图像的圆形部分归零。如果没有提供参数,则此方法将使图像的中心为零。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.mask_ellipse([x, y, radius_x, radius_y, rotation_angle_in_degrees]) 将图像的椭圆部分归零。如果没有提供参数,则此方法将使图像的中心为零。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: 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通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 .. note:: 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是 ``thresholds`` 的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的 ``工具 ->机器视觉 ->阈值编辑器`` 并从GUI窗口中拖动滑块来确定颜色阈值。 ``invert`` 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 设置 ``zero`` 为True来使阈值像素为零,并使不在阈值列表中的像素保持不变。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 ``to_bitmap`` 将图像数据转换为二进制位图图像,每个像素以1位的形式存储。 对于非常小的图像,新的位图图像可能无法放入原始图像中,因此需要使用 ``copy`` 进行就地操作。 ``copy`` 如果为True,则在堆上创建二进制图像的副本,而不是修改源图像。 .. note:: 位图图像就像只有两个像素值(0和1)的灰度图像一样。 此外,位图图像被打包,这样它们每个像素仅存储1位,因此非常小。 OpenMV图像库允许位图图像在所有位置的 `sensor.GRAYSCALE` 和 `sensor.RGB565` 中使用。 但是,将许多操作应用于位图图像时没有任何意义,因为位图图像只有2个值。 OpenMV建议在操作中对 ``mask`` 值使用位图图像,因为它们很容易适合MicroPython堆。 最后,将位图图像像素值0和1应用于 `sensor.GRAYSCALE` 或 `sensor.RGB565` 图像时, 将被解释为黑白。该库自动处理转换。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.invert() 将二进制图像0(黑色)变为1(白色),1(白色)变为0(黑色),非常快速地翻转二进制图像中的所有像素值。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和Bayer图像。 .. method:: image.b_and(image, [mask=None]) 用另一图像与这一图像进行逻辑与运算。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.b_nand(image, [mask=None]) 用另一图像与这一图像进行逻辑与非运算。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.b_or(image, [mask=None]) 用另一图像与这一图像进行逻辑或运算。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.b_nor(image, [mask=None]) 用另一图像与这一图像进行逻辑或非运算。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.b_xor(image, [mask=None]) 用另一图像与这一图像进行逻辑异或运算。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.b_xnor(image, [mask=None]) 用另一图像与这一图像进行逻辑同或运算。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.erode(size, [threshold, [mask=None]]) 从分割区域的边缘删除像素。 这一方法通过卷积图像上((size*2)+1)x((size*2)+1)像素的核来实现,如果相邻像素集的总和小于 ``threshold`` ,则对内核的中心像素进行归零。 若 ``threshold`` 未设定,这个方法的功能如标准腐蚀方法一样。若threshold设定,您就可以指定腐蚀的特定像素,例如:设置低于2个的像素周围阈值为2。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.dilate(size, [threshold, [mask=None]]) 将像素添加到分割区域的边缘中。 这一方法通过卷积图像上((size*2)+1)x((size*2)+1)像素的核来实现,如果相邻像素集的总和大于 ``threshold`` ,则将内核的中心像素进行设置。 若 ``threshold`` 未设定,这个方法的功能如标准腐蚀方法一样。若threshold设定,您就可以指定腐蚀的特定像素,例如:设置低于2个的像素周围阈值为2。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.open(size, [threshold, [mask=None]]) 按顺序对图像执行腐蚀和膨胀。有关更多信息,请参阅 `image.erode()` 和 `image.dilate()` 。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.close(size, [threshold, [mask=None]]) 按顺序对图像执行膨胀和腐蚀。有关更多信息,请参阅 `image.erode()` 和 `image.dilate()` 。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.top_hat(size, [threshold, [mask=None]]) 返回原图像和执行 `image.open()` 函数后图像的差异。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 不支持压缩图像和bayer图像。 .. method:: image.black_hat(size, [threshold, [mask=None]]) 返回原图像和执行 `image.close()` 函数后图像的差异。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 不支持压缩图像和bayer图像。 .. method:: image.gamma_corr([gamma=1.0, [contrast=1.0, [brightness=0.0]) 快速改变图像的伽马、对比度和亮度。请用这个方法代替 `image.mul` 或 `image.div` 用于混合以调整像素值。 ``gamma`` 值如果大于1.0,那么图像以非线性方式变暗;而小于1.0则使图像变亮。通过将所有像素的颜色通道缩放到[0:1)之间, 然后在缩小之前在所有像素上重新映射 ``pow(pixel, 1/gamma)``,将gamma值应用于图像。 ``contrast``值大于1.0,则图像以线性方式变亮;值小于1.0则使图像变暗。通过将所有像素的颜色通道缩放到[0:1)之间, 然后在缩小之前对所有像素重新映射 ``pixel * contrast`` ,将对比度值应用于图像。 ``brightness``值大于0.0将使图像以恒定的方式变亮,而小于0.0将使图像变暗。将所有像素的颜色通道缩放到[0:1)之间, 然后在缩小之前对所有像素重新映射``pixel + brightness`` ,将亮度值应用到图像上。 返回图像对象,因此可以使用``.``符号调用另一个方法。 不支持压缩图像或bayer图像。 .. method:: image.negate() 快速翻转(数值反转)图像中的所有像素值。例如,对于灰度图像,该方法将所有像素从 ``pixel`` 更改为 ``255 - pixel`` 。 非常快速地翻转(数字反转)图像中的所有像素值。对每个颜色通道的像素值进行数值转换。例: (255 - pixel). 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.replace(image, [hmirror=False, [vflip=False, [mask=None]]]) 用新图像替换图像对象中的所有像素。 ``image`` 可以是另一个图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 将 ``hmirror`` 设置为True以水平镜像替换图像。 将 ``vflip`` 设置为True以垂直翻转替换图像。 设置``transpose`` 为True,沿对角线翻转图像(如果图像是非正方形,这将改变图像的宽度/高度)。 如果要将图像旋转90度的倍数,请执行以下操作: * vflip=False, hmirror=False, transpose=False -> 0 degree rotation * vflip=True, hmirror=False, transpose=True -> 90 degree rotation * vflip=True, hmirror=True, transpose=False -> 180 degree rotation * vflip=False, hmirror=True, transpose=True -> 270 degree rotation .. note:: 如果你没有传递一个 ``image`` ,则该方法将对要替换的基础图像起作用,方法是应用 ``hmirror``, ``vflip``, ``transpose`` 选项进行旋转周围的图像。例如:如果你想执行 ``img.replace(img, etc...)`` 你只需要做 ``img.replace(etc..)``。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 请注意,在hmirror/vflip/transpose之前将蒙版应用到图像上,因此该蒙版应与初始未修改图像的宽度/高度相同。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.assign(image, [hmirror=False, [vflip=False, [transpose=False, [mask=None]]]]) 别名 `image.replace` 。 .. method:: image.set(image, [hmirror=False, [vflip=False, [transpose=False, [mask=None]]]]) 别名 `image.replace` 。 .. method:: image.add(image, [mask=None]) 将两个图像彼此按像素相加。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: 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图像。 .. method:: 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图像。 .. method:: image.div(image, [invert=False, [mask=None]]) 将此图像除以另一个图像。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 将 ``invert`` 设置为True可将除法方向从 ``a/b`` 改为 ``b/a``。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. Note:: 此方法用于图像混合,不能通过像 ``2``这样的标量来划分图像中的像素。否则使用 `image.gamma_corr` 。 .. method:: image.min(image, [mask=None]) 在像素级 用此图像和另一个图像之间的最小像素值替换此图像中的像素。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 这个方法在OpenMV4上不可用. .. method:: image.max(image, [mask=None]) 在像素级 用此图像和另一个图像之间的最大像素值替换此图像中的像素。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.difference(image, [mask=None]) 将两个图像彼此按像素取绝对值。例:对于每个颜色通道而言,将每个像素替换为ABS(this.pixel-image.pixel)。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.blend(image, [alpha=128, [mask=None]]) 将另外一张图像 ``image`` 与这一图像融合。 ``image`` 可以是图像对象,未压缩图像文件的路径(bmp/pgm/ppm),也可以是标量值。 如果标量值,该值可以是RGB888元组或基础像素值(例如,灰度图像的8位灰度级或RGB图像的字节反转RGB565值)。 ``alpha`` 控制要混合到这个图像中的其他图像的多少. ``alpha`` 应该是0到256之间的整数值。接近零的值会将更多其他图像混合到此图像中,接近256则相反。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: image.histeq([adaptive=False, [clip_limit=-1, [mask=None]]]) 在图像上运行直方图均衡算法。 直方图均衡化使图像中的对比度和亮度标准化。 如果 ``adaptive`` 传递为True,那么将在图像上运行自适应直方图均衡方法,这通常比非自适应直方图限定更好,但运行时间更长。 ``clip_limit`` 提供了一种限制自适应直方图均衡的对比度的方法。 使用较小的值(例如10)可以生成良好的直方图均衡对比度受限图像。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: 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图像。 .. method:: 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 上不可用。 .. method:: image.mode(size, [threshold=False, [offset=0, [invert=False, [mask=None]]]]]) 在图像上运行众数滤波,用相邻像素的模式替换每个像素。这一方法在灰度图上运行效果良好。但由于这一操作的非线性特性,会在RGB图像边缘上产生许多伪像。 ``Size`` 是内核的大小。取1 (3x3 内核)、2 (5x5 内核)。 如果你想在滤波器的输出上自适应地设置阈值,你可以传递 ``threshold=True`` 参数来启动图像的自适应阈值处理, 他根据环境像素的亮度(核函数周围的像素的亮度有关),将像素设置为1或者0。 负数 ``offset`` 值将更多像素设置为1,而正值仅将最强对比度设置为1。 设置 ``invert`` 以反转二进制图像的结果输出。 ``mask`` 是另一个用作绘图操作的像素级掩码的图像。掩码应该是一个只有黑色或白色像素的图像,并且应该与你正在绘制的 ``image`` 大小相同。 仅掩码中设置的像素被修改。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: image.midpoint(size, [bias=0.5, [threshold=False, [offset=0, [invert=False, [mask=None]]]]]) 在图像上运行中点滤波。此滤波器找到图像中每个像素邻域的中点((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 上不可用。 .. method:: image.morph(size, kernel, [mul, [add=0, [threshold=False, [offset=0, [invert=False, [mask=None]]]]]]) 通过过滤器内核对图像进行卷积。这允许您对图像执行通用卷积。 ``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图像。 .. method:: 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图像。 .. method:: 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 上不可用。 .. method:: 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 上不可用。 .. method:: image.linpolar([reverse=False]) 图像从笛卡尔坐标到线性极坐标重新投影。 设置 ``reverse = True`` 可以在相反的方向重新投影。 线性极坐标重新投影将图像旋转转换为x平移。 不支持压缩图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: image.logpolar([reverse=False]) 图像从笛卡尔坐标到对数极坐标重新投影。 设置 ``reverse = True`` 可以在相反的方向重新投影。 对数极坐标重新投影将图像的旋转转换为x平移和缩放到y平移。 不支持压缩图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: image.lens_corr([strength=1.8, [zoom=1.0, [x_corr=0.0, [y_corr=0.0]]]]) 进行镜头畸变校正,以去除镜头造成的图像鱼眼效果。 ``strength`` 是一个浮点数,该值确定了对图像进行去鱼眼效果的程度。在默认情况下,首先试用取值1.8,然后调整这一数值使图像显示最佳效果。 ``zoom`` 是在对图像进行缩放的数值。默认值为 1.0 。 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 .. method:: 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, [fov=60.0, [corners]]]]]]]]) 通过执行帧缓冲区的3D旋转来纠正图像中的透视问题。 ``x_rotation`` 是围绕x轴在帧缓冲器中旋转图像的度数(这使图像上下旋转)。 ``y_rotation`` 是帧缓冲区中围绕y轴旋转图像的度数(即左右旋转图像)。 ``z_rotation`` 是围绕z轴在帧缓冲器中旋转图像的度数(即,使图像旋转到适当位置)。 ``x_translation`` 是旋转后将图像移动到左侧或右侧的单位数。因为这个变换是应用在三维空间的,单位不是像素... ``y_translation`` 是旋转后将图像上移或下移的单位数。因为这个变换是应用在三维空间的,单位不是像素... ``zoom`` 是通过图像缩放的量。默认情况下1.0。 ``fov`` 是在 3D 空间中旋转图像之前进行 2D->3D 投影时在内部使用的视场。 当这个值接近 0 时,图像被放置在远离视口的无穷远处。 当这个值接近 180 时,图像被放置在视口内。 通常,您不应更改此值,但可以修改它以更改 2D->3D 映射效果。 ``corners`` 是四个 (x,y) 元组的列表,表示用于创建 4 点的四个角对应单应性, 将第一个角映射到 (0, 0),第二个角映射到 (image_width-1, 0), 第三个角映射到 (image_width-1, image_height-1),第四个角映射到 (0, image_height -1). 然后在重新映射图像后应用 3D 旋转。 此参数允许您使用 `rotation_corr` 来执行诸如鸟瞰图变换之类的操作。例如:: top_tilt = 10 # 如果top/bottom_tilt之间的差异变得很大,这个方法将停止工作 bottom_tilt = 0 points = [(tilt, 0), (img.width()-tilt, 0), (img.width()-1-bottom_tilt, img.height()-1), (bottom_tilt, img.height()-1)] img.rotation_corr(corners=points) 返回图像对象,以便您可以使用 ``.`` 表示法调用另一个方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: image.get_histogram([thresholds, [invert=False, [roi, [bins, [l_bins, [a_bins, [b_bins, [difference]]]]]]]]) 在 ``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通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 .. note:: 获取所跟踪对象的阈值,只需在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图像。 .. method:: image.get_statistics([thresholds, [invert=False, [roi, [bins, [l_bins, [a_bins, [b_bins, [difference]]]]]]]]) 计算 ``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通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 .. note:: 获取所跟踪对象的阈值,只需在IDE帧缓冲区中选择(单击并拖动)跟踪对象。 直方图会相应地更新到所在区域。然后只需写下颜色分布在每个直方图通道中起始与下降位置。 这些将是 ``thresholds`` 的低值和高值。 由于上下四分位数据相差微小,故手动确定阈值为佳。 您还可以通过进入OpenMV IDE中的 ``工具 ->机器视觉 ->阈值编辑器`` 并从GUI窗口中拖动滑块来确定颜色阈值。 ``invert`` 反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。 您可以在需要获取图像中一个像素区域信息时使用这一方法。例如:若您想用帧差法来检测运动时, 您需要使用这一方法来确定图像颜色通道的变化,从而触发运动检测阈值。 ``roi`` 是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于 ``roi`` 区域内的像素。 ``bins`` 和其他bin是用于直方图通道的箱数。对于灰度图像,使用 ``bins`` , 对于RGB565图像,使用其他每个通道。每个通道的bin计数必须大于2。 另外,将bin计数设置为大于每个通道的唯一像素值的数量是没有意义的。 默认情况下,直方图将具有每个通道的最大bin数。 不支持压缩图像和bayer图像。 .. method:: 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` 对象。如何轻松运用直线对象, 详见下博文: 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 L,A和B通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 .. note:: 获取所跟踪对象的阈值,只需在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图像。 .. method:: 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, [x_hist_bins_max=0, [y_hist_bins_max=0]]]]]]]]]]]]) 查找图像中所有色块,并返回一个包括每个色块的色块对象的列表。请观察 ``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通道的最小值和最大值。 为方便使用,此功能将自动修复交换的最小值和最大值。 此外,如果元组大于六个值,则忽略其余值。相反,如果元组太短,则假定其余阈值处于最大范围。 .. note:: 获取所跟踪对象的阈值,只需在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以防止色块合并。 ``x_hist_bins_max`` 如果设置为非零值,则使用对象中所有列的 x_histogram 投影填充每个 blob 对象中的直方图缓冲区。 然后该值设置该投影的箱数。 ``y_hist_bins_max`` 如果设置为非零,则使用对象中所有行的 y_histogram 投影填充每个 blob 对象中的直方图缓冲区。 然后该值设置该投影的箱数。 不支持压缩图像和bayer图像。 .. method:: 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 上不可用。 .. method:: 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库(也被OpenCV使用)来查找图像中的线段。这有点慢,但是非常准确,线段不会跳跃。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: 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`` 控制检测到的最小圆半径。增加此值可以加速算法。默认为2。 ``r_max``控制检测到的最大圆半径。减少此值可以加快算法。默认为 min(roi.w/2, roi.h/2)。 ``r_step`` 控制如何逐步检测半径。默认为2。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: 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 上不可用。 .. method:: 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 上不可用。 .. method:: 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方向上图像的焦距和中心点。 .. note:: 使用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` 标签家族。注意:每启用一个标签家族, `image.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 上不可用。 .. method:: 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 上不可用。 .. method:: 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` (RSS-14) * `image.DATABAR_EXP` (RSS-Expanded) * `image.CODABAR` * `image.CODE39` * `image.PDF417` * `image.CODE93` * `image.CODE128` ``roi`` 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即整幅图像的图像矩形。操作范围仅限于 ``roi`` 区域内的像素。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: 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图像。 .. note:: 请在长宽一致的图像(例如``sensor.B64X64``)上使用此方法。 不支持压缩图像和bayer图像。 此方法在OpenMV Cam M4 上不可用。 .. method:: 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`` 。 仅支持灰度图像。 .. method:: 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`` 区域内的像素。 .. method:: 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`` 区域内的像素。 仅支持灰度图像。 .. method:: image.find_lbp(roi) 从ROI元组(x, y, w, h)中提取LBP(局部二值模式)键点。您可以使用 `image.match_descriptor` 函数来比较两组关键点,以获取匹配距离。 ``roi`` 是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于 ``roi`` 区域内的像素。 仅支持灰度图像。 .. method:: 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` 或 `image.CORNER_AGAST` 。FAST角点检测器运行速度更快,但其准确度较低。 仅支持灰度图像。 .. method:: image.find_edges(edge_type, [threshold]) 将图像变为黑白,仅将边缘保留为白色像素。 * image.EDGE_SIMPLE - 简单的阈值高通滤波算法 * image.EDGE_CANNY - Canny边缘检测算法 ``threshold`` 是一个包含一个低阈值和一个高阈值的二值元组。您可以通过调整该值来控制边缘质量。 默认为 (100, 200)。 仅支持灰度图像。 .. method:: find_hog([roi, [size=8]]) 用HOG(定向梯度直方图)线替换ROI中的像素。 ``roi`` 是感兴趣区域的矩形元组(x,y,w,h)。如果未指定,ROI即整个图像的图像矩形。 操作范围仅限于 ``roi`` 区域内的像素。 仅支持灰度图像。 此方法在OpenMV Cam M4 上不可用。 常量 --------- .. data:: image.BINARY BINARY(位图)像素格式。 每个像素为 1 位。 .. data:: image.GRAYSCALE 灰度像素格式。 每个像素为 8 位、1 字节。 .. data:: image.RGB565 RGB565 像素格式。 每个像素为 16 位、2 字节。 5 位用于红色, 6 位用于绿色,5 位用于蓝色。 .. data:: image.BAYER RAW BAYER 图像像素格式。 如果您尝试使帧大小太大而无法放入帧缓冲区,您的 OpenMV Cam 会将像素格式设置为 BAYER,以便您可以捕获图像,但没有图像处理方法可操作。 .. data:: image.JPEG JPEG 图像。 .. data:: image.AREA 缩小图像时使用区域缩放(最近邻用于放大)。 缩小时您应该使用区域缩放以获得最高的视觉质量。 .. data:: image.BILINEAR 放大图像时使用双线性缩放。 这会产生高质量的缩放图像输出并且速度很快。 当缩小图像时,此方法将对输入图像进行二次采样以生成缩小图像。 如果速度不是问题,请使用 `image.AREA` 以获得最高质量的缩小。 .. data:: image.BICUBIC 放大图像时使用双三次缩放。 这会产生高质量的缩放图像输出,但速度很慢。 当缩小图像时,此方法将对输入图像进行二次采样以生成缩小图像。 如果速度不是问题,请使用 `image.AREA` 以获得最高质量的缩小。 .. data:: image.CENTER 使用 `draw_image` 将要绘制的图像锚定在中心而不是左上角。 .. data:: image.EXTRACT_RGB_CHANNEL_FIRST 当使用 `draw_image` 从 RGB 图像中提取 RGB 通道时,在缩放之前先提取通道,然后再提取通道,以防止出现任何伪影。 .. data:: image.APPLY_COLOR_PALETTE_FIRST 当使用 `draw_image` 将颜色查找表应用于图像时,先在缩放之前应用颜色查找表,然后再应用颜色查找表,以防止出现任何伪影。 .. data:: image.BLACK_BACKGROUND 在使用需要读取源像素和目标像素的 alpha 效果时,在黑色目标图像上绘制时加速 `draw_image`。 这会跳过读取目标像素。 .. data:: image.SEARCH_EX 详尽的模板匹配搜索。 .. data:: image.SEARCH_DS 更快的模板匹配搜索。 .. data:: image.EDGE_CANNY 使用Canny边缘检测算法对图像进行边缘检测。 .. data:: image.EDGE_SIMPLE 使用阈值高通滤波算法对图像进行边缘检测。 .. data:: image.CORNER_FAST 用于ORB键点的高速低准确率角点检测算法 .. data:: image.CORNER_AGAST 用于ORB键点的低速高准确率算法。 .. data:: image.TAG16H5 TAG1H5标签群的位掩码枚举。用于AprilTags。 .. data:: image.TAG25H7 TAG25H7标签群的位掩码枚举。用于AprilTags。 .. data:: image.TAG25H9 TAG25H9标签群的位掩码枚举。用于AprilTags。 .. data:: image.TAG36H10 TAG36H10标签群的位掩码枚举。用于AprilTags。 .. data:: image.TAG36H11 TAG36H11标签群的位掩码枚举。用于AprilTags。 .. data:: image.ARTOOLKIT ARTOOLKIT标签群的位掩码枚举。用于AprilTags。 .. data:: image.EAN2 EAN2条形码类型枚举。 .. data:: image.EAN5 EAN5条形码类型枚举。 .. data:: image.EAN8 EAN8条形码类型枚举。 .. data:: image.UPCE UPCE条形码类型枚举。 .. data:: image.ISBN10 ISBN10条形码类型枚举。 .. data:: image.UPCA UPCA条形码类型枚举。 .. data:: image.EAN13 EAN13条形码类型枚举。 .. data:: image.ISBN13 ISBN13条形码类型枚举。 .. data:: image.I25 I25条形码类型枚举。 .. data:: image.DATABAR DATABAR条形码类型枚举。 .. data:: image.DATABAR_EXP DATABAR_EXP条形码类型枚举。 .. data:: image.CODABAR CODABAR条形码类型枚举。 .. data:: image.CODE39 CODE39条形码类型枚举。 .. data:: image.PDF417 PDF417条形码类型枚举(目前尚不能运行)。 .. data:: image.CODE93 CODE93条形码类型枚举。 .. data:: image.CODE128 CODE128条形码类型枚举。