基于system verilog的图像处理验证平台 bmp文件解析

版权所有:转载请注明 https://blog.csdn.net/jayash/article/details/79947314

基于FPGA的图像处理中,rtl代码的仿真验证一直是重中之重, 之前也在我们的书中《基于FPGA的数字图像处理原理及应用》(电子工业出版社)中提出了基于VC和verilog的仿真验证平台。该验证平台仅能提供简单的图像数据的交互,并且需要VC平台的交互。VC可提供较好的UI功能,但是对于一些中间结果的验证还是比较麻烦。最近刚好学习了system verilog,其面对对象的设计特性很类似于C++,可完整实现更加方便和功能更加全面的testbench平台。

今天主要介绍bmp文件的读取及解析。bmp文件的格式详解可参考以下链接:

https://www.cnblogs.com/l2rf/p/5643352.html

bmp文件解析主要是bmp文件头的解析以及图像数据内容的重定位。bmp文件头主要类型定义如下:

typedef struct{u32   biSize;u32   biWidth;u32   biHeight;u16   biPlanes;u16   biBitCount;u32   biCompression;u32   biSizeImage;u32   biXPelsPerMeter;u32   biYPelsPerMeter;u32   biClrUsed;u32   biClrImportant;} BITMAPINFOHEADER;typedef struct {u8    rgbBlue;u8    rgbGreen;u8    rgbRed;u8    rgbReserved;} RGBQUAD;typedef struct {BITMAPINFOHEADER    bmiHeader;RGBQUAD             bmiColors[1];} BITMAPINFO;typedef struct  {u16    bfType;u32    bfSize;u16    bfReserved1;u16    bfReserved2;u32    bfOffBits;} BITMAPFILEHEADER;

bmp文件主要有两个header,包括一个14字节的header BITMAPFILEHEADER,包含了bmp文件头信息,以及 一个40字节的header BITMAPINFOHEADER,包含了bmp文件的图像相关信息。

解析的主要要点有:

1 内存存放问题:分辨率不为4的倍数的每一行之后会补零,保证每一行的占用内存是4的倍数;

2 数据组织问题:bmp的组织原则是首先存放最后一行,接着倒数第二行,以此类推,解析时需还原;

解析代码如下:(代码为system verilog)

class spk_bmp;function void trans_16(reg [15:0] _reg,ref u16 dat);dat = (_reg[7:0]<<8) + _reg[15:8];endfunctionfunction void trans_32(reg [31:0] _reg,ref u32 dat);dat = (_reg[7:0]<<24)+ (_reg[15:8]<<16)+ (_reg[23:16]<<8) + _reg[31:24];endfunctionfunction  int LoadVectorFromBMPFile(string name,ref u8 data[], ref u16 height,ref u16 width,ref u16 flag);u32 skip,position;u32 dwSize;u32 dReadWidth;reg [8*14-1:0] header1;reg [8*40-1:0] header2;reg [8-1:0]    data_tmp;u32 off = 8*14-1;BITMAPFILEHEADER bfh;BITMAPINFO bmi;//判断文件是否存在int fp = $fopen(name, "r");if(!fp) begin$display("Error: can not open file: %s!",name);$stop;return -1;end//读header1$fread(header1,fp,0,14); off = 14*8 - 1;trans_16(header1[off -: 2*8],bfh.bfType);       off -= 2*8;trans_32(header1[off -: 4*8],bfh.bfSize);       off -= 4*8;trans_16(header1[off -: 2*8],bfh.bfReserved1);  off -= 2*8;trans_16(header1[off -: 2*8],bfh.bfReserved2);  off -= 2*8;trans_32(header1[off -: 4*8],bfh.bfOffBits);    off -= 4*8;if(bfh.bfType != 16'h4d42) begin$display("Error: '%s' is not a bmp file!",name);$stop;return -1;end//读header2$fread(header2,fp,14,40); off = 40*8 - 1;trans_32(header2[off -: 4*8],bmi.bmiHeader.biSize);          off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biWidth);         off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biHeight);        off -= 4*8;trans_16(header2[off -: 2*8],bmi.bmiHeader.biPlanes);        off -= 2*8;trans_16(header2[off -: 2*8],bmi.bmiHeader.biBitCount);      off -= 2*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biCompression);   off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biSizeImage);     off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biXPelsPerMeter); off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biYPelsPerMeter); off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biClrUsed);       off -= 4*8;trans_32(header2[off -: 4*8],bmi.bmiHeader.biClrImportant);  off -= 4*8;height = bmi.bmiHeader.biHeight;width  = bmi.bmiHeader.biWidth;flag   = bmi.bmiHeader.biBitCount;if(flag == 24) width *= 3; //真彩图dwSize     = height * width;dReadWidth = (width+3)/4*4;data       = new[dwSize];skip       = dReadWidth - width;position   = dwSize - width;off        = bfh.bfOffBits; //第一行图像数据偏移$fseek(fp,off,0);for(int i = 0;i < height;i++) beginfor(int j = 0;j < width;j++) begin$fread(data_tmp,fp,off,1);data[position] = data_tmp;off++;$fseek(fp,off,0);position++;endposition -= 2*width;off += skip;end$fclose(fp);if(flag==24) width /= 3;endfunctionendclass : spk_bmp
(0)

