K210----openMV连体学习---04.图像的相关处理

本文介绍了如何在K210和OpenMV4平台上进行图像处理,包括颜色二值化滤波,用于将图像转化为黑白二值图像;锐化滤波,增强图像边缘;以及图像翻转,实现水平、垂直或对角线翻转。提供了相关函数的构造参数和官方示例代码,适合初学者参考学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言:

一、颜色二值化滤波:

二、锐化滤波:

三、图像翻转:


前言:

本人所用为01 studio的pyAi-K210和pyAI-OpenMV4,本人在学习完K210后,学习openMV时发现很多实验K210和openMV可以一起学习,所以写下此篇分享,本人基本都是个人笔记,非常希望有大佬提出错误和改进之处,但大佬轻喷哈!!!

----------------------------------------------------------我是分割线--------------------------------------------------------

前面我们学习了,'03.特征检测' 但是会发现在检测过程中图形会有千奇百怪的问题出现,于是就会想对拍摄到的图像进行提取,而接下来我们将学习,对图像的锐化,二值化等等。

一、颜色二值化滤波:

图形的二值化滤波是指将灰度图像转化为二值图像(只有黑和白两个灰度)的图像处理技术。

设置一个门限值,大于该值的灰度像素变为白色,小于该值的灰度像素变为黑色。常用的二值化方法有固定阈值法、自适应阈值法等。
 

构造函数

image.binary(thresholds,invert=False[,zerp=Falese[,mask=None[,to_bitmap=False[,copy=False]]]]])

        【thresholds】必须是元组列表。 (lo, hi) 定义你想追踪的颜色范围。对于灰 度图像,每个元组需要包含两个值:最小灰度值和最大灰度值。

        【invert】如果为 True,则 0 1(黑 白)反转;默认 False 不反转。

        【zero】是否将阈值之间的像素变为0(黑色)。默认False,阈值之间为原始数据。

        【mask】掩码图像,只对掩码内非零位置的像素进行阈值化。默认None表示处理整幅图像。

        【to_bitmap】是否转换为位图格式,默认False

        【copy】是否复制图像而不是在原图上操作。默认False,即直接在输入图像上修改。

使用方法直接调用该函数。

官方例程如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
二值化滤波处理
'''
import sensor, image, time
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.skip_frames(time = 2000)
clock = time.clock()
# 可以使用 工具-> 机器视觉 -> 阈值编辑器 来调整阈值.
red_threshold = (0,100, 0,127, 0,127) # L A B
green_threshold = (0,100, -128,0, 0,127) # L A B
blue_threshold = (0,100, -128,127, -128,0) # L A B
while(True):
    # Test red threshold
    for i in range(100):
        clock.tick()
        img = sensor.snapshot()
        img.binary([red_threshold])
        print(clock.fps())
 
'''
    # Test green threshold
    for i in range(100):
        clock.tick()
        img = sensor.snapshot()
        img.binary([green_threshold])
        print(clock.fps())

    # Test blue threshold
    for i in range(100):
        clock.tick()
        img = sensor.snapshot()
        img.binary([blue_threshold])
        print(clock.fps())

    # Test not red threshold
    for i in range(100):
        clock.tick()
        img = sensor.snapshot()
        img.binary([red_threshold], invert = 1)
    print(clock.fps())

    # Test not green threshold
    for i in range(100):
        clock.tick()
        img = sensor.snapshot()
        img.binary([green_threshold], invert = 1)
        print(clock.fps())

    # Test not blue threshold
    for i in range(100):
        clock.tick()
        img = sensor.snapshot()
        img.binary([blue_threshold], invert = 1)
        print(clock.fps())
'''


# todo 以上代码对 K210和OpenMV4 均适用

二、锐化滤波:

构造函数

image.laplacian(size[,sharpen=False[,mul[,add=0[,threshold=False[,offset=0[,mask=None]]]]]]])

        【size】内核大小。1(3×3),2(5×5))或者更高值;

        【sharpen】如果为Ture,则为锐化图形。

        【mul】与原图混合时的乘数,默认为1

        【add】与原图混合时的加数,默认为0。

        【threshold】是否对拉普拉斯图像进行二值化,默认不进行。

        【offset】二值化时阈值偏移量,与threshold一起使用。

        【mask】掩码图像,只对掩码内非零位置进行滤波。默认None表示处理整幅图像。

使用方法直接调用函数

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
锐化滤波处理
'''

import sensor, image, time
#摄像头初始化
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.RGB565
sensor.set_framesize(sensor.QQVGA) # or sensor.QVGA (or others)
sensor.skip_frames(time = 2000) # Let new settings take affect.
clock = time.clock() # Tracks FPS.
while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # Take a picture and return the image.
    # 运行拉普拉斯内核.
    img.laplacian(1, sharpen=True)
    print(clock.fps()) #打印 FPS



# todo 以上代码 OpenMV4和K210 均可使用

三、图像翻转:

构造函数

image.replace(image[,hmirror=False[,vflip=False[,transpose=False[.mask=None]]]])

        【image】要操作的图形对象;

        【hmirror】如果为Ture,则水平镜像转替换图形。

        【vflip】如果为Ture,则垂直翻转替换图形。

        【transpose】如果为 True,则沿对角线翻转图像。

使用方法

直接调用该函数。

例:

