STM32F4_照相机

news2024/12/20 6:44:13

目录

前言

1. BMP编码

2. JPEG编码


前言

        我们所要实现的照相机,支持BMP图片格式的照片和JPEG图片格式的照片。

1. BMP编码

BMP文件是由文件头、位图信息头、颜色信息和图形数据四部分构成。

1. BMP文件头(14个字节):BMP文件头数据结构含有BMP文件类型、文件大小和位图起始位置等信息。

//BMP文件头

typedef__packed struct
{
    u16 bfType;  //文件标志,只对‘BM’,用来识别BMP位图类型
    u32 bfSize;  //文件大小,占四个字节
    u16 bfReserved1;  //保留
    u16 bfReserved2;  //保留
    u32 bfOffBits;    //从文件开始到位图数据(Bitmap data)开始之间的偏移量
}BITMAPFILEHEADER;

2. 位图信息头(40个字节):BMP位图信息头数据用于说明位图的尺寸等信息

typedef __packed struct 
{ 
 u32 biSize ; //说明 BITMAPINFOHEADER 结构所需要的字数。 
 long biWidth ; //说明图象的宽度,以象素为单位 
 long biHeight ; //说明图象的高度,以象素为单位 
 u16 biPlanes ;  //为目标设备说明位面数,其值将总是被设为 1 
 u16 biBitCount ; //说明比特数/象素,其值为 1、4、8、16、24、或 32 
 u32 biCompression ; //说明图象数据压缩的类型。其值可以是下述值之一: 
 //BI_RGB:没有压缩; 
 //BI_RLE8:每个象素 8 比特的 RLE 压缩编码,压缩格式由 2 字节组成 
 //BI_RLE4:每个象素 4 比特的 RLE 压缩编码,压缩格式由 2 字节组成 
 //BI_BITFIELDS:每个象素的比特由指定的掩码决定。 
 u32 biSizeImage ; //说明图象的大小,以字节为单位。当用 BI_RGB 格式时,可设置为 0 
 long biXPelsPerMeter ;//说明水平分辨率,用象素/米表示 
 long biYPelsPerMeter ;//说明垂直分辨率,用象素/米表示 
 u32 biClrUsed ; //说明位图实际使用的彩色表中的颜色索引数 
 u32 biClrImportant ; //说明对图象显示有重要影响的颜色索引的数目, 
//如果是 0,表示都重要。 
}BITMAPINFOHEADER ; 

3. 颜色表:颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。

typedef__packed struct
{
    u8 rgbBlue;   //指定蓝色强度
    u8 rgbGreen;  //指定绿色强度
    u8 rgbRed;    //指定红色强度
    u8 rgbReserved; //保留,设置为0
}RGBQUAD;

4. 位图数据:位图数据记录了位图的每一个像素值,记录顺序是扫描行内从左到右,扫描行之间从下到上。位图的一个像素值所占的字节数:

当 biBitCount=1 时,8 个像素占 1 个字节; 

当 biBitCount=4 时,2 个像素占 1 个字节; 

当 biBitCount=8 时,1 个像素占 1 个字节; 

当 biBitCount=16 时,1 个像素占 2 个字节; 

当 biBitCount=24 时,1 个像素占 3 个字节; 

当 biBitCount=32 时,1 个像素占 4 个字节; 

biBitCount=1 表示位图最多有两种颜色,绝大多数情况下是黑色和白色,也可以自己定义。

图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图像数据阵列中每一位表示一个像素。如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。

保存为BMP格式的图片文件的步骤:

1. 创建BMP位图信息,并且初始化各个相关信息

我们要设置 BMP 图片的分辨率为 LCD 分辨率、BMP 图片的大小(整个 BMP 文件 大小)、BMP 的像素位数(16 位)和掩码等信息。

2. 创建新BMP文件,写入BMP位图信息

我们要保存 BMP,当然要存放在某个地方(文件),所以需要先创建文件,同时先保存 BMP 位图信息,之后才开始 BMP 数据的写入。

3. 保存位图数据

从LCD的GRAM里面读取各点的颜色值,依次写入第二步创建的BMP文件即可。注意:保存顺序(也就是读取GRAM顺序)是从左到右,从下到上。

