将摄像头输出的原始数据文件转换成bmp图像

2023-11-02

引言:
从摄像头和传感器获得的视频数据是没有办法直接被电脑识别的,所以需要进行转化,我昨天在做项目的时候遇到了这个问题,根据查阅相关资料,实现了将摄像头输出的原始数据文件转换成bmp图像的程序。
 语言:
C/C++
测试平台:
VC6.0
 
先把bmp.h头文件贴出来:

#ifndef __BMP_H__
#define __BMP_H__
 
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef unsigned long LONG;
 
typedef struct tagBITMAPFILEHEADER { // bmfh  
    WORD    bfType;           // 文件标识‘BM’ 
    DWORD   bfSize;           // 用字节表示的整个文件的大小 
    WORD    bfReserved1;    // 保留字节,为0 
    WORD    bfReserved2;    // 保留字节,为0 
    DWORD   bfOffBits;        // 图象数据RGBA的起始地址的偏移值  为54 
} BITMAPFILEHEADER; 
 
typedef struct tagBITMAPINFOHEADER{ // bmih  
    DWORD  biSize;               // 位图信息头(Bitmap Info Header)的长度,为40  
    LONG   biWidth;               // 位图的宽度,以象素为单位 
    LONG   biHeight;              // 位图的高度,以象素为单位  
    WORD   biPlanes;             // 位图的位面数(注:该值将总是1) 
    WORD   biBitCount;           // 每个象素的位数,设为24(表示24Bit位图) 
    DWORD  biCompression;    // 压缩说明,设为0(不压缩) 
    DWORD  biSizeImage;       // 用字节数表示的位图数据的大小(该数必须是4的倍数) 
    LONG   biXPelsPerMeter;   // 用象素/米表示的水平分辨率(一般设为0)
    LONG   biYPelsPerMeter;   // 用象素/米表示的垂直分辨率(一般设为0) 
    DWORD  biClrUsed;           // 位图使用的颜色数(一般设为0) 
    DWORD  biClrImportant;    // 指定重要的颜色数(一般设为0) 
} BITMAPINFOHEADER; 

#endif 

下面就是实现代码:
注意:本人一般喜欢把指针用得很逆天,心脏不好的朋友就别往下读了 

#include <stdio.h>
#include <string.h>
#include "bmp.h"
 
 
#define WIDTH(640)
#define HEIGHT(512)
#define IMAGESIZE16 ((WIDTH)*(HEIGHT)*2)
#defineIMAGESIZE24((IMAGESIZE16/2)*3)
 
#define _DEBUG_ printf("-----------\n");
 
