这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】视觉学习笔记--from旭

共1条 1/1 1 跳转至

【原创】视觉学习笔记--from旭

工程师
2025-07-19 17:34:05     打赏

roi是“感兴趣区”。

left_roi = [0,0,160,240]

blobs = img.find_blobs([red],roi=left_roi)

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10

blobs = img.find_blobs([red],x_stride=10)

y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5

blobs = img.find_blobs([red],y_stride=5)

invert 反转阈值,把阈值以外的颜色作为阈值进行查找

area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉

pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉

merge 合并,如果设置为True,那么合并所有重叠的blob为一个。

注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs

图片1.png

blob有多个方法:

blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用

blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。

blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。

blob.w() 返回色块的外框的宽度wint),也可以通过blob[2]来获取。

blob.h() 返回色块的外框的高度hint),也可以通过blob[3]来获取。

blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。

blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。

blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。

blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。

blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:

blobs = img.find_blobs([red, blue, yellow], merge=True)

如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。

blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。

blob.area() 返回色块的外框的面积。应该等于(w * h)

blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。

比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。

#uart = UART(1, 115200)   # 串口配置      P1   P0TX RX

#uart = UART(3, 115200)   #               P4   P5

THRESHOLD = (20, 47, 21, 57, 11, 47)

import sensor, image, time,ustruct

from pyb import UART,LED

import pyb

sensor.reset()

#sensor.set_vflip(True)

#sensor.set_hmirror(True)

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QQQVGA)

#sensor.set_windowing([0,20,80,40])

sensor.skip_frames(time = 2000)

clock = time.clock()

下边是视觉小车部分

#32通信

uart = UART(1,115200)     #定义串口3变量

uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters

 

#识别区域,绘图区域 左右上区域

roi1 = [(0, 17, 15, 25),           #  左  x y w h

            (65,17,15,25),         #  

            (30,0,20,15),          #  

            (0,0,80,60)]           #  停车

def send_data_w(x,a,f_x,f_a):

    global uart;

    data = ustruct.pack("<bbhhhhb",      #格式为俩个字符俩个短整型(2字节)

                   0x2C,                      #帧头1 00101100

                   0x12,                      #帧头2 00010010

                   #下面的4个数据存到上面的情况里面,进行一个打包

                   int(x),   # rho 截距

                   int(a),   # theat 角度

                   int(f_x), # 位置判断信息

                   int(f_a), # 位置判断信息

                   0x5B)     # 帧尾 01011011

    uart.write(data);

while(True):

    clock.tick()

    img = sensor.snapshot().binary([THRESHOLD])

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

    left_flag,right_flag,up_flag=(0,0,0)#三个区域块的值,和下面的判断相关

    for rec in roi1:

            img.draw_rectangle(rec, color=(255,0,0))#绘制出roi区域

    if (line):

        rho_err = abs(line.rho())-img.width()/2

        if line.theta()>90:

            theta_err = line.theta()-180

        else:

            theta_err = line.theta()

        #直角坐标调整

        img.draw_line(line.line(), color = 127)

        #画出直线

        x=int(rho_err)

        a=int(theta_err)

        f_x=0

        f_a=0

        if x<0:

          x=-x

          f_x=1

        if a<0:

          a=-a

          f_a=1

 

        if line.magnitude()>8:

            outdata=[x,a,f_x,f_a]

            print(outdata)

            send_data_w(x,a,f_x,f_a)  #outuart发送的就是 x,a,flag,对应的就是截距,角度

            if img.find_blobs([(96, 100, -13, 5, -11, 18)],roi=roi1[0]):  #left

                left_flag=1

            if img.find_blobs([(96, 100, -13, 5, -11, 18)],roi=roi1[1]):  #right

                right_flag=1

            if img.find_blobs([(96, 100, -13, 5, -11, 18)],roi=roi1[2]):  #up

                up_flag=1

            if left_flag==1 and right_flag==1:

                send_data_w(0,0,2,2)

                time.sleep_ms(100)

                send_data_w(0,0,2,2)

                print(0,0,2,2)

                print('shizi')

                continue

        else:

            pass

    else:

        send_data_w(0,0,3,3)

        print('3')

        print('stop')

LAB 是一种颜色空间(类似 RGB),它将颜色分解为三个分量,更符合人眼对颜色的感知方式,在机器视觉中常用于颜色阈值分割。

 L(Lightness):亮度

· 含义:表示颜色的明暗程度,与颜色无关。

A(Green-Red):绿红分量

· 含义:表示颜色在绿色和红色之间的偏向。

 B(Blue-Yellow):蓝黄分量

· 含义:表示颜色在蓝色和黄色之间的偏向。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]