4. 关闭文件

使用FATFS,在文件创建之后,必须调用 f_close,文件才会真正的体现在文件系统里面,否则是不会写入的!注意:写完之后,一定要调用 f_close。

2. JPEG编码

        JPEG(Joint Photographic Experts Group)是一个由ISO和IEC两个组织机构联合组成的专家组,负责制定静态的数字图像数据压缩标准,这个专家组开发的算法称为JPEG算法,并且成为国际上通用的标准,又称为JPEG标准

        JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换为基础的有损压缩算法,另一种是采用以预测技术为基础的无损压缩算法

        JPEG压缩是有损压缩,他利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息

        JPEG压缩编码分为三个步骤:

        1. 使用正向离散余弦变换把空间域表示的图变成频率域表示的图

        2. 使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的

        3. 使用霍夫曼可变字长编码器对量化系数进行编码

        DMA接收来自OV2640的JPEG数据流,首先使用M0AR(内存1)来存储,当M0AR满了以后,自动切换到M1AR(内存2),同时程序读取M0AR(内存 1)的数据到外部 SRAM; 当 M1AR 满了以后,又切回 M0AR,同时程序读取 M1AR(内存 2)的数据到外部 SRAM;依 次循环(此时的数据处理,是通过 DMA 传输完成中断实现的,在中断里面处理),直到帧中断, 结束一帧数据的采集,读取剩余数据到外部 SRAM,完成一次 JPEG 数据的采集。

        M0AR,M1AR所指向的内存,必须是内部内存,不过由于采用了双缓冲机制,我们不必定义一个很大的数组,一次性接收所以的JPEG数据了,而是可以分批次接收,数组可以定义的比较小。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在ESP32-Arduino开发中添加其它Arduino库

目录 前言 原理说明 操作步骤 下载Bounce 安装Bounce 将下载的文件夹(压缩包需要解压)移动到components/arduino/libraries路径下,并重命名为Bounce2 查看添加库里所有的源文件位置 在arduino的CMakeList.txt里添加库源文件 使用Bounce 前言 乐鑫官方的es…

HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

一、HTTP介绍二、HTTP工作原理HTTP三点注意事项 三、HTTP消息结构四、客户端请求消息五、服务器响应消息HTTP请求方法 七、HTTP响应头信息八、HTTP状态码(HTTP Status Code)下面是常见的HTTP状态码:HTTP状态码分类HTTP状态码列表 一、HTTP介绍…

旁注、目录越权、跨库查询、cdn绕过

原理: 搭建网站多IP多端口,更多一个域名多网站,IIS的在属性-高级里面设置主机头设置域名,域名是收费的需要自己买一个 旁注:在同一服务器上有多个站点,要攻击的这个站点假设没有漏洞,可以攻击…

Spark大数据分析与实战笔记(第一章 Scala语言基础-5)

文章目录 每日一句正能量章节概要1.5 Scala的模式匹配与样例类1.5.1 模式匹配字符匹配匹配字符串守卫匹配类型匹配数组、元组、集合 1.5.2 样例类 课外补充偏函数 每日一句正能量 “成功的秘诀,在于对目标的执着追求。”——爱迪生 无论是在工作、学习、还是生活中&…

控制台的设置

目录 win32 API : 什么是API : 控制台: 控制台与VS: 控制台的控制: 控制台窗口设置: 1、mode函数: 2、title 函数: 在C语言中的实现: 控制台的坐标设置&#…

python 之numpy 之随机生成数

文章目录 1. **生成均匀分布的随机浮点数**:2. **生成随机整数**:3. **生成标准正态分布随机数**:4. **生成正态分布随机数**:5. **生成均匀分布的随机浮点数**:6. **生成随机抽样**:7. **设置随机数种子**…

Linux下Samba服务安装及启用全攻略

Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示:本文详解了在Linux系统下如何安装和启用Samba服务,涵盖了从…

商家收款码手续费太高了

在竞争激烈、各行各业都如此内卷的当下,商家需要不断寻求提高利润的方法。所谓开源节流,既要学会提高利润率,也要学会节省成本,毕竟钱是挣出来的,同时也是省出来的。作为一个经常使用收款工具的商家,很多人…