相关推荐

  • 常见图片宽高解析

    于比较常用的图片格式Png.Jpg.Gif.Bmp,我们需要针对不同的图片格式使用不同的控件来显示,这里就有一个来解析图片格式的问题.我们不能单纯的用文件后缀名.png..jpg..jpeg..gif ...

  • 基于KL26Z的串行TFT屏图像显示

    在KL25.KL26及KL27中,我最喜欢的是KL26开发板,这不但是因为它的硬件配置,也源于它的软件资源支持.别开它与其它板子比起来并不起眼,但基于这块开发板和所提供的例程,能将它打造成一个简单的多 ...

  • 【原创】基于生命周期的工艺验证之工艺设计阶段

    手把手教您把控技术转移.工艺验证和清洁验证的相互关系学习通道扫描右方二维码即刻报名01 基于生命周期的工艺验证 基于生命周期的工艺验证方法,将工艺研发/设计.商业生产工艺验证.常规商业化生产中控制状态 ...

  • 基于OpenCV实战的图像处理:色度分割

    重磅干货,第一时间送达 通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法.为什么大多数人偏爱色度而不是RGB / HSV分割? 可以获得RGB / HSV通道之间的比 ...

  • 保时捷关于ADAS/AD虚拟验证平台

    开发人员正在创建一个虚拟世界,在其中测试.训练和验证驾驶辅助系统和自动驾驶功能.在保时捷工程公司的虚拟ADAS测试中心(PEVATeC),正在创建具有物理现实效果的计算机生成的环境,与真实交通中的测试 ...

  • 综述 :一个可用于根据功能特性对活细胞进行分类的基于拉曼技术的自动化平台

    美国麻省理工学院Roman Stocker教授等人于2019年3月18日在<Nature Microbiology>上发表题目为<An automated Raman-based p ...

  • 【方案推荐】基于STM32的三维旋转显示平台设计(立体成像)

    电路设计技能 本公众号主要用户为从事电路设计的硬件工程师,发布与设计技能.最新技术.最新产品等相关的技术文章,涉及PCB.FPGA.模拟电源.嵌入式.测试测量.开源平台.人工智能等相关领域. 552篇 ...

  • 验证平台中配置的艺术之配置分类

    所有的验证平台(即使是最简单的验证平台)都需要一些配置参数用于设置验证环境中的功能(feature).同时在验证环境中还需要提供一种方式允许测试用例的编写者override这些默认配置参数,用于测试某 ...

  • 印度基于人工智能的在线送餐平台Swiggy获1亿美元F轮融资

    [数据猿导读] 近日,Swiggy宣布从Naspers.美团点评以及其他投资机构处获得1亿美元F轮融资.此轮融资将帮助Swiggy进一步开发其机器学习和AI技术,扩展和发展核心技术平台 作者 | 金又 ...

  • 【案例】恒丰银行——基于大数据的财富管理平台

    数据猿导读 恒丰银行通过整合优化海量结构化与非结构化数据资源,以了解客户.细分客户.服务客户为手段,打造了融智能获客.完整客户画像.产品推荐.市场跟踪.资讯推荐等全功能为一体的财富管理系统,改变了产品 ...

  • 广告验证平台Integral纳斯达克上市:市值28亿美元

    雷递网 雷建平 7月4日报道 广告验证平台Integral Ad Science(NASDAQ:IAS)日前在美国纳斯达克上市,发行价为18美元,之前发行区间为15美元到17美元. Integral ...