2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(二)

09 电路设计

前面介绍了系统的硬件框图如下:

硬件基本分为三块,两个摄像节点,一个终端节点。

 1. 摄像节点硬件

摄像节点由一个DE10-Nano开发板和一个D8M摄像头实现,DE10-Nano开发板的HDMI接口外接HDMI显示器来显示拍摄到的视频。

DE10-Nano开发板硬件

DE10-Nano开发板基于Cyclone V SoC FPGA,拥有110K逻辑单元和ARM Cortex A9双核处理器,其FPGA资源可用于算法加速。

FPGA端包含HDMI接口,可连接HDMI显示器显示视频;2×20的GPIO接口,可连接GPIO接口的子卡。

HPS端包含1GB容量的DDR3内存;USB OTG接口,支持USB摄像头、鼠标、键盘等硬件;千兆以太网口,可实现网络传输。

MicroSD卡插槽,可以插入烧写了镜像的SD卡,运行Linux系统。

D8M摄像模块硬件

D8M-GPIO是 一个2×20 pin GPIO接口的八百万像素摄像头子卡,包含MIPI Camera Module和MIPI Decoder。(Mobile Industry Processor Interface简称MIPI。)

MIPI Camera module拍摄视频后输出MIPI视频信号数据包,通过MIPI decoder转换成拜耳阵列(bayer pattern,10-bits parallel),最终由2x20 pin GPIO接口输出。

2. 终端节点硬件

终端节点由一个DE10-Nano开发板实现,并外接HDMI显示器来显示摄像节点传输过来的视频以及测量结果。并用声光提示模块发出声光提示信息。

声光提示电路

实现声光提示功能的电路由一个蜂鸣器和一个红色LED组成,这是一个简单的蜂鸣器驱动模块。

10 摄像节点程序设计

1. 摄像节点整体介绍

摄像节点程序包含FPGA和SoC两部分,FPGA中实现了一个Diff Processor,Diff Processor获取D8M摄像头拍摄到的视频流数据并进行处理,然后将处理的结果写入HPS DDR3内存中。

SoC中的应用程序初始化Diff Processor中的IP并配置帧间差分法的阈值,通过乒乓控制决定将Diff Processor的结果写入wBuffer1或wBuffer2,然后读取wBuffer得到Diff Processor处理的结果再进行进一步的处理,最后将图像结果通过UDP发送到终端节点,数据结果通过TCP发送到终端节点。

2. FPGA端的Diff Processor设计

这是FPGA中Diff Processer的框图,Diff Processer系统是使用Platform Designer工具搭建的,其中2D FIR(2D滤波)、Scaler(缩放)、Color Plane Sequencer(色彩平面定序器)、Color Space Converter(色彩空间转换) IP为Quartus Prime软件中已有的视频处理IP;Terasic Camera、Terasic Frame Diff D8M、Terasic VIP Capture IP为友晶自定义IP。

Diff Processer的处理过程为:Terasic Camera将D8M摄像头获取的拜耳阵列转换为RGB24图像,大小为640×480,然后使用2D FIR进行滤波处理,再使用Scaler将图像缩放为320×240,通过Color Plane Sequencer将图像复制为两份,一份保持不变,一份通过Color Space Converter将图像转换为灰度图,再次通过Color Plane Sequencer将原图像与灰度图合并,得到320×240的RGB+Gray的4通道图像。Terasic Frame Diff D8M处理图像的过程为,Line Buffer缓存上一帧灰度图,与当前帧的灰度图做差分并判断是否大于阈值,然后将帧间差分结果图像与原图像合并得到结果帧。最后用Terasic VIP Capture 将结果帧写到Buffer。

Terasic Camera自定义IP用于实现将拜尔阵列转换为RGB图像,并将frame输出为Avalon-ST(Avalon-Streaming,Avalon流)。

- Terasic Frame Diff D8M自定义IP采用Streaming协议处理1路输入,使用Line buffer缓存,缓存帧与当前帧进行差分,还包含1路结果视频流输出;并且实现了控制寄存器,可以设置帧间差分法阈值变化。为了兼顾视频流和数据集的采集,这里将原图像与差分结果组合成4通道的图像进行输出。

Terasic VIP Capture自定义IP用于实现接收Streaming协议视频流和动态切换指定目标buffer地址。

3. HPS端的C程序设计

首先创建并初始化TCP和UDP Socket,TCP用来传输数据,UDP用来传输图像,接着创建线程处理TCP消息,在这个线程中,摄像节点等待终端节点发送的start指令和请求数据指令,如果是start指令,就开始收集数据,如果是请求数据指令,则停止数据收集并发送数据集到终端节点,然后初始化FPGA IP基地址和buffer,并设置帧间差分法的阈值,接着获取第一帧图像并记录时刻t,再获取下一帧并记录时刻t,然后diff processor会对两帧图像进行处理,读取处理结果并分离得到原图像和帧间差分结果图像,在帧间差分结果图像中查找最大框,如果有最大框就用红框框住激光笔轮廓并压缩图像发送到终端节点,如果没有最大框就压缩原图像发送到终端节点,最后根据终端节点发送的指令来判断是否收集数据集。

