openmv/openart学习笔记

devtools/2025/3/25 21:25:33/

摄像头初始化完整

#导入常用库
import sensor
import time
import math
import image#重置摄像头,通常在开始时调用
sensor.reset()
#设置摄像头的像素格式。format取值:sensor.RGB565,sensor.GRAYSCALE,sensor.YUV422
sensor.set_pixformat(format)
#设置图像的帧大小(分辨率)。size常用取值:sensor.QQVGA: 160x120 ,sensor.QVGA: 320x240 , sensor.VGA: 640x480 ,sensor.QQVGA2: 128x160 (用于LCD扩展板)
sensor.set_framesize(size)
#跳过一定数量的帧or等待一定时间
sensor.skip_frames(time=2000)
'''''''''''''''''''''''''''''''''''以上顺序固定且为最前'''''''''''''''''''''''''''''''''''
#自动增益。enable:是否启用(True 或 False) ,gain_db:可选,手动增益值(dB)。Ex:sensor.set_auto_gain(False, gain_db=8)
sensor.set_auto_gain(enable, gain_db=None)
#自动曝光。enable:是否启用(True 或 False) ,exposure_us:可选,手动曝光时间(微秒)。Ex:sensor.set_auto_exposure(False, exposure_us=5000)    
sensor.set_auto_exposure(enable, exposure_us=None)
#自动白平衡。enable:是否启用(True 或 False) ,rgb_gain_db:可选,手动设置 RGB 增益值。Ex:sensor.set_auto_whitebal(False, rgb_gain_db=(8, 8, 8))
sensor.set_auto_whitebal(enable, rgb_gain_db=None)
#图像水平翻转。enable:是否启用(True 或 False)
sensor.set_hmirror(enable)
#图像垂直翻转。enable:是否启用(True 或 False)
sensor.set_vflip(enable)
'''''''''''''''''''''''''''''''''''以上为其他常用设置'''''''''''''''''''''''''''''''''''#拍摄一张照片,返回值是一个 image.Image 对象,包含了很多可以访问和操作图像数据的方法,比如获取单个像素值、绘制形状、检测颜色块等
img = sensor.snapshot()

image.Image 对象

创建了一个对象img

img = sensor.snapshot()

img的API

1. 图像属性
#获取图像宽度(以像素为单位)
width = img.width()
print("Width:", width)
#获取图像高度(以像素为单位)
height = img.height()
print("Height:", height)
#获取图像的像素格式
fmt = img.format()
print("Format:", fmt)
2. 像素操作 
#get_pixel(x, y) 获取指定位置的像素值
pixel_value = img.get_pixel(100, 100)
print("Pixel Value at (100, 100):", pixel_value)
#set_pixel(x, y, color) 设置指定位置的像素为指定颜色值
img.set_pixel(100, 100, (255, 0, 0))  # 设置为红色
3. 图像绘制
#在图像上绘制一条线 draw_line(x1, y1, x2, y2, color)
img.draw_line(0, 0, 100, 100, (255, 255, 255))  # 白色线条
#在图像上绘制一个矩形 draw_rectangle(x, y, w, h, color)
img.draw_rectangle(50, 50, 100, 100, (0, 255, 0))  # 绿色矩形
#在图像上绘制一个圆形 draw_circle(x, y, r, color)
img.draw_circle(100, 100, 20, (0, 0, 255))  # 蓝色圆形
#在图像上绘制文本 draw_string(x, y, text, color)
img.draw_string(10, 10, "Hello", (255, 255, 255))  # 白色文本
4. 图像过滤和变换
#将图像转换为二值图像,基于给定的阈值 binary(thresholds)
thresholds = (100, 255)  # 灰度阈值
img_binary = img.binary([thresholds])
#反转图像颜色 invert()
img.invert()  # 反转颜色
#计算图像的平均颜色值,或者计算感兴趣区域的平均值 mean(roi=None)
average = img.mean()  # 整个图像的平均值
print("Average Color:", average)
#将图像转换为灰度图 to_grayscale()
img_gray = img.to_grayscale()
#将图像转换为 RGB565 格式 to_rgb565()
img_rgb565 = img.to_rgb565()
5. 图像特征检测(此项简单列出,之后详细介绍)
#查找图像中的颜色块 find_blobs(thresholds, roi=None, x_stride=2, y_stride=1)
thresholds = [(30, 100, 15, 127, 15, 127)]  # LAB颜色空间阈值
blobs = img.find_blobs(thresholds)
for blob in blobs:img.draw_rectangle(blob.rect())  # 绘制颜色块的边界img.draw_cross(blob.cx(), blob.cy())  # 在中心绘制十字#检测图像中的边缘 find_edges(threshold)
edges = img.find_edges(image.EDGE_CANNY)  # 使用 Canny 边缘检测#查找图像中的圆形 find_circles(thresholds, x_margin, y_margin)
thresholds = (150, 255)  # 圆形检测的阈值
circles = img.find_circles(thresholds, 5, 10, 100)  # 检测圆形#查找图像中的矩形 find_rects(threshold)
rects = img.find_rects()  # 查找矩形
for rect in rects:img.draw_rectangle(rect.rect())  # 绘制矩形边界
 6. 统计信息
