电赛系列:颜色识别与线性回归

LCD:

方法:

lcd.init:

lcd.init(type=1, freq=15000000, color=lcd.BLACK, invert = 0, lcd_type = 0)

初始化屏幕函数

参数:

image-20230724135846810

lcd.deinit():

注销 LCD 驱动,释放I/O引脚

lcd.width():

返回 LCD 的宽度(水平分辨率)

lcd.height():

返回 LCD 的高度(垂直分辨率)。

lcd.type():

image-20230724140252990

lcd.freq(freq):

设置或获取SPI频率

lcd.set_backlight(state):

设置背光状态,但还未实现,用不了

lcd.display(image, roi=Auto, oft=(x, y)):

image-20230724141513234

lcd.clear():

清空屏幕

lcd.rotation(dir):

旋转屏幕方向

**传入:**dir: 取值范围 [0,3], 从0到3依次顺时针旋转

lcd.mirror(invert):

设置是否镜面显示

**传入:**invert:True or False

lcd.bgr_to_rgb(enable):

设置是否启动 bgr 色彩显示

**传入:**enable:True or False

lcd.fill_rectangle(x, y, w, h, color):

填充LCD 指定区域

image-20230724142351472

lcd.draw_string(x,y,str,color,bg_color):

写字符【x,y】起始坐标;【str】字符内容【color】字体颜色【bg_color】字体背景颜色

Demo:

显示英文:

import lcd#引入库

lcd.init()#初始化
lcd.draw_string(100, 100, "Ewing is so handsome", lcd.RED, lcd.BLUE)

效果:

image-20230724143435871

Sensor:

sensor 传感器模块(这里特指摄像头模块),进行摄像头配置及图像抓取等,用于控制开发板摄像头完成摄像任务。

方法:

sensor.reset:

重置并初始化单目摄像头

sensor.reset([, freq=24000000[, set_regs=True[, dual_buff=False]]])

image-20230724150450288

sensor.set_framesize:

用于设置摄像头输出帧大小,k210最大支持VGA格式,大于VGA将无法获取图像,MaixPy开发板配置的屏幕是320*240分辨率,推荐设置为QVGA格式

sensor.set_framesize(framesize[, set_regs=True])

image-20230724151630606

image-20230724155942795

sensor.set_pixformat:

用于设置摄像头输出格式,MaixPy开发板配置的屏幕使用的是RGB565,推荐设置为RGB565格式

sensor.set_pixformat(format[, set_regs=True])

image-20230724152056309

sensor.run:

图像捕捉功能控制

sensor.run(enable)

传入:1:开始抓取图像,0:停止抓取图像

sensor.snapshot():

使用摄像头拍摄一张照片

sensor.snapshot()

img: 返回的图像对象

sensor.set_contrast:

sensor.set_contrast(contrast)

constrast: 摄像头对比度,范围为[-2,+2]

sensor.set_saturation:

sensor.set_saturation(saturation)

constrast: 摄像头饱和度,范围为[-2,+2]

sensor.set_vflip:

摄像头垂直翻转

sensor.set_vflip(enable) sensor.set_hmirror(True)(水平翻转)

enable: 1 表示开启垂直翻转 0 表示关闭垂直翻转

sensor.set_jb_quality

设置传送给 IDE 图像的质量

sensor.set_jb_quality(quality)

qualityint 类型,图像质量百分比(0~100),数字越大质量越好

其他方法具体看文档,不一一列举:sensor(摄像头) - Sipeed Wiki

Demo:

LCD显示摄像头拍摄图片

# 单目摄像头

import sensor#引入摄像头库
import lcd#引入LCD库

lcd.init()#LCD初始化
sensor.reset()#摄像头初始化
sensor.set_pixformat(sensor.RGB565)#设置摄像头输出格式
sensor.set_framesize(sensor.QVGA)#设置摄像头输出帧大小
sensor.run(1)#运行摄像头

while True:
    img = sensor.snapshot()#抓取图像
    lcd.display(img)#显示图像

image:

这部分的函数和类较多,不一一列举,具体看这个:image(机器视觉) - Sipeed Wiki,用到再查找就行

方法:

img.mean:

一个用于计算图像每个像素在RGB通道上的均值的函数。它可以对图像中的每个像素进行RGB通道上的均值计算,返回一个与原图像大小相同的三维数组,其中的每个像素值是原图像中对应像素在RGB通道上的均值,作用就是降噪,滤波;

image-20230725163236421

一般写入2,用于对颜色信息降噪;

img.binary:

