《DNK210使用指南 -CanMV版 V1.0》第二十六章 摄像头图像捕获实验

news/2024/11/20 14:35:08/文章来源:https://www.cnblogs.com/zdyz/p/18428644

第二十六章 摄像头图像捕获实验

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

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

3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750

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

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

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

本章将介绍CanMV下摄像头的使用,能通过摄像头实时地采集摄像头捕获到的图像数据,从而进行进一步的处理。通过本章的学习,读者将学习到通过CanMV驱动摄像头实时捕获图像数据。
本章分为如下几个小节:
26.1 sensor模块介绍
26.2 硬件设计
26.3 程序设计
26.4 运行验证

26.1 sensor模块介绍
sensor模块是CanMV内置的模块,sensor模块用于驱动摄像头,能够对摄像头进行配置并进行图像数据的捕获,从而实现一些拍摄任务。
sensor模块提供了reset()函数,用于重置并初始化摄像头,reset()函数如下所示:

sensor.reset(freq=24000000, set_regs=True, choice=0, dual_buff=False)

reset()函数用于重置并初始化摄像头,该函数能够自动识别接入的且被支持的摄像头类型,并根据不同的摄像头进行不同的重置并初始化操作.
freq指的是摄像头像素时钟的频率,若该参数为空,则使用默认的24MHz。
set_regs指的是否让程序在初始化摄像头的过程中配置摄像头的寄存器,若开发者希望使用另外的寄存器配置方式初始化摄像头,可以将该参数配置为False,然后使用相应的寄存器配置函数自行配置摄像头的寄存器,该参数默认为True。
choice指的是接入的摄像头的类型,可选的参数如下表所示:

表26.1.1 choice可选参数描述

dual_buff指的是是否使能摄像头的双缓冲模式,当为True时,将使能双缓冲模式,此时sensor模块会为摄像头的帧缓冲分配两个大小均为帧大小的缓冲区,因此会更加占用内存,但好处是摄像头的捕获帧率在某些情况下可能会有所提升,当为False时,将禁用双缓冲模式,此时sensor模块将只会为摄像头的帧缓冲分配一个大小为帧大小的缓冲区,因此会更加地节省内存。
reset()函数的使用示例如下所示:

import sensor
sensor.reset()

sensor模块提供了set_framesize()函数,用于配置摄像头输出的帧大小,set_framesize()函数如下所示:

sensor.set_framesize(framesize, set_regs=True)

set_framesize()函数用于配置摄像头输出的帧大小,也就是输出图像的像素分辨率,由于Kendryte K210的DVP最大支持的帧大小为640*480,因此摄像头输出的帧大小不应该超出这个值。
framesize指的是要配置的帧大小,可选的参数如下所示:


表26.1.2 framesize可选参数

set_regs指的是是否让程序在配置摄像头驱动程序时,根据所配置的帧大小配置摄像头的寄存器,若开发者希望自行配置摄像头的寄存器,可以将该参数配置为False,该参数默认为True。
set_framesize()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)

sensor模块提供了set_pixformat()函数,用于配置摄像头输出图像的像素格式,set_pixformat()函数如下所示:

sensor.set_pixformat(format, set_regs)

set_pixformat()函数用于配置摄像头输出图像的像素格式,由于DNK210开发板上的LCD屏幕使用的是RGB565的像素格式,因此推荐配置摄像头输出图像的像素格式也是RGB565.
format指的是要配置的图像像素格式,可选的参数如下所示:

表26.1.3 format可选参数

set_regs指的是是否让程序在配置摄像头驱动程序时,根据所配置的像素格式配置摄像头的寄存器,若开发者希望自行配置摄像头的寄存器,可以将该参数配置为False,该参数默认为True。
set_pixformat()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)

sensor模块提供了snapshot()函数,用于获取摄像头捕获到的图像数据,snapshot()函数如下所示:

sensor.snapshot(update_jb=True)

snapshot()函数用于获取摄像头捕获到的图像数据,并返回一个Image对象。
update_jb指的是是否将捕获到的图像数据上传到CanMV IDE软件,当为True时,snapshot()函数捕获到的图像数据会被进行JPEG编码压缩后上传到CanMV IDE软件,这么一来便能在CanMV IDE软件的“帧缓冲区”窗口中看到snapshot()函数捕获到的图像数据,当为False时,snpshot()函数捕获到的图像数据不会被上传到CanMV IDE软件,这样的好处是,当与CanMV IDE软件连接时不用进行JPEG编码压缩以及图像数据上传的任务,从而降低CPU的使用率。
snapshot()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
img = sensor.snapshot()

