您现在的位置是:首页 > 正文

k210学习:矩形识别,激光识别,与stm32通信

2024-02-29 10:45:28阅读 2

1、导入相关库(按需导入)

import sensor, time, image                      
import utime                                                # 导入延时模块
from fpioa_manager import fm                                # 导入引脚注册模块
from Maix import GPIO                                       # 导入GPIO
import lcd                                                  # 导入LCD
from machine import Timer, PWM, UART                        # 导入定时器,PWM UART
import math                                                 # 导入数学函数模块

2、初始化摄像头,屏幕

lcd.init()

sensor.reset()
sensor.set_pixformat(sensor.RGB565)   #RGB565或者YUV422,按情况调整
sensor.set_framesize(sensor.QVGA)       #QVGA或QQVGA,按情况调整
sensor.set_windowing((240, 240))        #图像大小
sensor.set_vflip(True)
sensor.skip_frames(time = 2000)       #延时跳过,按情况调整

3、关闭自增益,白平衡,去鱼眼化(按需调整)

sensor.set_auto_gain(False)#自增益关闭
sensor.set_auto_whitebal(False) # 白平衡关闭
#sensor.snapshot(1.8)#去鱼眼化

4、识别激光调整的参数

sensor.set_auto_exposure(1)                                 # 设置自动曝光
#sensor.set_auto_exposure(0, exposure=100000)               # 设置手动曝光,曝光时间

#sensor.set_auto_gain(0, gain_db = 0)                       # 设置画面增益
#sensor.set_auto_whitebal(0, rgb_gain_db = (0,0,0))          # 设置RGB增益

#sensor.set_contrast(0)                                     # 设置对比度 
#sensor.set_brightness(0)                                   # 设置亮度 
#sensor.set_saturation(0)                                   # 设置饱和度


5、串口设置(uart1为串口1,uart2为串口2)

# 串口1 设置 P9 RX P6 TX
fm.register(9, fm.fpioa.UART1_RX, force = True)             
fm.register(6, fm.fpioa.UART1_TX, force = True)            

uart1 = UART(UART.UART1, 115200, 8, 0, 1) #串口1,波特率115200数据位8位,校验位0位,停止位1位

# 串口2 设置 P7 RX P8 TX
fm.register(7, fm.fpioa.UART2_RX, force = True)            
fm.register(8, fm.fpioa.UART2_TX, force = True)             

uart2 = UART(UART.UART2, 115200, 8, 0, 1) #串口2,波特率115200数据位8位,校验位0位,停止位1位

6、串口接收设置

# 初始化GPIO用于接收
fm.register(24, fm.fpioa.GPIOHS0, force=True)
gpio = GPIO(GPIO.GPIOHS0, GPIO.IN)

# 串口接收中断处理函数
def uart_receive_irq(uart):
    global uart_data
    uart_data = uart.read()

# 串口接收中断
uart.irq(uart.IRQ_RX, uart_receive_irq)

7、识别矩形并标出顶点坐标

while True:
    img = sensor.snapshot()
    blobs = img.find_blobs([(0, 0, 0)], pixels_threshold=200, area_threshold=200, merge=True)

    if blobs:
        for blob in blobs:
            img.draw_rectangle(blob.rect())

            # 获取矩形的四个顶点坐标
            x1, y1, x2, y2 = blob.rect()
            img.draw_cross(x1, y1)  # 标注左上角坐标
            img.draw_cross(x2, y1)  # 标注右上角坐标
            img.draw_cross(x1, y2)  # 标注左下角坐标
            img.draw_cross(x2, y2)  # 标注右下角坐标

8、识别矩形框并通过填充颜色排除其它图形干扰后标注顶点坐标

while True:
    img = sensor.snapshot()
    blobs = img.find_blobs([(0, 0, 0)], pixels_threshold=200, area_threshold=200, merge=True)

    if blobs:
        for blob in blobs:
            # 判断矩形是否填充为白色
            if blob.pixels() > 0.6 * blob.w() * blob.h():
                img.draw_rectangle(blob.rect(), color=(255, 0, 0))  # 绘制红色边框
                img.draw_cross(blob.cx(), blob.cy(), color=(255, 0, 0))  # 绘制红色中心点
            else:
                img.draw_rectangle(blob.rect(), color=(0, 255, 0))  # 绘制绿色边框
                img.draw_cross(blob.cx(), blob.cy(), color=(0, 255, 0))  # 绘制绿色中心点

            # 获取矩形的四个顶点坐标
            x1, y1, x2, y2 = blob.rect()

9、将坐标信息发送到STM32

uart.write("x1: {0}, y1: {1}, x2: {2}, y2: {3}\n".format(x1, y1, x2, y2))

10、接收来自STM32的返回值并打印

if gpio.value() == 0:
        if uart_data:
            print(uart_data)
            uart_data = None

11、找目标颜色并标记