img.binary([THRESHOLD])是一个用于将图像二值化的函数。它可以将一张灰度图像转化为黑白二值图像,其中像素值大于阈值的像素被置为白色,像素值小于或等于阈值的像素被置为黑色。

该函数的输入参数THRESHOLD表示二值化的阈值,它是一个标量值,范围通常在0到255之间。如果不指定阈值,则默认将图像的全局均值作为阈值。

img.crop():

img.crop()是一个用于图像裁剪的函数。它可以从一张图像中截取出一个子图像,返回一个新的图像对象,该对象包含了原图像中指定区域的像素信息。

该函数的输入参数是一个元组(x, y, w, h),其中(x, y)表示要截取的子图像的左上角坐标,(w, h)表示要截取的子图像的宽度和高度。

img.erode():

img.erode()是一个用于图像腐蚀的函数。它可以将图像中的前景对象进行腐蚀操作,使得前景对象的边缘变得更加平滑,同时可以将一些细小的前景对象去除掉。

该函数的输入参数包括一个结构元素kernel和可选参数iterations。结构元素kernel是一个二维数组,可以用于调整腐蚀操作的形状和大小。可选参数iterations表示腐蚀操作的迭代次数,它的默认值为1。

该函数的输入参数1表示腐蚀操作的迭代次数,即将输入图像中的前景像素进行一次腐蚀操作。

 img.erode(1)

img.get_regression():

img.get_regression()是一个用于在图像中进行线性回归的函数。它可以从输入的点集中计算出一条线性回归直线,返回该直线的斜率和截距。

该函数的输入参数是一个点集,用于指定需要进行线性回归的点的坐标。点集的格式可以是一个二维列表,每个列表元素都是一个形如(x, y)的点坐标,或者是一个二维数组,其中每行表示一个点的坐标。另外,可选参数robust表示是否使用鲁棒性线性回归算法,它的默认值为True

img.get_regression([(100,100)], robust=True)

img.get_regression()函数返回一个元组(slope, intercept, r_value, p_value, stderr),其中各元素的含义如下:

  • slope:线性回归直线的斜率。
  • intercept:线性回归直线的截距。
  • r_value:相关系数,表示输入点集中的数据与线性回归直线之间的相关程度,取值范围为[-1, 1],其绝对值越接近1,表示相关程度越强。
  • p_value:p值,表示在给定显著性水平下,观测到当前相关系数的概率,通常情况下,如果p值小于显著性水平(例如0.05),则认为相关系数具有显著性。
  • stderr:标准误差,表示对回归直线进行估计时的误差,其值越小,表示估计结果越可靠。

img.draw_line():

img.draw_line()是一个在图像上绘制直线的函数。它可以在输入的图像上绘制一条直线,绘制的直线可以是通过霍夫线变换检测到的直线,也可以是通过其他方法得到的直线。

该函数的输入参数通常包括:

  • 直线的端点坐标或者直线的参数(斜率和截距)。
  • 直线的颜色和宽度等绘制属性。

img.find_blobs():

img.find_blobs()是一个用于在图像中查找连通区域(即色块)的函数。它可以在输入图像中找到一组符合条件的连通区域,这些连通区域由一组相邻的像素组成,具有相似的颜色或灰度值。

这个函数的输入参数是一个包含阈值范围的列表,列表的每个元素都是一个包含颜色阈值的元组。函数会在输入图像中搜索所有符合这些颜色阈值的像素,并将它们组成色块,返回一个包含所有色块信息的列表。

这个函数的输出是一个列表,其中每个元素都代表一个检测到的色块。每个色块都是一个元组,包含了该色块的左上角坐标、宽度、高度、面积和中心点坐标等信息。可以使用这些信息来对图像进行处理,比如在色块周围画框或者标记中心点等。

讲两个常用的类:

Threhsold 类 – 阈值对象:

阈值对象由 histogram.get_threshold 返回。

灰度图像有一个通道。没有 l_, a_, 和 b_* 方法.

RGB565 阈值有三个通道。使用 l_, a_, 和 b_* 方法。

构造函数:

class image.threshold,调用 histogram.get_threshold() 函数来创建此对象。

方法:

image-20230724162807207

Line类 – 直线对象:

直线对象是由 image.find_lines , image.find_line_segmentsimage.get_regression 返回的。

构造函数:

class image.line

请调用 image.find_lines(), image.find_line_segments(), 或 image.get_regression() 函数来创建此对象。

方法:

image-20230724163232547

image-20230724163247572

line.rho():