11 终端节点程序设计

初始化用户界要有摄像节点A和B的画面显示、消息显示框以及测量结果的显示:

此外还有三个按钮,Start按钮用来发送指令给摄像节点A和B,Show Camera A按钮用来显示摄像节点A的数据和拟合曲线,Show Camera B按钮用来显示摄像节点B的数据和拟合曲线。

然后是声光系统初始化,再接着创建一个线程用于处理结果数据,初始化Socke并创建5个线程,最后等待按钮事件。

下面我们具体介绍创建的5个线程,分别是摄像节点A、B的UDP数据处理线程和TCP数据处理线程,还有一个计时和数据请求线程。

其中,UDP数据处理线程首先创建UDP Server,然后等待接收摄像节点A、B发送的图像数据,然后解压图像并显示。

TCP数据处理线程首先创建TCP Client,然后连接摄像节点A、B的TCP Server,之后等待接收摄像节点发送的数据集,计算得到周期、线长和位移,计算完成后设置标志为True。

计时和数据请求线程主要是判断是否开始测量以及测量时间是否大于10s,如果测量时间达到10s,就发送请求数据指令给摄像节点。

最后是结果数据处理线程,先判断摄像节点A、B是否计算完成,如果没有计算完,则先判断是否还在计时,如果是则打印计时消息并继续等待摄像节点计算完成。

当摄像节点A和B都计算完成后,首先将标志位清零,然后判断摄像节点A的位移和B的位移哪一个更大,选择位移较大的节点计算的线长作为最终线长并显示,接着计算角度θ并显示,然后声光提示,最后停止计时。

12 拟合cos函数程序设计

当终端节点收到摄像节点采集到的数据集(包含激光笔轮廓左上角的坐标x和y、轮廓的宽和长以及时刻t)时会对数据集进行初步的处理。

首先是将激光笔左上角的坐标值x+激光笔轮廓的宽/2,得到激光笔中心点的坐标值x。然后再将数据集的所有时刻都减去第一个时刻值,也就是将第一个数据作为0时刻的数据。

接着通过插值来增加数据量。

先是使用Linear space函数创建时刻t的等差数列,函数的第一个参数为样本数据开始点,也就是时刻0,第二个参数为样本数据的结束点,也就是最后一个时刻值,第三个参数为样本数据量,这里我们插值500个时刻数据。

接下来使用Univariate Spline函数对已有的数据集进行平滑曲线拟合,得到函数关系式function2,然后利用拟合的函数关系,计算出插值时刻对应的位移x。

最后使用最小二乘法拟合cos函数。

第一步是使用fft frequency函数得到傅里叶变换的采样频率,然后使用fft函数计算离散傅里叶变化。由于离散傅里叶变化在一段有限长的离散信号中,找出它含有的各个频率的正弦波分量,因此我们可以选取离散傅里叶变化中最大值对应的频率作为cos函数的初始频率,

接着用最大位移-最小位移,/2,得到初始振幅值,周期=1/频率,初相设为0,计算所有位移的平均值作为偏距。

然后使用least square函数拟合cos函数,第一个参数为误差函数,首先定义目标函数为Acos(2pi/T*t+phi)+偏距,那么误差函数为:y-目标函数值。第二个参数为函数的参数p0。第三个参数为数据集,least square函数的返回值parameter是一个元组,元组的第一个元素为cos函数的参数列表,最后输出cos函数的参数。

END

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask + Bootstrap vs Flask + React/Vue:初学者指南

在这篇博客文章中,我们将比较 Flask Bootstrap 和 Flask React/Vue 这两种技术栈,以帮助初学者了解哪种组合更适合他们的项目需求。我们将从学习曲线、易用性、依赖管理、构建部署和路由定义等方面进行比较。 学习曲线 Flask 是一个基于 Python 的轻…

信息系统项目管理师0055:优化和持续改进(4信息系统管理—4.1管理方法—4.1.5优化和持续改进)

点击查看专栏目录 文章目录 4.1.5优化和持续改进1.定义阶段2.度量阶段3.分析阶段4.改进/设计阶段5.控制/验证阶段4.1.5优化和持续改进 优化和持续改进是信息系统管理活动中的一个环节,良好的优化和持续改进管理活动能够有效保障信息系统的性能和可用性等,延长整体系统的有效使…

偏微分方程算法之一阶双曲差分法