Ubuntu源码编译samba

概述 本人最近研究samba的源码,但是在源码编译的时候,本以为直接config,make,make install。没想到编译过程中碰到很多麻烦,主要是各种依赖问题。 基于此,本文把samba编译的详细过程记录下来,以供再次研究借鉴。 软件…

Javascript命令模式

Javascript命令模式 1 什么是命令模式2 命令模式的例子—菜单程序3 JavaScript 中的命令模式4 撤销命令5 宏命令 1 什么是命令模式 在一个餐厅中,当客人现场点餐或者打电话订餐时,老板会把客人的需求写在清单上,厨师会按照清单的顺序给客人炒…

qt 多语言版本 QLinguist使用方法

在使用qt开发一款软件时,可能需要考虑显示文本中英文等多语言版本。可以使用qt语言家的方式实现。 步骤: 1、代码中给控件设置文本时,记得带上QObject::tr() 2、工程pro文件中加入 TRANSLATIONS demo2_en.ts 3、Qt creator点击“工具”—“外…

C语言【文件】

目录 概念 文件名 文件的打开和关闭 fopen fclose 输入输出函数 fputc fgetc fputs fgets fprintf fscanf fwrite fread 三种流 scanf和sprintf 结构体转化 ​编辑 文件的随机读写 fseek ftell rewind 文本文件和二进制文件 文件读取结束的判定 文件缓冲…

【试题035】逻辑非!例题

1.题目:下列表达式值为1的是? A. 3 & 4 B. 2 >5 C. ! !8 D. 0 ! 0 2.分析: 关于A选项: 3的二进制是:0011 4的二进制是:0100 0011 & 0100 00000 关于B选项: …

双势阱模型

双势阱模型 原子钟 传统的原子钟利用氨分子 由于隧道效应,上顶点的氮原子可以贯穿三个氢原子形成的势垒,到达下顶点对体系注入微波能量后,氮原子在上下定点之间振荡,体系的能量在两个稳定态之间交替变换,其振荡频率决…

2023淘宝十一预售今天20点开启!有什么优惠活动我们来一起看一下!

2023双11预售玩法将于今天20点正式开启!有神优惠活动和玩法攻略,我,们一起来看一下! 今双十一预售有加购赢清空购物车大奖,攒幸运值领红包,限时抢免定金福利,做任务攒幸运值赢免定特权这几大活…

PS001:PS2020及GeographicImager6.2安装

引言:Geographic ImagerV6.2是一款专业的PS地理成像插件,通过安装这款插件可实现在PS中加载4G以上的.bigtiff格式影像并对其进行修改与保存。并且这款软件拥有投影信息修改、基于地理坐标进行影像裁切等多种功能。 一、插件介绍 Geographic ImagerV6.2是…

【Windows】Edge浏览器自动更新服务启用选禁用被拒绝访问的解决方案

Windows系统的服务窗口里,把一些服务的启动类型选择禁用有可能会提示拒绝访问,怎么弄呢,这里讲一讲怎样禁用这个服务。 举一个类似禁用服务的例子:怎样关闭Edge浏览器的自动更新服务, 关闭服务 已知,Win…

CesiumJS 中绘制大多边形

本文翻译自Cesium官方,有改动。 本文中提及到的“大多边形”就如下图所示。 在Cesium的早期版本和一些引擎中,我们绘制这种跨度比较大的多边形,经常会看到一些奇怪的冲突问题,如下图所示。 要渲染任何几何体,我们必…

makesense在线yolov5标注

文章目录 一、创建图片文件夹和label.txt二、在线标注数据 参考文章博主:风吹落叶花飘荡 一、创建图片文件夹和label.txt 创建一个放置图片的文件夹images,存放需要标注的图片(图片最好重命名为1,2,3…避免后面混淆) 创建label.t…

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain----《BadNets:识别机器学习模型供应链中的漏洞》 背景: 许多用户将训练过程外包给云计算,或者依赖于经过训练的模型,然后根据特定的任务对模型进行微调。这…