STM32F4_照相机

目录

前言

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.mzph.cn/news/114797.shtml

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

相关文章

numpy矩阵画框框

在n>5(n是奇数)的nn数组中,用*画外方框和内接菱形。 (本笔记适合熟悉numpy的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那…

c++中的继承

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、继承的概念及定义1、继承的概念2、继承的定义2.1 定义格式2.2 继承关系和访问限定符2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承…

【27】c++设计模式——>迭代器模式(遍历双向链表)(2)

//实现双向链表 #pragma once #include<iostream> #include<string> #include<vector> using namespace std;class Iterator; class ForwardIterator; class ReverseIterator;//链表的最小组成部分是一个节点&#xff0c;先实现一个节点 struct Node //c中st…

在Espressif-IDE中使用Wokwi仿真ESP32

陈拓 2023/10/17-2023/10/19 1. 概述 在Espressif-IDE v2.9.0版本之后可直接在IDE中使用Wokwi模拟器。 1.1 什么是 Wokwi 模拟器&#xff1f; Wokwi 是一款在线电子模拟器&#xff0c;支持模拟各种开发板、元器件和传感器&#xff0c;例如乐鑫产品 ESP32。 Wokwi 提供基于浏…

html表格标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--表格table 行 tr 列 td --> <table border"1px"><tr> <!--colsp…

逻辑漏洞详解

原理&#xff1a; 没有固定的概念&#xff0c;一般都是不符合常识的情况。比如任意用户注册&#xff0c;短信炸弹&#xff0c;占用资源&#xff0c;交易支付、密码修改、密码找回、越权修改、越权查询、突破限制。 根据实际业务逻辑进行比对&#xff0c;购物的可以根据数量&a…

gulp打包vue3+jsx+less插件

最终转换结果如下 在根目录下添加gulpfile.js文件&#xff0c;package.json添加命令npm run gulp var gulp require(gulp) var babel require(gulp-babel) var less require(gulp-less) var del require(del); var spawn require(child_process).spawn;const outDir &…

【FPGA零基础学习之旅#16】嵌入式块RAM-双口ram的使用

&#x1f389;欢迎来到FPGA专栏~双口ram的使用 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

X32位汇编和X64位区别无参函数分析(一)

前言 一、X32汇编函数无参无返回分析 二、X64汇编函数无参无返回分析 总结 前言 提示&#xff1a;以下是个人学习总结&#xff1a;如有错误请大神指出来&#xff0c;只供学习参考&#xff0c;本内容使用使用VS2017开发工具&#xff1a;语言是C&#xff0c;需要一些常见的汇编指…

手机知识:安卓内存都卷到24GB了,为何iPhone还在固守8GB

目录 一、系统机制 二、生态差异 三、总结 在刚刚过去的9月&#xff0c;年货iPhone 15系列正式发布&#xff0c;标准版不出意外还是挤药膏&#xff0c;除了镜头、屏幕有些升级&#xff0c;芯片用iPhone 14 Pro系列的&#xff0c;内存只有6GB&#xff1b;即使是集钛合金机身、…

【大数据】Kafka 实战教程(一)

Kafka 实战教程&#xff08;一&#xff09; 1.Kafka 介绍1.1. 主要功能1.2. 使用场景1.3 详细介绍1.3.1 消息传输流程1.3.2 Kafka 服务器消息存储策略1.3.3 与生产者的交互1.3.4 与消费者的交互 2.Kafka 生产者3.Kafka 消费者3.1 Kafka 消费模式3.1.1 At-most-once&#xff08;…

NVIDIA NCCL 源码学习(十一)- ring allreduce

之前的章节里我们看到了nccl send/recv通信的过程&#xff0c;本节我们以ring allreduce为例看下集合通信的过程。整体执行流程和send/recv很像&#xff0c;所以对于相似的流程只做简单介绍&#xff0c;主要介绍ring allreduce自己特有内容。 单机 搜索ring 在nccl初始化的过…

51单片机仿真软件 Proteus 8 Pro 安装步骤

51单片机仿真软件 Proteus 8 Pro 安装步骤 学习 51 单片机的时候&#xff0c;如果手头没有开发板&#xff0c;可以使用仿真软件 Proteus。Proteus 可以仿真 51 单片机及周边元器件&#xff08;例&#xff1a; LED&#xff09; 的运行情况。 可以简单认为&#xff1a;Proteus …

经典链表问题:解析链表中的关键挑战

这里写目录标题 公共子节点采用集合或者哈希采用栈拼接两个字符串差和双指针 旋转链表 公共子节点 例如这样一道题&#xff1a;给定两个链表&#xff0c;找出它们的第一个公共节点。 具体的题目描述我们来看看牛客的一道题&#xff1a; 这里我们有四种解决办法&#xff1a; …

pandas写入MySQL

安装好pandas、mysql pip install pandas pip install pymysql 导入pandas、mysql import pymysql as mysql import pandas as pd 建立连接 conmysql.connect(host10.10.0.221,userroot,passwordroot,databasepandas,port3306,charsetutf8) 创建游标 curcon.cursor() 读…

文档的重要性及接口文档模板

随着工作年限的增长&#xff0c;我们逐渐意识到工作中文档的重要性不可忽视。优质的文档不仅能提高工作效率&#xff0c;还能有效降低沟通成本&#xff0c;因此我们必须注重文档的撰写和格式。最近&#xff0c;由于未能及时更新文档&#xff0c;导致在项目开发中出现了信息冲突…

Vue解决 npm -v 报错(一)

报错内容&#xff1a; npm WARN config global --global, --local are deprecated. Use --locationglobal instead. 解决方案&#xff1a; 代码&#xff1a; prefix -g 替换为&#xff1a; prefix --locationglobal 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023.1…

文心一言 VS 讯飞星火 VS chatgpt (118)-- 算法导论10.3 3题

三、用go语言&#xff0c;在ALLOCATE-OBJECT和 FREE-OBJECT过程的实现中&#xff0c;为什么不需要设置或重置对象的 prev 属性呢? 文心一言&#xff1a; 在 Go 语言中&#xff0c;ALLOCATE-OBJECT 和 FREE-OBJECT 过程的实现通常不需要显式地设置或重置对象的 prev 属性。这…

Java EE-使用Servlet搭建一个简单的前后端交互程序

上述前端和后端的代码如下&#xff1a; 前端&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vie…

搭建网站七牛云CDN加速配置

打开七牛云后台&#xff1b;添加域名&#xff1b; 添加需要加速的域名&#xff0c;比如我添加的是motoshare.cn 源站配置&#xff0c;这里要用IP地址&#xff0c;访问的目录下面要有能访问测试的文件&#xff0c;尽量不要用源站域名&#xff0c;这个只能用加速二级域名&#x…