#获取图像或感兴趣区域的统计信息 get_statistics(roi=None)
stats = img.get_statistics()
print("Mean:", stats.mean())
print("Max:", stats.max())
print("Min:", stats.min())
 7. 图像输入/输出
#将图像保存到指定路径 save(path)
img.save("output.jpg")  # 保存为 JPEG 格式
#将图像压缩为 JPEG 格式,并返回压缩后的数据 compress(quality=90)
jpeg_data = img.compress(quality=90)  # 压缩图像
#将图像转换为字节数组 to_bytes()
byte_array = img.to_bytes()  # 转换为字节数组
8. 感兴趣区域(ROI) 
#截取图像中的某个区域 crop(x, y, w, h)
cropped_img = img.crop(10, 10, 50, 50)  # 截取 50x50 区域
#使用二进制图像作为掩膜,遮盖某些区域 mask(image)
mask_img = img.binary([(0, 100)])  # 创建二值掩膜
img.mask(mask_img)  # 应用掩膜
 9. 其他图像变换
#对图像进行旋转校正 rotation_corr(corners)
# 旋转校正示例
corners = [(0, 0), (0, img.height()), (img.width(), img.height()), (img.width(), 0)]
img.rotation_corr(corners)
#对图像应用仿射变换 warp_affine()

img.find_blobs()

完整用法:

blobs = find_blobs(thresholds, invert=False, roi=None, x_stride=1, y_stride=1, area_threshold=10, pixels_threshold=10, merge=False, margin=0
)
thresholds:
类型:list of tuples
作用:指定颜色阈值的列表,每个元组定义一个颜色范围。可以是灰度值范围或 RGB 值范围,具体取决于摄像头的工作模式(如灰度模式或 RGB 模式)。
例子:
在灰度模式下,thresholds = [(lower, upper)],如 [(128, 255)] 表示灰度值在 128 到 255 之间。
在 RGB 模式下,thresholds = [(L_min, L_max, A_min, A_max, B_min, B_max)],如 [(30, 100, 15, 127, 15, 127)]。invert:
类型:bool
作用:如果设为 True,则寻找未在阈值范围内的颜色块(反转阈值)。
默认值:Falseroi:
类型:tuple
作用:指定感兴趣区域,格式为 (x, y, w, h)。如果不指定,则在整个图像中查找。
默认值:Nonex_stride:
类型:int
作用:横向步长,设置为大于 1 可以跳过一些像素,提高速度但降低精度。
默认值:1y_stride:
类型:int
作用:纵向步长,作用同 x_stride。
默认值:1area_threshold:
类型:int
作用:最小的颜色块面积(像素数),低于此值的颜色块会被忽略。
默认值:10pixels_threshold:
类型:int
作用:颜色块中像素数量的最小值,低于此值的颜色块会被忽略。
默认值:10merge:
类型:bool
作用:是否将邻近的颜色块合并为一个。设为 True 时会合并相邻的颜色块。
默认值:Falsemargin:
类型:int
作用:当 merge=True 时,定义颜色块之间的最小间隔,如果距离小于此值则合并。
默认值:0

