摄像头初始化完整
#导入常用库
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)) # 绘制红色矩形