if blobs:
    #如果找到了目标颜色
        for b in blobs:
        #找到的目标颜色区域
            x = b[0]
            y = b[1]
            width = b[2]
            height = b[3]
                # Draw a rect around the blob.
            img.draw_rectangle([x,y,width,height]) # rect
                #用矩形标记出目标颜色区域
            img.draw_cross(b[5], b[6]) # cx, cy
                #在目标颜色区域的中心画十字形标记
            Lm = (b[2]+b[3])/2 #b[2]色块的外框的宽 ,b[3]色块的外框的高
            x1=blob[0]
            y1=blob[1]
            w1=blob[2]
            h1=blob[3]
            a1=(int((w1/2)+x1)-blob[0])/4
            a2=(int((h1/2)+y1)-blob[1])/4  #计算单位坐标像素长度
            img.draw_rectangle(b.rect(), color = (255, 0, 0))   # 绘制红色矩形框
            img_x=(int)(b.rect()[0]+r.rect()[2]/2)              # 图像中心的x值
            img_y=(int)(b.rect()[1]+r.rect()[3]/2)              # 图像中心的y值

12、标注坐标

img.draw_rectangle(blob[0:4], color=(0,0,0))#对找到的目标进行黑框标注
img.draw_cross(int((w1/2)+x1), int((h1/2)+y1))#使用十字标注目标中心点位置
img.draw_string(blob[0],blob[1], (str(blob[0])+','+str(blob[1])), color = (0,0,0))
        #在显示屏标注目标最左和最下的坐标

13、点亮屏幕

 lcd.display(img)

14、激光识别

激光颜色阈值参考颜色标准LAB对照表根据实际情况调整

L值域由0到100,L=50时,就相当于50%的黑;a和b的值域都是由+127至128,其中a为+127就是洋红色,a为-128的时候就变成绿色;同理,b为+127是黄色,-128是蓝色

如白色white_threshold   = (0, 100, -128, 127, -128, 127) 

red_threshold = [(, , , , , )]
green_threshold = [(, , , , , )]

15、根据阈值寻找红色激光色块(绿色同理)

# 根据阈值找到色块
for c in img.find_circles(threshold = 1000, x_margin = 10, y_margin = 10, r_margin = 10,
r_min = 0, r_max = 80, r_step = 1):
if c.r()<7:
for b in img.find_blobs(red_td,pixels_threshold=2, area_threshold=15, merge=True,invert = 0):
# 在屏幕上画出色块
img.draw_rectangle(b.rect(), color = (0, 255, 0), scale = 2, thickness = 2)
         break
redx=b.x()+b.w()/2
redy=b.y()+b.h()/2
print('red',redx,redy)

网站文章

  • windows文件远程传输

    import os import shutil import re def repalce_drive(path,virtual_drive): # 把盘符替换为虚拟盘符 res = re.match...

    2024-02-29 10:44:59
  • Kotlin笔记——常用注解

    @Nullable和@NotNull 以检查给定变量、参数或返回值的 null 性。@Nullable注解用于指明可以为 null 的变量、参数或返回值,而@NonNull则用于指明不可以为 null...

    2024-02-29 10:44:51
  • LVS负载均衡之--DR模式

    LVS负载均衡之--DR模式

    前言:上一章和拐友们讲解了LVS虚拟服务器的NAT模式,这章讲解LVS中的负载均衡中的DR模式目录一.LVS-DR工作原理1.1数据包流向分析1.2DR模式的特点二.ARP的问题2.1问题冲突2.1....

    2024-02-29 10:44:42
  • 【转】“从客户端(ctl00$Content$txtContent)中检测到有潜在危险的 Request.Form 值”之解...

    【转】“从客户端(ctl00$Content$txtContent)中检测到有潜在危险的 Request.Form 值”之解...

    转载自 sucheng1031 最终编辑 hybingo “/WebSite”应用程序中的服务器错误。从客户端(ctl00$Content$txtContent=&quot;木木木木木木木 &quot;)中检测到有潜在危险的 Request.Form 值。说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示存在危及应用程序安全的尝试,如跨...

    2024-02-29 10:44:13
  • 闲来无事

    突然想说、喜欢安姐、????、优秀的那么自然、还有那么许多一直优秀的人、读读你们的故事、思考下自己的人生、是啊、对错并不重要、关键是成长和思考希望所有人都能按照自己的意愿过一生------- 杂谈 -...

    2024-02-29 10:44:05
  • WGS84坐标转BD-09坐标(wgs84转百度)

    WGS84坐标转BD-09坐标(wgs84转百度)

    2024-02-29 10:43:57
  • JAVA-JDK8的特性之Lambda表达式 最新发布

    Thread类需要一个Runnable接口作为参数,其中的抽象方法run方法是用来指定线程任务内容的核心。Lambda表达式的语法是非常简洁的,但是Lambda表达式不是随便使用的,使用时有几个条件要...

    2024-02-29 10:43:51
  • RabbitMQ集群高可用的部署

    RabbitMQ集群高可用的部署

    #---------------------------------------------------------------------# Example configuration for a ...

    2024-02-29 10:43:22
  • springboot发送邮件的实现(简单发送,带附件发送,模板发送)

    springboot发送邮件的实现(简单发送,带附件发送,模板发送)

    今天学了springboot如何发送邮件,做了以下的内容总结,方便自己日后复习和查看!1.pom文件maven的引入<!-- send mail --><dependency> <groupId...

    2024-02-29 10:43:15
  • Linux安装loadrunner负载机

    Linux安装loadrunner负载机

    1、loadrunner下载地址:http://download.csdn.net/download/intel80586/9542271或者其他资源2、首先用rpm -qa|grep -i c++命...

    2024-02-29 10:43:08