OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 24|回复: 0

《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验

[复制链接]

1116

主题

1127

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4659
金钱
4659
注册时间
2019-5-8
在线时间
1223 小时
发表于 前天 14:57 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-11-12 14:57 编辑

第三十七章 image图像对比实验

1)实验平台:正点原子DNK210开发板

2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子K210技术交流企鹅群:605557868

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

在上一章节中,介绍了image模块中图像色块追踪方法给的使用,本章将继续介绍image模块中图像对比方法的使用。通过本章的学习,读者将学习到image模块中图像对比的使用。
本章分为如下几个小节:
37.1 image模块图像对比方法介绍
37.2 硬件设计
37.3 程序设计
37.4 运行验证

37.1 image模块图像对比方法介绍
image模块为Image对象提供了difference()方法,用于计算两个图像的差值绝对值,difference()方法如下所示:
  1. image.difference(image, mask)
复制代码
difference()方法计算两个图像的差值的绝对值,并返回一个image对象,返回的图像中较暗的部分,即两个对比图像差别不大的部分,返回图像中较亮的部分,即两个对比图像中相差较大的部分。
image指的是与image对象比较的另一个image对象。
mask指的是另一个用作绘图操作的像素级掩码的图像,掩码应该是一个只有黑色和白色像素的图像,并且因该与所处理的Image对象具有相同的大小,仅有掩码中设置的像素会被修改。
difference()方法会返回经过处理的Image对象。
difference()方法的使用示例如下所示:
  1. import image
  2. img1 = image.Image(size=(320, 240))
  3. img2 = img1.copy()
  4. img1.difference(img2)
复制代码
image模块为Image对象提供了get_similarity()方法,用于计算两个图像之间的相似程度,get_similarity()方法如下所示:
  1. image.get_similaraity(image)
复制代码
get_similarity()方法用于使用SSIM算法计算两个图像之间的8*8像素色块的相似度,并会返回一个similarity对象。
image指的是与image对象进行计算的另一个image对象。
get_similarity()方法会返回一个similarity对象。
get_similarity()方法的使用示例如下所示:
  1. import image
  2. img1 = image.Image(size=(320, 240))
  3. img2 = img1.copy()
  4. sim = img1.get_similarity(img2)
复制代码

37.2 硬件设计
37.2.1 例程功能
1. 不断地获取摄像头输出的图像,并保存相邻的两帧图像,对这两帧图像使用差帧算法或SSIM算法进行图像对比,并将对比结果和当前获取到的摄像头图像一起在LCD上进行显示。
2. KEY0按键可以切换图像对比时使用的算法。

37.2.2 硬件资源
本章实验内容,主要讲解image模块的使用,无需关注硬件资源。

37.2.3 原理图
本章实验内容,主要讲解image模块的使用,无需关注原理图。

37.3 程序设计
37.3.1 image模块图像对比方法介绍
有关image模块图像对比方法的介绍,请见第37.1小节《image模块图像对比方法介绍》。

37.3.2 程序流程图
image002.png
图37.3.2.1image图像对比实验流程图
37.3.3 main.py代码
main.py中的脚本代码如下所示:
  1. from board import board_info
  2. from fpioa_manager import fm
  3. from maix import GPIO
  4. import time
  5. import lcd
  6. import sensor
  7. import image
  8. import gc
  9. lcd.init()
  10. sensor.reset()
  11. sensor.set_framesize(sensor.QVGA)
  12. sensor.set_pixformat(sensor.RGB565)
  13. sensor.set_hmirror(False)
  14. type = 0
  15. type_dict = {
  16.     0: "Normal",
  17.     1: "Frame",
  18.     2: "SSIM"
  19. }
  20. fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
  21. key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
  22. def key_irq_handler(key):
  23.     global key0
  24.     global type
  25.    time.sleep_ms(20)
  26.     if key is key0 and key.value() == 0:
  27.        type = type + 1
  28.        if type == len(type_dict):
  29.            type = 0
  30. key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)
  31. while True:
  32.     img= sensor.snapshot()
  33.     if type == 0:
  34.        # 原图
  35.        pass
  36.     elif type == 1:
  37.        # 差帧算法
  38.        threshold = 5
  39.        if "prev" not in dir():
  40.            prev = img.copy()
  41.        prev.difference(img)
  42.        hist = prev.histogram()
  43.        diff = hist.get_percentile(0.99).l_value() - hist.get_percentile(0.90).l_value()
  44.        img.draw_string(10, 30, "Different" if diff > threshold else "Same", color=(255, 0, 0), scale=1.6)
  45.        prev = img.copy()
  46.     elif type == 2:
  47.        # SSIM算法
  48.        threshold = -0.4
  49.        if "prev" not in dir():
  50.            prev = img.copy()
  51.        sim = prev.get_similarity(img)
  52.        img.draw_string(10, 30, "Different" if sim.min() < threshold else "Same", color=(255, 0, 0), scale=1.6)
  53.     else:
  54.        type = 0
  55.     img.draw_string(10, 10, type_dict[type], color=(255, 0, 0), scale=1.6)
  56.     lcd.display(img)
  57.     gc.collect()
复制代码
可以看到一开始是先初始化了LCD、摄像头和中断按键,并且按下中断按键可以切换图像对比时使用的对比算法。
接着在一个循环中不断地获取摄像头输出的图像,因为获取到的图像就是Image对象,因此可以直接调用image模块为Image对象提供的各种方法,然后就是对当前图像与上一帧图像进行图像对比,最后在LCD显示图像以及图像对比结果。

37.4 运行验证
DNK210开发板连接CanMV IDE,点击CanMV IDE上的“开始(运行脚本)”按钮后,按下KEY0按键能够切换图像对比时使用的对比算法,图像对比完成后会在LCD上显示对比结果,如果前后两帧图像相似度较高,则LCD上显示“Same”,如果前后两帧图像有点差异,则LCD上显示“Different”。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-14 15:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表