当前位置: 首页 > news >正文

k210 图像操作详解(一)(直线检测、边缘检测、色块追踪)

1、直线检测

#####################################################################################################
# @file         main.py
# @author       正点原子团队(ALIENTEK)
# @version      V1.0
# @date         2024-01-17
# @brief        image图像特征检测实验
# @license      Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
#####################################################################################################
# @attention
#
# 实验平台:正点原子 K210开发板
# 在线视频:www.yuanzige.com
# 技术论坛:www.openedv.com
# 公司网址:www.alientek.com
# 购买地址:openedv.taobao.com
#
#####################################################################################################from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
import lcd
import sensor
import image
import gclcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_vflip(True)type = 0
type_dict = {0: "Normal",1: "Edge",2: "Circle",3: "Line",4: "HoG"
}fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)def key_irq_handler(key):global key0global typetime.sleep_ms(20)if key is key0 and key.value() == 0:type = type + 1if type == len(type_dict):type = 0
key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)while True:img = sensor.snapshot()if type == 0:# 原图passelif type == 1:# 边缘检测gray = img.to_grayscale(copy=True)gray.find_edges(image.EDGE_SIMPLE, threshold=(100, 255))img.draw_image(gray, 0, 0, mask=gray)del grayelif type == 2:# 圆形检测circles = img.find_circles((0, 0, img.width(), img.height()), x_stride=2, y_stride=2, threshold=3800, x_margin=50, y_margin=50, r_margin=50, r_min=60, r_max=80, r_step=5)for c in circles:img.draw_circle(c.x(), c.y(), c.r(), color=(255, 0, 0), thickness=2)elif type == 3:# 直线检测lines = img.find_lines((0, 0, img.width(), img.height()), x_stride=2, y_stride=1, threshold=1000, theta_margin=25, rho_margin=25)for l in lines:img.draw_line(l.line(), color=(255, 0, 0), thickness=2)elif type == 4:img.to_grayscale()# HoG检测img.find_hog((0, 0, img.width(), img.height()), size=8)else:type = 0img.draw_string(10, 10, type_dict[type], color=(255, 0, 0), scale=1.6)lcd.display(img)gc.collect()
  1. (0, 0, img.width(), img.height())

    • 这是一个元组,定义了要在图像中搜索直线的矩形区域。
    • (0, 0) 是矩形左上角的坐标。
    • (img.width(), img.height()) 是矩形右下角的坐标。
    • 这里设置为整个图像范围,意味着在整张图片中搜索直线。
  2. x_stride=2

    • 水平方向上的采样步长。
    • 值为2表示每隔一个像素进行一次采样,即跳过一个像素。
    • 用于减少处理的数据量,提高速度,但可能略微降低精度。
  3. y_stride=1

    • 垂直方向上的采样步长。
    • 值为1表示每个垂直像素都会被采样。
    • 比x_stride小,意味着垂直方向的采样更密集。
  4. threshold=1000

    • 霍夫变换中的投票阈值。
    • 只有在参数空间中获得至少1000票的直线才会被检测并返回。
    • 较高的阈值会检测到更少但更显著的直线。
  5. theta_margin=25

    • 角度容差,单位为度。
    • 用于合并相似角度的直线。
    • 如果两条直线的角度差小于25度,它们可能被视为同一条线。
  6. rho_margin=25

    • 距离容差,单位为像素。
    • 用于合并距离相近的平行线。
    • 如果两条平行线的距离小于25像素,它们可能被合并为一条。

这些参数共同控制了直线检测的精度、灵敏度和效率。通过调整这些参数,可以在不同的应用场景中找到最佳的直线检测效果。例如,增加threshold可以减少检测到的直线数量,但会更关注主要的线条;减小stride可以提高检测精度,但会增加计算时间。

2、边缘检测

gray = img.to_grayscale(copy=True)
gray.find_edges(image.EDGE_SIMPLE, threshold=(50, 100))
img.draw_image(gray, 0, 0, mask=gray)        
  1. gray = img.to_grayscale(copy=True)

    • 将原始图像img转换为灰度图像。
    • copy=True参数表示创建一个新的图像副本,而不是直接修改原图。
    • 灰度图像只包含亮度信息,简化了后续的边缘检测过程。
  2. gray.find_edges(image.EDGE_SIMPLE, threshold=(50, 100))

    • 在灰度图像上执行边缘检测。
    • image.EDGE_SIMPLE指定使用简单的边缘检测算法。
    • threshold=(50, 100)设置双阈值:
      • 低阈值50:像素值低于此值不被视为边缘。
      • 高阈值100:像素值高于此值一定被视为边缘。
      • 介于两者之间的像素,如果与高于高阈值的像素相连,也被视为边缘。
  3. img.draw_image(gray, 0, 0, mask=gray)

    • 将检测到的边缘绘制回原始图像img上。
    • (0, 0)指定绘制的起始位置(左上角)。
    • mask=gray使用灰度图像作为掩码,确保只有边缘部分被绘制。