目录 一、研究目标 二、理论推导 2.1 引言 2.2 迎风格式 2.3 完全不稳定差分格式 2.4 蛙跳格式(Leapfrog) 2.5 Lax-Friedrichs格式 2.6 Lax-Wendroff格式 2.7 Beam-Warming格式 2.8 隐格式 2.9 Courant-Friedrichs-Lewy条件(CFL条…

一文学会时序约束

主时钟约束命令/生成时钟约束命令IO输入输出延迟约束命令及效果最大最小延迟命令及作用多周期路径怎么约束什么情况设置伪路径时钟组设置的三个选项 如果不了解时序分析可以先看下下面这篇文章: 数字IC/FPGA——时序分析 目录 1.时钟约束(1)…

线性代数---行列式的性质

1. 行列式的行与列(按原顺序)互换

redis的数据结构报错

文章目录 redis的数据结构报错Redis使用LocalDateTime报错问题 redis的数据结构报错 Redis使用LocalDateTime报错问题 SpringBoot整合Redis时,使用LocalDate以下报错 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: C…

数字时代安全风险防范与保密科技创新

文章目录 前言一、新技术应用带来的保密挑战1.1 通过技术手段获取国家秘密和重要情报日益普遍1.2 新型信息技术存在的风险不容忽视 二、加强保密科技创新的必要性2.1 提高定密准确性2.2 及时变更密级或解密2.3 对失泄密事故案件进行自动高效的预警和初步处理 三、保密科技创新中…

Jenkins机器已经安装了ansible, 运行的时候却报错ansible: command not found

操作系统:MacOS Jenkins log提示 ansible: command not found 直接在Jenkins 机器中,进入一样的目录执行ansible --version OK 原因: Jenkins 默认使用的环境是 /usr/bin, 而我的ansible 安装配置在conda3 下面,所以需要在Jenkin…

OpenCV从入门到精通实战(四)——答题卡识别判卷系统

基于OpenCV的答题卡识别系统,其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术,自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述: 1. 导入必要的库 系统首先导入…

修改npm全局安装模式的路径

修改npm全局安装模式的路径 由于之前安装过nodejs,并且配置环境变量以及cache 、prefix 的信息; 由于项目需求安装最新版本的Nodejs,把环境变量的path相关目录进行调整,然后使用一下命令进行安装cnpm命令; npm insta…

本地启用并操作Redis

本篇文章将向各位讲解redis的基础用法,废话不多说我们直接开始吧! 首先需要下载redis到你本地,我这儿是下载到以下文件夹中: 双击redis-server.exe文件运行redis: 然后我们另外启用一个命令窗口(需要进入你…

决策树分类器(保姆级教学) 定义+特性+原理及公式+鸢尾花分类经典问题示例(完整Python代码带详细注释、保姆级分部代码解释及结果说明、决策树可视化及解释)

文章目录 引言定义特性基本原理和公式理解信息增益(ID3算法)熵的定义条件熵信息增益的计算 基尼不纯度(CART算法)基尼不纯度的定义基尼不纯度的计算例子 实现步骤解决鸢尾花分类问题(机器学习入门中的经典案例Python代…

在Linux上用最原始的方式查看内存情况

2024年4月18日,周四上午 cat /proc/meminfo

Hive进阶(3)----Checkpoint机制(赋图助君理解)

Checkpoint机制 一、Checkpoint机制概念 本机制可以参考《Hadoop权威指南》第十一章: fsimage文件其实是Hadoop文件系统元数据的一个永久性的检查点,其中包含Hadoop文件系统中的所有目录和文件idnode的序列化信息;fsimage包含Hadoop文件系统…

心学从0开始学习rust-十万个为什么篇章(持续更新篇章)

问答环节 1.const x 1;和let x 1有何区别呢,const申请的是全局变量所以会一直有效对吗? const 声明的常量具有全局作用域,但它们不能直接在函数内部声明。常量通常用于定义整个程序中使用的值,如配置常量或数学常量。 let 声明…

Claude和chatgpt的区别

ChatGPT是OpenAI开发的人工智能的聊天机器人,它可以生成文章、代码并执行各种任务。是Open AI发布的第一款大语言模型,GPT4效果相比chatgpt大幅提升。尤其是最新版的模型,OpenAI几天前刚刚发布的GPT-4-Turbo-2024-04-09版本,大幅超…

(八)Pandas窗口数据与数据读写 学习简要笔记 #Python #CDA学习打卡

一. 窗口数据(Window Functions) Pandas提供了窗口函数(Window Functions)用于在数据上执行滑动窗口操作,可以对数据进行滚动计算、滑动统计等操作。需要注意的是,在使用窗口函数时,需要根据实际需求选择合适的窗口大小和窗口函数&#xff0…

云原生Kubernetes: K8S 1.29版本 部署Kuboard

目录 一、实验 1.环境 2.K8S 1.29版本 部署Kuboard (第一种方式) 3.K8S 1.29版本 部署Kuboard (第二种方式) 4.K8S 1.29版本 使用Kuboard 二、问题 1.docker如何在node节点间移动镜像 一、实验 1.环境 (1)主机 表1 主机 主机架构版本IP备注ma…

SPI接口的74HC595驱动数码管实现

摸鱼记录 Day_17 (((^-^))) review 前边已经学习了: 数码管显示原理:数码管动态扫描显示-CSDN博客 且挖了个SPI的坑坑 1. 今日份摸鱼任务 学习循环移位寄存器18 串行移位寄存器原理详解_哔哩哔哩_bilibili 学习SPI接口的74HC595驱动数码管19 SPI…

【机器学习300问】75、如何理解深度学习中Dropout正则化技术?

一、Dropout正则化的原理是什么? Dropout(随机失活)正则化是一种用于减少神经网络中过拟合现象的技术。Dropout正则化的做法是: 在训练过程中的每次迭代中,随机将网络中的一部分权重临时"丢弃"(即…