返回值:

返回的是一个包含字典的列表 (list of dicts)。每个字典表示找到的一个颜色块(Blob),包括该块的各种信息,字典的结构大致如下:

{'x': int,         # 区域的x坐标'y': int,         # 区域的y坐标'w': int,         # 区域的宽度'h': int,         # 区域的高度'pixels': int,    # 区域中像素的数量'cx': int,        # 区域的中心x坐标'cy': int,        # 区域的中心y坐标'rotation': float,# 区域的旋转角度'code': int,      # 区域的颜色代码'count': int      # 合并的区域数量
}

自定义函数:

find_max(blobs)

作用:找到最大色块

参数:包含多个色块字典的列表 (list of dicts)

返回值:一个色块的字典

#函数原型
def find_max(blobs):max_size=0for blob in blobs:if blob[2]*blob[3] > max_size:max_blob=blobmax_size = blob[2]*blob[3]return max_blob
#用法
max_red_blob = find_max(red_blobs)

 img.find_edges()

完整用法:

edges = img.find_edges(method, threshold=100)
method:
指定边缘检测算法的类型。常见的方法有:
image.EDGE_CANNY: Canny 边缘检测算法,效果通常较好,适用于多种场景。
image.EDGE_SOBEL: Sobel 边缘检测,强调图像中的梯度变化。threshold:
边缘检测的阈值(默认为 100)。该值用于控制检测的灵敏度。阈值越高,检测到的边缘越少;阈值越低,检测到的边缘越多。

返回值:

edges 是一个 image.Image 对象,这意味着 edges 也是一个图像对象

该对象的像素数据由边缘(白色)和非边缘(黑色)组成

img.find_circles() 

完整用法:

# 设置颜色阈值和圆的参数
thresholds = (30, 100, 15, 127, 15, 127)  # LAB 颜色阈值
x_margin = 5
y_margin = 5
r_margin = 2
r_min = 5
r_max = 50circles = img.find_circles(thresholds, x_margin, y_margin, r_margin, r_min, r_max)
thresholds:
一个包含色彩阈值的元组,用于识别要检测的颜色区域。通常形式为 (low, high),表示颜色的范围。
例如,可以使用 LAB 或 RGB 色彩空间的值。x_margin:
允许在水平方向上偏移的最大像素数,用于匹配检测的圆的中心。这个值越大,允许的偏差越大,可能导致更多的圆被检测到。y_margin:
允许在垂直方向上偏移的最大像素数,作用与 x_margin 相同。r_margin:
允许的半径偏差。这个值越大,可以检测到的半径范围越宽。r_min:
检测的最小圆半径(以像素为单位)。任何小于这个值的圆形都不会被检测到。r_max:
检测的最大圆半径(以像素为单位)。任何大于这个值的圆形都不会被检测到。

 返回值:

circles 是一个列表,其中每个元素是一个圆形对象

每个圆形对象都提供方法 x()y()r() 来获取圆心坐标和半径

# 遍历检测到的圆形
for circle in circles:cx = circle.x()  # 获取圆心 x 坐标cy = circle.y()  # 获取圆心 y 坐标r = circle.r()    # 获取圆的半径

img.find_rects() 

完整用法:

