openmv识别颜色是红色并通过串口返回坐标

import sensor, image, time, math, pyb
from pyb import UART, LED
import json
import ustruct

# 摄像头初始化
sensor.reset()  # 重置摄像头
sensor.set_pixformat(sensor.RGB565)  # 设置图像格式为RGB565
sensor.set_framesize(sensor.QVGA)  # 设置图像分辨率为QVGA(320x240)
sensor.skip_frames(time=2000)  # 跳过2000毫秒以让摄像头稳定
sensor.set_auto_gain(False)  # 禁用自动增益
sensor.set_auto_whitebal(False)  # 禁用自动白平衡
red_threshold_01 = (10, 100, 127, 32, -43, 67)  # 定义红色区域的阈值范围
clock = time.clock()  # 创建一个时钟对象用于计时

# UART初始化
uart = UART(3, 115200)  # 初始化UART3,波特率设置为115200
uart.init(115200, bits=8, parity=None, stop=1)  # 设置UART的参数

def find_max(blobs):
    max_size = 0  # 初始化最大blob的大小
    max_blob = None  # 初始化最大blob
    for blob in blobs:  # 遍历所有检测到的blob
        if blob.pixels() > max_size:  # 如果当前blob的像素数量大于最大值
            max_blob = blob  # 更新最大blob
            max_size = blob.pixels()  # 更新最大值
    return max_blob  # 返回像素数量最多的blob

def send_data(cx, cy, cw, ch):
    data = ustruct.pack("<bbhhhhb", 0x2C, 0x12, int(cx), int(cy), int(cw), int(ch), 0x5B)  # 将数据打包成字节格式
    uart.write(data)  # 通过UART发送数据

while(True):  # 无限循环
    clock.tick()  # 更新时钟
    img = sensor.snapshot()  # 捕捉一帧图像
    blobs = img.find_blobs([red_threshold_01])  # 检测图像中的红色区域(blob)
    if blobs:  # 如果找到了blob
        max_b = find_max(blobs)  # 获取像素数量最多的blob
        if max_b:  # 如果找到了最大blob
            cx, cy, cw, ch = max_b.cx(), max_b.cy(), max_b.w(), max_b.h()  # 获取blob的中心坐标和宽高
            img.draw_rectangle(max_b.rect())  # 在图像上绘制最大blob的矩形框
            img.draw_cross(cx, cy)  # 在最大blob的中心位置绘制十字线
            send_data(cx, cy, cw, ch)  # 发送blob的坐标和尺寸数据
            print(cx, cy, cw, ch)  # 打印坐标和尺寸数据
    else:  # 如果没有找到blob
        print("No blobs found")  # 打印“未找到blob”的信息

import sensor, image, time, math, pyb
from pyb import UART, LED
import json
import ustruct

# 摄像头初始化
sensor.reset()  # 重置摄像头
sensor.set_pixformat(sensor.RGB565)  # 设置图像格式为RGB565
sensor.set_framesize(sensor.QVGA)  # 设置图像分辨率为QVGA(320x240)
sensor.skip_frames(time=2000)  # 跳过2000毫秒以让摄像头稳定
sensor.set_auto_gain(False)  # 禁用自动增益
sensor.set_auto_whitebal(False)  # 禁用自动白平衡
red_threshold_01 = (10, 100, 127, 32, -43, 67)  # 定义红色区域的阈值范围
clock = time.clock()  # 创建一个时钟对象用于计时

# UART初始化
uart = UART(3, 115200)  # 初始化UART3,波特率设置为115200
uart.init(115200, bits=8, parity=None, stop=1)  # 设置UART的参数

def find_max(blobs):
    max_size = 0  # 初始化最大blob的大小
    max_blob = None  # 初始化最大blob
    for blob in blobs:  # 遍历所有检测到的blob
        if blob.pixels() > max_size:  # 如果当前blob的像素数量大于最大值
            max_blob = blob  # 更新最大blob
            max_size = blob.pixels()  # 更新最大值
    return max_blob  # 返回像素数量最多的blob

def send_data(cx, cy, cw, ch):
    data = ustruct.pack("<bbhhhhb", 0x2C, 0x12, int(cx), int(cy), int(cw), int(ch), 0x5B)  # 将数据打包成字节格式
    uart.write(data)  # 通过UART发送数据

while(True):  # 无限循环
    clock.tick()  # 更新时钟
    img = sensor.snapshot()  # 捕捉一帧图像
    blobs = img.find_blobs([red_threshold_01])  # 检测图像中的红色区域(blob)
    if blobs:  # 如果找到了blob
        max_b = find_max(blobs)  # 获取像素数量最多的blob
        if max_b:  # 如果找到了最大blob
            cx, cy, cw, ch = max_b.cx(), max_b.cy(), max_b.w(), max_b.h()  # 获取blob的中心坐标和宽高
            img.draw_rectangle(max_b.rect())  # 在图像上绘制最大blob的矩形框
            img.draw_cross(cx, cy)  # 在最大blob的中心位置绘制十字线
            send_data(cx, cy, cw, ch)  # 发送blob的坐标和尺寸数据
            print(cx, cy, cw, ch)  # 打印坐标和尺寸数据
    else:  # 如果没有找到blob
        print("No blobs found")  # 打印“未找到blob”的信息

效果图如上

OpenMV是一款针对嵌入式系统的低成本机器视觉解决方案,具备图像处理和模式识别的能力。OpenMV可以通过图像传感器采集图像,并利用其内置的图像处理算法进行处理和分析,从而实现颜色点的识别坐标输出。 OpenMV颜色识别坐标输出原理如下: 1. 图像采集:OpenMV通过内置的图像传感器采集目标区域的图像。图像采集是得到图像数据的第一步。 2. 预处理:OpenMV会对采集到的图像进行预处理,包括降噪、图像增强、颜色平衡等处理,以提高后续算法的准确性。 3. 颜色空间转换:OpenMV会将图像从RGB(红绿蓝)颜色空间转换到HSV(色调饱和度亮度)颜色空间。HSV颜色空间能够更好地反映颜色的特性,在颜色识别中较为常用。 4. 阈值分割:OpenMV会根据预设的阈值将HSV图像二值化,将感兴趣的颜色部分分割出来,形成二值图像。二值图像中,颜色部分为白色,其他部分为黑色。 5. 轮廓识别OpenMV会对二值图像进行轮廓分析,找到图像中的各个颜色区域。 6. 坐标输出:OpenMV会通过计算每个颜色区域的质心(中心点)的位置,并将其作为颜色点的坐标输出,可以通过串口或者基于Python的开发环境进行查看和使用。 综上所述,OpenMV识别颜色点并输出坐标的原理是通过图像采集、预处理、颜色空间转换、阈值分割、轮廓识别等一系列算法实现。通过这些步骤,OpenMV能够精确地识别出图像中的颜色点,并根据计算得到的坐标信息进行输出和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

墨墨祺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值