void pixel_rgb565_to_rgb24(const unsigned char *p16,unsigned char *p24)//将16bit的像素转化为24bit的像素
{
unsigned char R,G,B;
B=*(unsigned short*)p16 & 0x01F;
G=(*(unsigned short*)p16 & 0x7E0) >> 5;
R=(*(unsigned short*)p16 >> 11 ) & 0x1F;
*(p24+0)=B << 2; // 把5bits映射到8bits去,自己可以优化一下算法,下同
*(p24+1)=G << 1;
*(p24+2)=R << 2;
 
void image16_to_image24(const unsigned char *image16, unsigned char *image24, int biWidth, int biHeight)
{
const unsigned char *p16 = image16;
unsigned char *p24 = image24;
int i;
for(i=0; i<biWidth*biHeight; i++, p16+=2, p24+=3)
{
pixel_rgb565_to_rgb24(p16, p24);
}
}
 
void main()
{
//BITMAPFILEHEADER bmp_fileheader;
unsigned char bmp_fileheader[14];//位图文件头
BITMAPINFOHEADER bmp_infoheader;//位图信息头
 
//位图文件头
        //因为字节对齐的问题,所以位图文件头用数组来定义 
*(WORD *)bmp_fileheader = 'B' | 'M' << 8;//bfType 文件标识'BM'
*(DWORD *)(bmp_fileheader + 2) = 14 + 40 + IMAGESIZE24;//bfSize 文件的大小
*(DWORD *)(bmp_fileheader + 6) = 0; //bfReserved1 和 bfReserved2
*(DWORD *)(bmp_fileheader + 10) = 54;//bfOffBits 图象数据RGBA的起始地址的偏移值  为54 
 
//位图信息头
bmp_infoheader.biSize = 40;
bmp_infoheader.biWidth = WIDTH;//图像width
bmp_infoheader.biHeight = HEIGHT;//图像height
bmp_infoheader.biPlanes = 1;
bmp_infoheader.biBitCount = 24;//像素精度
bmp_infoheader.biCompression = 0;
bmp_infoheader.biSizeImage = IMAGESIZE24;//图像大小
bmp_infoheader.biXPelsPerMeter = 0;
bmp_infoheader.biYPelsPerMeter = 0;
bmp_infoheader.biClrUsed = 0;
bmp_infoheader.biClrImportant = 0;
 
unsigned char *imagedata16 = new unsigned char[IMAGESIZE16];
unsigned char *imagedata24 = new unsigned char[IMAGESIZE24];
 
FILE *image = fopen("D:\\image.original", "rb");
fread(imagedata16, IMAGESIZE16, 1, image);
fclose(image);
 
 
image16_to_image24(imagedata16, imagedata24, 640, 512);
 
FILE *file = fopen("D:\\ynd.bmp", "ab");
fwrite(bmp_fileheader, 14, 1, file);
fwrite(&bmp_infoheader, 40, 1, file);
fwrite(imagedata24, IMAGESIZE24, 1, file);
fclose(file);
delete []imagedata16;
delete []imagedata24;
 
}
 

 程序运行后会将D:\image.original(原始图像,16位RGB565格式)转化成电脑软件能识别的24位ynd.bmp  
好吧

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将摄像头输出的原始数据文件转换成bmp图像 的相关文章

  • ESP32 CAM学习记录 (1) ——安装开发环境及烧录固件至ESP32-CAM开发板(虚拟机开发篇)

    本次开发使用安信可官方提供的开发环境 直接在windows下用虚拟机进行开发 1 搭建开发环境 开发环境连接 https pan baidu com s 1hWJAfeDQbYiD01X6eyqgMw 用 vmware12打开虚拟机 导入安
  • 将摄像头输出的原始数据文件转换成bmp图像

    引言 从摄像头和传感器获得的视频数据是没有办法直接被电脑识别的 所以需要进行转化 我昨天在做项目的时候遇到了这个问题 根据查阅相关资料 实现了将摄像头输出的原始数据文件转换成bmp图像的程序 语言 C C 测试平台 VC6 0 先把bmp
  • 【Android -- 相机】调用摄像头拍照 & 选择照片

    效果图 现在很多应用中都会要求用户上传一张图片来作为头像 首先我在这接收使用相机拍照和在相册中选择图片 接下来先上效果图 实现代码 1 布局文件
  • jquery.webcam进行摄像头拍照

    最近由于项目要进行人像采集 所以就涉及到在web页面调用摄像头 进行拍照来获取图片 可以初来乍到 这技术又不是杠杠滴 所以在面对这有实现想法 但是又没有实现手段的时候 还是按照往常惯例找度娘 这个搜索过程可谓是无比艰辛 由于关键字不准确迟迟
  • C语言头插法创建双链表

    1 问题描述 使用头插法创建双链表 2 与单链表不同的是 双链表的结构体中多了一个变量就是指向当前节点的前驱节点 这样我们在循环遍历的时候可以通过当前节点的前驱指针找到前驱节点 在创建双链表的时候比单链表多了一个步骤就是对于前驱指针的操作
  • 将一个链表分为奇偶两个链表

    1 问题描述 设计一个算法 将一个头结点为A的单链表 其数据域为整数 分解成两个单链表A和B 使得A链表只含有原来链表data域为奇数的节点 而B链表只含有原链表中data域为偶数的节点 而且保持原来的顺序 2 思路分析 这个问题不是在线网
  • C中字符串操作

    字符串可以看作一个数组 它的每个元素是字符型的 例如字符串 Hello world n 图示如下 H e l l o w o r l d n 0 15个字符 注意每个字符串末尾都有一个字符 0 做结束符 这里的 0是ASCII码的八进制表示
  • Camera ISP

    1 ISP工作原理 ISP Image Signal Processor 即图像信号处理 主要作用是对前端图像传感器输出的信号做后期处理 依赖于 ISP 才能在不同的光学条件下都能较好的还原现场细节 景物通过 Lens 生成的光学图像投射到
  • 创客教育中常见的视觉识别摄像头介绍

    近年来 创客教育 人工智能教育在中小学日渐普及 从目前中小学教育的应用层面来说 主要包含了视觉和听觉等几个领域的人工智能教学 因此 摄像头模块或传感器 作为视觉领域必不可少的教具 也被应用的越来越多 市面上越来越多的厂家或机构 也开发了许多
  • Windows拍照报错:0xA00F424F PhotoCaptureFileCreationFailed (0x80270200)解决办法

    Windows拍照报错 0xA00F424F PhotoCaptureFileCreationFailed 0x80270200 解决办法 1 为本机照片添加库文件夹 windows 10路径 C Users Administrator A
  • 从mpeg ts文件中提取I帧(5):I帧的解码

    找到含有I帧的pes后就可以对其进行解码 对I帧的解码我们使用ffmpeg 这里用到的版本是3 0 0 一 pes解码为yuv ffmpeg一般都是这个套路 直接上代码 int ffdecode pes uint8 t pes data i
  • 保存为 JPEG with Pillow 的图像与原始图像不同。

    我有一个 3 d numpy 数组 并使用 Pillow 将其保存为 JPEG 图像 当我使用 Pillow 重新加载图像时 生成的 numpy 数组有所不同 我为此编写了一个演示代码 from PIL import Image impor
  • java中bmp转jpg

    Java中如何将bmp转换为jpg 我知道如何使用ImageIO但有没有更快或更好的方法呢 这是我在网上找到的 ImageIO 方法 Create file for the source File input new File c temp
  • 需要帮助将 BMP 图像转换为 [R] 中的矩阵吗?

    我对 R 非常陌生 我想知道是否有一种简单的方法可以将 BMP 图像转换为 R 中的矩阵 主要是 我正在寻找任何可以提供帮助的包 矩阵中每个元素的值对应于颜色 在 CRAN 软件包列表中搜索 bmp 就会出现bmp和其他一些 为了简洁起见
  • 使用 savefiledialog 保存图像时出现问题

    我正在使用 savefiledialog 来保存图像 画布是图片框 加载的图像是位图 当我尝试保存它时 文件已创建 但不知何故已损坏 因为当我尝试再次加载图像或在不同的查看器中显示时它不起作用 我的意思是保存的文件已损坏 有一种保存图像的方
  • 如何计算位图文件大小?

    如何查找 50 x 50 RGB 彩色图像的字节大小 如果将上面的图像保存为 BMP 文件 标题大小为 54 字节 则该 BMP 文件的总大小是多少 如何知道BMP文件中每个字节的内容 那么如何知道它的十六进制值呢 假设您指的是内存需求 m
  • Javax ImageIO IIOException 显然没有原因

    大家好 我有一个 Java 问题 对于我的高级研究课程 我已经基本完成 但我只需要分析我生成的图像中的一些数据 我不想将其标记为家庭作业 因为它不是任何必需作业的一部分 这是我自己想出的来收集结果的东西 我编写了一个程序来逐像素比较两个图像
  • bmp宽高比问题

    我一直在尝试了解 bmp 文件的工作原理 以便我可以渲染一些 Mandelbrot 设置图片并将它们输出为 bmp 文件 因为这似乎是最简单的方法之一 但由于某种原因 当我使用不是 1 的纵横比时 1 尽管它是 4 的幂 所以不需要填充 我
  • 使用鼠标光标捕获屏幕截图

    我使用以下代码在 Windows 上获取屏幕截图 hdcMem CreateCompatibleDC hdc int cx GetDeviceCaps hdc HORZRES int cy GetDeviceCaps hdc VERTRES
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag

随机推荐

  • QGIS - 帮助文档汇总

    Ref 1 Welcome to the QGIS project 2 QGIS Tutorials and Tips QGIS Tutorials and Tips
  • &&&&&&用法

    的含义 按位与操作 按二进制位进行 与 运算 运算规则 有 0 则为 0 0 0 0 0 1 0 1 0 0 1 1 1 x的含义 x 在计算机存储是用x的补码存储 就是在x的值的基础上进行按位取反 x 之后在增加1所得 也就是说 x x
  • Java 中Iterator 、Vector、ArrayList、List 使用深入剖析

    线性表 链表 哈希表是常用的数据结构 在进行Java开发时 JDK已经为我们提供了一系列相应的类来实现基本的数据结构 这些类均在java util包中 本文试图通过简单的描述 向读者阐述各个类的作用以及如何正确使用这些类 Collectio
  • kubectl常用命令大全详解

    这是我转载的一个博主写的 K8s 常用命令大全 里面详细介绍了 K8s 的命令 如果看了我写的入门基础篇文章 想了解更多命令可以看以下的文章 说明 Kubernetes kubectl 命令表 中文网址 Kubernetes kubectl
  • Echarts canvas大小和容器不一致

    const ele document getElementById id setTimeout gt 基于准备好的dom 初始化echarts实例 const myChart echarts init ele width document
  • python gui教程pyqt5_Python GUI教程(十五):在PyQt5中使用动画

    QT作为一个全面的桌面应用程序开发包 其自然提供了对图像的动画支持 本篇文章中 就来简单地在PYQt5中使用Animation动画功能 本篇将会依次完成以下功能 在GUI界面中显示一个图片 用一个足球做演示 点击按钮实现足球的直线射门动画
  • 如何选择一个web框架

    几乎对于你想要使用的每一种语言都有大量的web框架 我们在下面的部分列举了一些比较受欢迎的框架 有这么多选择 导致很难决定选择哪个框架为你的新web应用提供最好的开端 一些影响你决定的因素有 学习代价 学习一个web框架取决于你对底层语言的
  • 【华为OD机试】查字典【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 输入一个单词前缀和一个字典 输出包含该前缀的单词 输入描述 单词前缀 字典长度 字典 字典是一个有序单词数组 输入输出都是小写 输出描述 所有包含该前缀的单词 多个单
  • JAVA 日志脱敏实现

    业务诉求 针对敏感数据进行脱敏输出 包括手机号 姓名 密码 身份证号 银行卡号和地址等 一般金融系统和电商系统在审计时要求会比较严格 需要进行脱敏输出 脱敏方案的对比 方案 优点 缺点 适用场景 具体实现 JAVA原生实现 1 适配任意日志
  • 解决【Windows】下CMake不能生成makefile的问题

    遇到这个问题的场景是 PS C Users Administrator Desktop Cplus test build gt cmake Building for Visual Studio 16 2019 Selecting Windo
  • 交互测试。

    最近有接触到一个有趣的名词 交互测试 在对这个名词进行解释之前 我先去特意请教了一个产品经理朋友 问下交互的概念 于是知道了我们的行业里面还有很多个有趣的职位 交互设计师 UE UI 前端 设计 等等等等这些 都是跟这个交互相关 其实看到交
  • idea配置git拉取github上仓库代码

    STEP1 本地下载一个git https git scm com downloads STEP2 打开Settings 配置GitHub账号 决定你是否有权限操作Repository STEP3 配置本地git命令执行地址 也可以配置环境
  • Redis-数据结构及常用命令

    字符串 String 数据结构常用命令 SET key value 设置指定 key 的值 GET key 获取指定 key 的值 DEL key 删除指定 key INCR key 将指定 key 的值增加 1 DECR key 将指定
  • INVALID_USER_SCODE BUG 解决方案

    INVALID USER SCODE 不能定位 这个错误是说你的key有问题 你可以重新更换一下key 就可以了 1 首先先拿到你的SHA1 的值 获取命令 keytool list v keystore E jks gaodenav jk
  • 语义分割——灰度图像转伪彩色图像

    目录 检验灰度图 检验代码 灰度图转伪彩色图代码 转换代码使用细则 示例转换结果 总结 检验灰度图 制作语义分割数据集或用训练好模型测试图像时 得到的结果是灰度图像 如下 检验代码 上面图像灰度值不是全是全为0 灰度范围在 0 1 之间 使
  • android遇到的难题,Android开发遇到的三个问题

    您的位置 首页 教程 IT技术 正文 Android开发遇到的三个问题 总结我在安卓开发过程中遇到的问题 开发工具为Android Studio 编译工具为gradle 一 Execution failed for task mergeDe
  • buck dcm占空比计算_如何计算BOOST转换器的占空比

    计算BOOST变换器的占空比的关键因素 核心是什么 没错 是流过电感的电流 电感属于一个感性元器件 给我的感觉在它身上有很多神秘的色彩 需要一步一步探究 请恕我慢慢道来 其实 如果你上网问一问度娘 BOOST占空比公式 我相信你就直接知道结
  • python中的优先队列PriorityQueue

    普通的队列是一种先进先出的数据结构 元素在队列尾追加 而从队列头删除 在优先队列中 元素被赋予优先级 当访问元素时 具有最高优先级的元素最先删除 优先队列具有最高级先出的行为特征 通常采用堆数据结构来实现 我们可以利用优先队列中元素被赋予优
  • Blinker控制esp8266 01s实现远程控制继电器开关代码

    该代码只实现Blinker通过按钮on和off两种状态来实现继电器的通断 从而控制连接的电路 define BLINKER WIFI 以WIFI方式接入 BLINKER BLE以蓝牙方式接入 include
  • 将摄像头输出的原始数据文件转换成bmp图像

    引言 从摄像头和传感器获得的视频数据是没有办法直接被电脑识别的 所以需要进行转化 我昨天在做项目的时候遇到了这个问题 根据查阅相关资料 实现了将摄像头输出的原始数据文件转换成bmp图像的程序 语言 C C 测试平台 VC6 0 先把bmp