这种边缘检测技术常用于:

  • 物体轮廓提取
  • 图像分割
  • 特征识别
  • 计算机视觉任务的预处理

通过调整阈值,可以控制边缘检测的敏感度。较低的阈值会检测到更多的边缘,但可能包含更多噪声;较高的阈值则会检测到更少但更显著的边缘。

3、色块追踪

#####################################################################################################
# @file         main.py
# @author       正点原子团队(ALIENTEK)
# @version      V1.0
# @date         2024-01-17
# @brief        image图像色块追踪实验
# @license      Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
#####################################################################################################
# @attention
#
# 实验平台:正点原子 K210开发板
# 在线视频:www.yuanzige.com
# 技术论坛:www.openedv.com
# 公司网址:www.alientek.com
# 购买地址:openedv.taobao.com
#
#####################################################################################################import lcd
import sensor
import gclcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_vflip(True)
sensor.set_auto_gain(False, gain_db=6.0)
sensor.set_auto_whitebal(False)while True:img = sensor.snapshot()# 色块追踪threshold = (7, 63, -21, 46, -71, -23)blobs = img.find_blobs([threshold], False, (0, 0, img.width(), img.height()), x_stride=2, y_stride=1, area_threshold=10, pixels_threshold=10, merge=True, margin=10)for b in blobs:img.draw_rectangle(b.rect(), color=(255, 0, 0))lcd.display(img)gc.collect()
  1. [threshold]

    • 一个颜色阈值列表,用于定义要查找的色块的颜色范围。
    • 例如,可能是 [(0, 100, 0, 120, 0, 100)] 表示在LAB颜色空间中的特定范围。
  2. False

    • 这个参数通常用于指定是否进行像素级别的颜色匹配。
    • False 表示不进行像素级别的匹配,可能会更快但精度略低。
  3. (0, 0, img.width(), img.height())

    • 定义搜索色块的区域,这里是整个图像。
  4. x_stride=2, y_stride=1

    • 水平和垂直方向的扫描步长。
    • x_stride=2 表示每隔一个像素在水平方向扫描。
    • y_stride=1 表示垂直方向每个像素都扫描。
  5. area_threshold=10

    • 色块的最小面积阈值。
    • 小于此面积的色块将被忽略。
  6. pixels_threshold=10

    • 色块的最小像素数阈值。
    • 像素数少于此值的色块将被忽略。
  7. merge=True

    • 是否合并相邻的色块。
    • True 表示会合并靠近的色块。
  8. margin=10

    • 合并色块时的边距。
    • 如果两个色块的距离小于这个值,它们可能会被合并。

这个函数的作用是:

  • 在指定的颜色范围内搜索色块。
  • 使用给定的步长进行扫描,以平衡速度和精度。
  • 过滤掉太小的色块(基于面积和像素数)。
  • 可能合并相近的色块。

这种色块检测通常用于:

  • 目标检测和跟踪
  • 颜色分割
  • 物体计数
  • 图像分析和处理

通过调整这些参数,你可以根据具体需求优化色块检测的效果和效率。

相关文章:

k210 图像操作详解(一)(直线检测、边缘检测、色块追踪)

1、直线检测 ##################################################################################################### # file main.py # author 正点原子团队(ALIENTEK) # version V1.0 # date 2024-01-17 # brief image图像特征检测实…...

【Java版数据结构】初识泛型

看到这句话的时候证明:此刻你我都在努力 加油陌生人 br />个人主页:Gu Gu Study专栏:Java版数据结构 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1…...

DevExpress WinForms自动表单布局,创建高度可定制用户体验(二)

使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验,从自动安排UI控件到按比例调整大小,DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。 P.S:DevExpress WinForms拥有180组件和UI库&a…...

vue中v-if和v-for

vue中v-if和v-for Vue 官方建议不要在同一个元素上同时使用 v-if 和 v-for 指令,主要有以下几个原因: 性能问题: 当 v-if 和 v-for 一起使用时,Vue 在每次渲染时都需要先执行循环,然后再对每个元素进行条件判断。这可能…...

【MySQL】根据binlog日志获取回滚sql的一个开发思路

根据binlog日志获取回滚sql的一个开发思路 需要获取的信息 thread_id 打开 mysql 客户端 开始时间 关闭 mysql 客户端 结束时间 binlog 匹配流程 指定 mysql 客户端 开始时间和结束时间 先匹配 thread_id 相同的 然后匹配 ^BEGIN$行和 ^COMMIT/*!*/;$行之间的数据 当匹…...