sensor模块提供了set_hmirror()函数,用于使能摄像头输出图像的水平镜像操作,set_hmirror()函数如下所示:

sensor.set_hmirror(enable)

set_hmirror()函数用于使能摄像头输出图像的水平镜像操作。
enable指的是是否使能摄像头输出图像的水平镜像功能,当为True时,使能摄像头输出图像的水平镜像功能,当为False时,禁止摄像头输出图像的水平镜像功能。
set_hmirror()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
img = sensor.snapshot()

sensor模块提供了set_vflip()函数,用于使能摄像头输出图像的垂直翻转操作,set_vflip()函数如下所示:

sensor.set_vflip(enable)

set_vflip()函数用于使能摄像头输出图像的垂直翻转操作。
enable指的是是否使能摄像头输出图像的垂直翻转功能,当为True时,使能摄像头输出图像的垂直翻转功能,当为False时,禁止摄像头输出图像的垂直翻转功能。
set_vflip()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_vflip(False)
img = sensor.snapshot()

sensor模块提供了set_jb_quality()函数,用于配置上传到CanMV IDE软件的JPEG图像的质量,set_jb_quality()函数如下所示:

sensor.set_jb_quality(quality=35)

set_jb_quality()函数用于配置上传到CanMV IDE软件的JPEG图像的质量,因为上传到CanMVIDE软件的图像会被先压缩成JPEG格式在进行上传,JPEG压缩时可以配置JPEG压缩的质量,这个质量越高压缩的程度越小,画面越精细,但压缩出来的JPEG图像体积也越大,反之如果JPEG压缩时配置的JPEG压缩质量越低,则压缩的程度越大,画面越粗糙,但压缩出来的JPEG图像体积也越小。
quality指的时JPEG图像压缩式的质量,范围为[0,100]。
set_jb_quality()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_jb_quality(35)
img = sensor.snapshot()

sensor模块提供了set_contrast()函数,用于配置摄像头输出图像的对比度,set_contrast()函数如下所示:

sensor.set_contrast(contrast)

set_contrast()函数用于配置摄像头输出图像的对比度。
contrast指的是对比度的值,范围为[-2, 2]
set_contrast()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_contrast(0)
img = sensor.snapshot()

sensor模块提供了set_brightness()函数,用于配置摄像头输出图像的亮度,set_brightness()函数如下所示:

sensor.set_brightness(brightness)

set_brightness()函数用于配置摄像头输出图像的亮度。
brightness指的是亮度的值,范围为[-2, 2]
set_brightness()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_brightness(0)
img = sensor.snapshot()

sensor模块提供了set_saturation()函数,用于配置摄像头输出图像的饱和度,set_saturation()函数如下所示:

sensor.set_saturation(saturation)

set_saturation()函数用于配置摄像头输出图像的饱和度。
saturation指的是饱和度的值,范围为[-2, 2]
set_saturation()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_saturation(0)
img = sensor.snapshot()

sensor模块提供了set_auto_gain()函数,用于配置摄像头自动增益,set_auto_gain()函数如下所示:

sensor.set_auto_gain(enable, gain_db, gain_db_ceiling)

set_auto_gain()函数用于配置摄像头的自动增益以及自动增益的上限值等。
enable指的是是否使能摄像头的自动增益,当为True时,使能摄像头的自动增益,当为False时,则不是能摄像头的自动增益。
gain_db指的是当不是能摄像头的自动增益时,设定的固定增益值,单位为dB,需要注意的时,当需要使用颜色追踪功能的时候,建议关闭摄像头的自动增益。
gain_db_ceiling指的是使能摄像头自动增益时,自动增益的上限值。
set_auto_gain()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_auto_gain(True, gain_db=0, gain_db_ceiling=16.0)
img = sensor.snapshot()

sensor模块提供了set_auto_whitebal()函数,用于配置摄像头的自动白平衡,set_auto_whitebal()函数如下所示:

sensor.set_auto_whitebal(enable)

set_auto_whitebal()函数用于配置摄像头的自动白平衡。
enable指的是是否使能摄像头的自动白平衡功能,当为True时,则使能摄像头的自动白平衡功能,当为False时,则不使能摄像头的自动白平衡功能。
set_auto_whitebal()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_auto_whitebal(True)
img = sensor.snapshot()