vflip=False, hmirror=False, transpose=False -> 旋转 0°

vflip=True, hmirror=False, transpose=True -> 旋转 90°

vflip=True, hmirror=True, transpose=False -> 旋转 180°

vflip=False, hmirror=True, transpose=True -> 旋转 270°

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
将图像进行各种翻转
'''
import sensor, image, time, pyb
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
mills = pyb.millis()
counter = 0
while(True):
    clock.tick()
    img = sensor.snapshot().replace(vflip=(counter//2)%2,
hmirror=(counter//4)%2,transpose=(counter//8)%2)
    # 也可以手动修改参数观察图像变化情况。
    #img = sensor.snapshot().replace(vflip=False,hmirror=False, transpose=False)
    if (pyb.millis() > (mills + 1000)):
        mills = pyb.millis()
        counter += 1
    print(clock.fps())




# todo 以上代码对 K210和OpenMV4 均适用

<think>好的,我现在需要帮助用户找到OpenMV实现二值化巡线转弯的示例代码。首先,用户的问题是关于使用OpenMV进行二值化处理来实现巡线和转弯的。我需要先回忆一下OpenMV相关知识,特别是图像处理和巡线算法的部分。 根据用户提供的引用内容,尤其是引用[2],用户提到在电赛中使用OpenMV巡线,并且参考了B站上一位做送药小车的老哥的思路。这说明用户可能希望有一个实际可用的代码示例,而不仅仅是理论上的讲解。同时,用户强调需要二值化处理,所以代码中应该包含图像二值化的步骤。 首先,二值化处理是将图像转换为黑白两色,通常是通过设定一个阈值,将像素转换为黑色或白色。这在OpenMV中可以通过使用`image.binary()`方法来实现,或者使用颜色阈值来截取特定颜色区域。巡线通常需要识别路径的边界,例如黑色赛道上的白色线,或者白色地面上的黑色线,这取决于实际环境。 接下来,巡线转弯需要计算线条的位置,判断是否需要转向。常见的方法包括计算线条的中心点,或者检测线条的拐点。例如,使用线性回归(`get_regression()`)来拟合线条,得到线条的斜率和中点,从而判断车辆应该左转还是右转。 用户可能需要一个具体的代码框架,包括初始化摄像头、图像捕获、二值化处理、线条检测、方向判断以及控制电机或舵机的部分。代码的结构可能如下: 1. 导入必要的库,比如`pyb`用于控制硬件。 2. 初始化摄像头和串口通信(如果需要与主控板通信)。 3. 定义颜色阈值,进行二值化处理。 4. 在循环中捕获图像处理图像,检测线条。 5. 根据线条的位置或角度计算转向量。 6. 通过PWM或串口发送控制信号给电机或舵机。 需要注意,二值化可能需要根据实际环境调整阈值,例如使用`THRESHOLD = (0, 50)`来将暗色区域转为白色,亮色转为黑色。或者可能需要反转二值化的结果,具体取决于赛道的颜色。 另外,用户提到的转弯可能需要检测线条的拐点或斜率变化。例如,当线条的斜率超过某个阈值时,表示需要转弯。或者当线条的中心点偏离图像中心较多时,调整转向。 还需要考虑如何控制舵机或电机。例如,使用PID控制算法来平滑转向,避免过度调整。但示例代码可能简化这部分,直接根据偏移量设置舵机角度。 可能遇到的挑战包括环境光线变化影响二值化效果,需要自动阈值调整或使用自适应方法。但用户可能只需要基础代码,所以示例中可能使用固定阈值。 最后,结合引用[2]中的经验,用户可能需要清晰的思路和代码结构,而不是复杂的函数组合。因此,示例代码应简洁,重点展示二值化处理、线条检测和转向控制的关键步骤,并提供必要的注释说明。</think>以下是一个基于OpenMV二值化巡线转弯示例代码,结合电赛常用思路和图像处理基础: ```python import sensor, image, time, pyb # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) # 使用灰度图 sensor.set_framesize(sensor.QQVGA) # 160x120分辨率 sensor.skip_frames(time=2000) # 定义二值化阈值(根据实际环境调整) THRESHOLD = (0, 50) # 将暗色区域转为白色,亮色转为黑色 # 创建舵机对象(假设舵机接在P7引脚) steer_servo = pyb.Servo(1) # 舵机通道1 while(True): img = sensor.snapshot().binary([THRESHOLD]) # 二值化处理 # 使用线性回归检测线条 line = img.get_regression([(255,255)], robust=True) if line: # 计算偏移量:图像中心x坐标=80 offset = line.x1() - 80 # 控制转向(比例系数根据实际调整) steer_angle = offset * 0.5 steer_servo.angle(steer_angle + 90) # 转换为舵机角度 # 绘制检测线 img.draw_line(line.line(), color=127) else: # 未检测到线时保持直行 steer_servo.angle(90) ``` ### 代码说明: 1. **二值化处理**:通过`.binary()`方法将图像转换为黑白二值图,阈值范围需要根据实际赛道颜色调整[^2] 2. **线条检测**:`get_regression()`方法使用ROBUST算法拟合直线,返回包含线段坐标的`line`对象 3. **转向控制**:通过计算线条中心与画面中心的水平偏移量(`offset`),按比例转换为舵机转角 4. **异常处理**:当丢失巡线时,舵机回中保持直行状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广寒学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值