Kafka快速入门+SpringBoot简单的秒杀案例

1. 主题相关 1.1 创建主题 kafka-topics.sh --create --bootstrap-server [服务器地址] --replication-factor [副本数] --partitions [分区数] --topic [主题名]liberliber-VMware-Virtual-Platform:/home/zookeeper$ docker-compose exec kafka /bin/bash #进入kafka容器 b…...

Redis哨兵机制

哨兵机制: (1)监控:有一个哨兵集群,这个哨兵集群检测redis的主从集群。它是每隔1秒钟就向主从集群中的节点发送心跳,如果节点没有回复,则这个哨兵就主观的认为这个节点发生故障,这时…...

OSPF概述

OSPF OSPF属于内部网关路由协议【IGP】 用于单一自治系统【Autonomous System-AS】内决策路由 自治系统【AS】 执行统一路由策略的一组网络设备的组合 OSPF概述 为了适应大型的网络,OSPF在AS内划分多个区域 每个OSPF路由器只维护所在区域的完整的链路状态信息 …...

CSS学习笔记[Web开发]

CSS学习 本文为学习笔记,参考菜鸟和w3c 文章目录 CSS 简介CSS 插入外部 CSS内部 CSS行内 CSS多个样式表层叠顺序 CSS 语法例子解释 CSS 选择器CSS 元素选择器CSS id 选择器实例CSS 类选择器实例CSS 通用选择器实例CSS 分组选择器CSS 后代选择器CSS 子元素选择器CSS …...

Go基础编程 - 11 - 函数(func)

接口(interface) 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用(defer)4.1 defer特…...

Typora入门

标题(clrt数字) 段落 实现换行 1.在一个行的结尾加上两个空格实现换行 2.在两行之间加上空行实现换行 实现分割线 (1.***三个星号实现分割线) (2.三个以上的—也可以实现分割线) 强调 斜体:我是斜体 (单下划线…...

PT2262-IR

PT2262是一款很古老的编码芯片,其兼容型号有:SC2262,AD2262,SC2260(需改变匹配电阻)等。 依据其datasheet,PT2262射频模式工作原理: CODE BITS A Code Bit is the basic component of the encoded waveform, and ca…...

JavaScript 迭代器

在JavaScript中,迭代器是一种允许我们遍历集合中元素的对象。迭代器对象具有一个next()方法,该方法返回value和done。value是当前迭代的值,done属性是一个布尔值,表示是否到达了集合的末尾。 迭代器协议 一个迭代器对象必须具备以…...

数据结构之《队列》

在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈,在本篇中我们将继续学习另一种线性表的结构——队列,在通过本篇的学习后,你将会对栈的结构有充足的了解,在了解完结构后我们还将进行栈的实现。一起…...

【NPU 系列专栏 2 -- NVIDIA 的 H100 和 H200 是什么?】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA H100 和 H200 芯片NVIDIA H100 芯片简介NVIDIA H100 主要特点NVIDIA H100 应用场景NVIDIA H100 使用举例NVIDIA H200 芯片简介NVIDIA H200 主要特点NVIDIA H200 应用场景NVIDIA H200 使用举例Summary NVIDIA H100 和 H20…...

【BUG】已解决:IndexError: positional indexers are out-of-bounds

IndexError: positional indexers are out-of-bounds 目录 IndexError: positional indexers are out-of-bounds 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博…...

视频汇聚,GB28181,rtsp,rtmp,sip,webrtc,视频点播等多元异构视频融合,视频通话,视频会议交互方案

现在视频汇聚,视频融合和视频互动,是视频技术的应用方向,目前客户一般有很多视频的业务系统,如已有GB28181的监控(GB现在是国内主流,大量开源接入和商用方案),rtsp设备,音…...

SpringCloud断路器的使用与原理解析

Spring Cloud断路器是在分布式系统中实现容错的一种方式。它的原理是通过在调用链路上添加断路器,当某个服务的调用出现故障或超时时,断路器会自动迅速地切换到快速失败模式,防止故障扩散,从而保护整个系统的稳定性。 Spring Cloud断路器的使用与原理解析如下: 一、使用断…...

结构型模式-分类

一、结构型设计模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成…...

【前端】JavaScript入门及实战106-110

文章目录 106 a的索引问题107 使用DOM操作CSS108 读取元素当前的样式109 getStyle()110 其他样式操作的属性滚动条练习 106 a的索引问题 <!DOCTYPE html> <html> <head> <title></title> <meta charset"utf-8"> <script typ…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...