line.rho()是一个用于获取霍夫线变换检测到的直线到图像原点的距离的函数。在霍夫线变换检测到一条直线时,它会返回该直线到图像原点的距离(即直线的rho值)。

在霍夫线变换中,直线由两个参数表示:直线到图像原点的距离rho和直线与图像水平方向的夹角thetaline.rho()函数返回的是直线的rho值,即直线到图像原点的距离。

line.theta():

line.theta()是一个用于获取霍夫线变换检测到的直线与图像水平方向的夹角的函数。在霍夫线变换检测到一条直线时,它会返回该直线与图像水平方向的夹角(即直线的theta值)。

Demo:

颜色识别:

MaixPy 集成了 RGB565 颜色块识别 find_blobs 函数,主要是基于 LAB 颜色模型(每个颜色都是用一组 LAB阈值表示),其位于 image模块下,直接将拍摄到的图片进行处理即可。

函数:

image.find_blobs()

作用:返回image.blog对象列表

形参:放入阈值元组列表

这个函数的输出是一个列表,其中每个元素都代表一个检测到的色块。每个色块都是一个元组,包含了该色块的左上角坐标、宽度、高度、面积和中心点坐标等信息。可以使用这些信息来对图像进行处理,比如在色块周围画框或者标记中心点等。

image-20230725141413266

识别绿色快:

import sensor
import image
import lcd
import time
lcd.init()#LCD初始化
sensor.reset()#摄像头初始化
sensor.set_pixformat(sensor.RGB565)#设置摄像头输出格式
sensor.set_framesize(sensor.QVGA)#设置摄像头输出帧大小
sensor.run(1)#运行摄像头
green_threshold   = (0,   80,  -70,   -10,   -0,   30)#设置绿色块的阈值
while True:
    img=sensor.snapshot()#抓取图像
    blobs = img.find_blobs([green_threshold])#返回绿色块的信息对象
    if blobs:
    	for b in blobs:#遍历这个tuple
    		tmp=img.draw_rectangle(b[0:4])#根据返回的坐标框出绿色块
    		tmp=img.draw_cross(b[5], b[6])#画出中心点
    		c=img.get_pixel(b[5], b[6])# 返回(x, y)位置的RGB888像素元组
    lcd.display(img)#在LCD上显示图片

#红色阈值[0],绿色阈值[1],蓝色阈值[2] rgb_thresholds =[(30, 100, 15, 127, 15, 127), (0, 80, -70, -10, -0, 30), (0, 30, 0, 64, -128, -20)]

手动调LAB阈值,点工具->机器视觉->阈值调试器

image-20230725154325764

讲一下LAB:

Lab模式是一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:

image-20230726110646535

image-20230726110708533

你的图片哪个颜色分量就着重调哪个通道,直到你想要捕捉的目标变为白色,其余为黑色:

image-20230725154957784

循迹:线性回归

import sensor
import image
import lcd
import time
from machine import UART
lcd.init()#LCD初始化
sensor.reset()#摄像头初始化
sensor.set_pixformat(sensor.RGB565)#设置摄像头输出格式
sensor.set_framesize(sensor.QVGA)#设置摄像头输出帧大小
sensor.run(1)#运行摄像头

THRESHOLD   = (31, 91, -86, 96, -110, 107)#设置循迹的阈值
while True:
    img=sensor.snapshot()#抓取图像
    img.mean(2)#通过对像素点进行均值处理达到降噪效果
    img.binary([THRESHOLD])#二值化
    img.crop([0,15,80,60])#截取图像
    img.erode(1)#腐蚀化处理,加粗线条
    line = img.get_regression([(100,100)], robust = True)#线性回归处理
    if (line):
            rho =(int)(abs(line.rho())-img.width()/2)
            if line.theta()>90:
                theta = line.theta()-180
            else:
                theta = line.theta()
            img.draw_line(line.line(), color = 127)
            
            print("rho:",rho)      #回归线的偏移距离   一般用偏移距离较好
            print("theta:",theta)  #回归线的偏移角度
  
img.binary([THRESHOLD])#二值化
img.crop([0,15,80,60])#截取图像
img.erode(1)#腐蚀化处理,加粗线条
line = img.get_regression([(100,100)], robust = True)#线性回归处理
if (line):
        rho =(int)(abs(line.rho())-img.width()/2)
        if line.theta()>90:
            theta = line.theta()-180
        else:
            theta = line.theta()
        img.draw_line(line.line(), color = 127)
        
        print("rho:",rho)      #回归线的偏移距离   一般用偏移距离较好
        print("theta:",theta)  #回归线的偏移角度







































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值