rects = img.find_rects(thresholds, x_margin=0, y_margin=0, area_threshold=10
)
thresholds:
一个包含色彩阈值的元组,用于识别要检测的颜色区域。通常形式为 (low, high),表示颜色的范围,可以使用 LAB 或 RGB 色彩空间的值。x_margin:
允许在水平方向上偏移的最大像素数,用于匹配检测的矩形的边界。这个值越大,允许的偏差越大,可能导致更多的矩形被检测到。y_margin:
允许在垂直方向上偏移的最大像素数,作用与 x_margin 相同。area_threshold:
矩形的最小面积(以像素为单位)。小于这个面积的矩形将不会被检测到。

返回值:

rects 是一个列表,包含多个矩形对象。每个矩形对象提供了有关矩形的信息,包括其位置和尺寸。

x(): 返回矩形左上角的 x 坐标(以像素为单位)

y(): 返回矩形左上角的 y 坐标(以像素为单位)

w(): 返回矩形的宽度(以像素为单位)

h(): 返回矩形的高度(以像素为单位)

矩形的完整边界:

rect(): 返回一个元组,包含矩形的完整边界信息,格式为 (x, y, w, h)

 for rect in rects:x = rect.x()  # 获取矩形左上角 x 坐标y = rect.y()  # 获取矩形左上角 y 坐标w = rect.w()   # 获取矩形宽度h = rect.h()   # 获取矩形高度print(f"Rectangle found: Position=({x}, {y}), Size=({w}, {h})")# 在图像上绘制这些矩形img.draw_rectangle(rect.rect(), color=(255, 0, 0))  # 绘制红色矩形


http://www.ppmy.cn/devtools/169030.html

相关文章

代码社区开源协议

开源协议是一种法律文件,用于规定开源软件的使用、修改和分发条件。它平衡了开发者和使用者的权益,同时推动开放协作与技术创新。以下是常见的开源协议及其特点和适用场景: 常见开源协议列表及介绍 1. MIT License 特点:非常宽…

数据库与其所用数据结构

数据库系统的高效增删改查(CRUD)依赖于多种底层数据结构和优化机制。以下是数据库中使用的主要数据结构及其在CRUD中的关键知识点: 一、数据库核心数据结构 1. B树/B树 • 用途:索引结构(如MySQL的InnoDB索引、Oracl…

MQ,RabbitMQ,MQ的好处,RabbitMQ的原理和核心组件,工作模式

1.MQ MQ全称 Message Queue(消息队列),是在消息的传输过程中 保存消息的容器。它是应用程序和应用程序之间的通信方法 1.1 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理&#xff0…

React初学分享 事件绑定 组价通信 useState useEffect

React初学 React介绍快速搭建React项目JSXJSX的本质优势:JSX中使用JS表达式JSX中的列表渲染JSX实现简单条件渲染JSX实现复杂条件渲染 React中的事件绑定React基础事件绑定传递自定义参数同时传递事件对象和自定义参数 React中的组件useState修改状态的规则状态不可变…

webpack等构建工具如何支持移除未使用的代码

Webpack 等构建工具通过 Tree Shaking(摇树优化)和 Dead Code Elimination(无用代码消除)技术来移除未使用的代码。以下是具体实现原理、配置方法及最佳实践: 一、Tree Shaking 的原理 Tree Shaking 是一种基于 ES Mo…

STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构

目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层(Perception Layer) 2. 网络层(Network Layer) …

【小项目】四连杆机构的Python运动学求解和MATLAB图形仿真

任务 Python运动学解算 from math import cos, sin, pi, sqrt, atan2 from matplotlib import pyplot as plt import matplotlib import pandas as pd """ 变量说明: 位置s 速度v 加速度a 角度phi 角速度omega 角加速度alpha 杆长l 其中位置…

MATLAB 控制系统设计与仿真 - 26

状态空间控制系统概述 状态空间描述 现代控制理论是建立在状态空间基础上的控制系统分析和设计理论,它用状态变量来刻画系统的内部特征,用‘一节微分方程组’来描述系统的动态特性。系统的状态空间模型描述了系统输入/输出与内部状态之间的关系&#x…