sensor模块提供了__write_reg()函数,用于写入摄像头的寄存器,__write_reg()函数如下所示:

sensor.__write_reg(address, value)

sensor.__write_reg()函数用于使用SCCB接口写入摄像头的寄存器。
address指的是摄像头的寄存器地址。
value指的是待写入摄像头寄存器的值。
__write_reg()函数的使用示例如下所示:

import sensor
sensor.reset()
sensor.__write_reg(0xFF, 0x01)

sensor模块提供了__read_reg()函数,用于读取摄像头的寄存器,__read_reg()函数如下所示:

sensor.__read_reg(address)

sensor.__read_reg()函数用于使用SCCB接口读取摄像头的寄存器,并返回读取到的值。
address指的是摄像头的寄存器地址。
__read_reg()函数的使用示例如下所示:

import sensor
sensor.reset()
pid = sensor.__read_reg(0x0A) << 8
pid |= sensor.__read_reg(0x0B)
print("Sensor'sproduct ID: 0x%04X" %(pid))

26.2 硬件设计
26.2.1 例程功能

  1. 使用sensor模块初始化板载的摄像头,并配置摄像头的输出帧大小以及输出格式等进行配置,最后获取摄像头采集到的图像数据,并在LCD以及CanMV IDE软件的“帧缓冲区”窗口进行显示。
    26.2.2 硬件资源
  2. 摄像头
    SCCB_SDA- IO40
    SCCB_SCL- IO41
    DVP_RESET- IO42
    DVP_VSYNC- IO43
    DVP_PWDN- IO44
    DVP_HREF- IO45
    DVP_XCLK- IO46
    DVP_PCLK- IO47
    D0~D7- DVP_D0~DVP_D7
  3. LCD
    LCD_RD- IO34
    LCD_BL- IO35
    LCD_CS- IO36
    LCD_RST- IO37
    LCD_RS- IO38
    LCD_WR- IO39
    LCD_D0~LCD_D7- SPI0_D0~SPI0_D7
    26.2.3 原理图
    本章实验内容,需要使用到板载的摄像头接口,在正点原子DNK210开发板上有两处摄像头接口分别为位于正点原子DNK210开发板底板上的ATK-MC2640摄像头模块接口,该接口用于连接正点原子的ATK-MC2640模块,另一个摄像头接口位于正点原子CNK210F核心板,该接口同于直接连接OV2640等摄像头模组,但需要特别注意的是,这两个摄像头接口不能同时使用,否则可能导致硬件损坏。
    正点原子DNK210开发板上的ATK-MC2640摄像头模块接口的连接原理图,如下图所示:


图26.2.3.1ATK-MC2640摄像头模块接口原理图

正点原子CNK210F核心板上的OV2640等摄像头模组接口的连接原理图,如下图所示:


图26.2.3.2OV2640等摄像头模组接口原理图

26.3 程序设计
26.3.1 sensor模块
有关sensor模块的介绍,请见第26.1小节《sensor模块介绍》。
26.3.2 程序流程图


图26.3.2.1 摄像头图像捕获实验流程图

26.3.3 main.py代码
main.py中的脚本代码如下所示:

import lcd
import sensor
# 初始化LCD
lcd.init()
# 初始化摄像头
sensor.reset()
# 设置摄像头输出帧大小
sensor.set_framesize(sensor.QVGA)
# 设置摄像头输出格式
sensor.set_pixformat(sensor.RGB565)
# 设置摄像头水平镜像
sensor.set_hmirror(False)
while True:# 获取摄像头输出图像img= sensor.snapshot()# 显示摄像头输出图像至LCDlcd.display(img)

可以看到首先对LCD和摄像头进行了初始化。
接着是配置摄像头输出的帧大小以及输出格式。
然后是针对摄像头的摆放方向配置摄像头进行水平镜像,水平镜像后后续才能在LCD和CanMV IDE软件的“帧缓冲区”窗口中看到“较为正常”的图像画面。
最后就是在一个循环中不断地获取摄像头输出的图像数据,然后将图像在LCD显示屏上进行显示。

26.4 运行验证
将DNK210开发板连接CanMV IDE后,点击CanMV IDE上的“开始(运行脚本)”按钮后,可以看到LCD上实时地显示这摄像头采集到的画面,如下图所示:


图26.4.1 LCD显示摄像头采集图像

此时,若使能了CanMV IDE软件的“帧缓冲区”窗口功能,则同时能在CanMV IDE软件的“帧缓冲区”窗口看到摄像头采集的图像画面,如下图所示:


图26.4.2 CanMV IDE软件“帧缓冲区”窗口显示摄像头采集图像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803568.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时网络的仿真和配置工具RTaW Pegase v4.6版本更新

01概述随着嵌入式系统日益复杂,高效可靠的设计工具变得愈发重要。RTaW公司的仿真工具RTaW-Pegase最新发布的4.6版本,为用户带来了一系列重要更新和功能增强。本文将详细介绍RTaW-Pegase v4.6版本的主要更新内容,涵盖了DDS、SOME/IP、Ethernet、CAN以及SDV等多个关键领域的改…

CTFSHOW pwn03 WrriteUp

本文来自一个初学CTF的小白,如有任何问题请大佬们指教! 题目来源 CTFShow pwn - pwn03 (ret2libc) https://ctf.show/challenges 思路 1.下载题目放到checksec先查一下2.IDA打开题目Shift + F12查看字符串发现没有system和/bin/sh,但是有libc文件。 3.用gdb的cyclic查询一…

如何正确的在项目中接入微信JS-SDK

微信JS-SDK的功能 如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系…

kafka的安装与配置

kafka的安装与配置 kafka的安装 在这我才用的是oracle云,系统是Ubuntu,在docker上按照的 安装docker 具体的安装方法请见docker-compose教程 查看docker版本 docker --versionDocker version 27.0.3, build 7d4bcd8创建 Docker Compose 文件 Kafka 依赖 Zookeeper 来管理集群…

面试官:项目中如何实现布隆过滤器?

谈起“布隆过滤器”相信大家都不陌生,它也算日常面试中的常见面试题了。例如,当面试官在问到 Redis 模块的相关问题时,可能会问到缓存穿透(Redis 四大经典问题之一),而缓存穿透的经典解决方案之一,则是“布隆过滤器”。 但是,对于布隆过滤器是什么?以及布隆过滤器的实…

LLM大模型: 生成式模型的数学原理和prompt融入image

1、(1)上文介绍了DDPM生成图片的原理和代码测试结果,训练时给样本图片加上gaussian noise,预测时也是预测gaussian noise;这里为啥要用gaussian distribution?为啥不用其他的分布?高斯分布相对比较简单,只有两个参数:均值和方差,容易控制;为啥一张随机生成的gaussio…

P3311 [SDOI2014] 数数

参考题解做法。 题目思路 数位 dp + AC 自动机好题。 直接往下递归,dfs(u, ver, limit, st) 表示目前在数字 \(n\) 的第 \(u\) 位进行讨论,\(ver\) 表示当前在 AC 自动机上的节点,\(limit\) 是是否步步紧逼 \(n\),只要位数不足 \(n\) 的位数或者有一位小于 \(n\) 的那一位就…

实验1

任务1 源代码1 #include <stdio.h> 2 int main() 3 { 4 printf("o \n"); 5 printf("<H>\n"); 6 printf("I I\n"); 7 8 return 0; 9 }

initrdinit进程

initrd的全名是 init ramdisk,是一个启动时存在于内存的文件系统。 kernal 到 initrd的流程在GRUB加载kernel时,kernel会先在内存中制造一个rootfs当做临时的空间供系统使用,接下来,kernel便会将initrd当做是一个系统,将其mount到rootfs上启动。 引入initrd的目的是为了把…

如何部署北斗定位应用,基于国产自主架构LS2K1000LA-i处理器平台

北斗卫星导航系统(以下简称北斗系统)是着眼于国内经济社会发展需要,自主建设、独立运行的卫星导航系统。经过多年发展,北斗系统已成为面向全球用户提供全天候、全天时、高精度定位、导航与授时服务的重要新型基础设施。图 1 北斗定位系统的应用优势 强可控:北斗系统是国内…

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

题解:CF573D Bear and Cavalry

CF因为这是远古题目,所以根据现在的评测机速度,用 \(O(nq)\) 的做法也是可以过的。 也就是说,我们可以每次操作直接修改对应位置上的数字,然后设计一种 \(O(n)\) 的算法求解答案。 这道题类似资源分配型动态规划,所以我们可以设 \(dp_i\) 表示分配前 \(i\) 个人的答案。 直…