你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 5460|回复: 24

[STM32F769-DISC] 【F769IDISCOVERY评测】STM32F769评测系列:JPEG解码测试

[复制链接]

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
发表于 2016-12-3 18:08:46 | 显示全部楼层 |阅读模式
STM32F7(STM32官网)内置JPEG硬件解码,可以极大增强STM32的图像处理能力,毕竟软解需要消耗的CPU时间会更多。

JPEG 百度百科定义(节选)

JPEG是常见的一种图像格式,它由联合照片专家组(Joint Photographic Experts Group)开发并命名为"ISO 10918-1",JPEG仅仅是一种俗称而已。


由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。



JPEG图像的编、解码算法已非常成熟,STM32 HAL库里已内置了该算法的支持,方便用户直接调用。


JPEG测试需要使用到的功能比较多,主要包括:MICRO uSD支持、LCD显示支持、FatFS支持、SDRAM读写支持及JPEG库等。其中任何一个主题都需要花费大量的时间和精力去研究,为了更专注于JPEG解码性能本身,本次测试直接使用HAL库中的BSP例程进行改写。


测试方法介绍,在uSD卡中存储需要测试解码的图像,代码运行时从SD卡中读取图像文件,然后使用JPEG算法进行解码,最后将解码后的图像显示在LCD上,并在LCD上输出相关的信息。


由于SD卡中图像读取需要一定的时间,该时间与SD卡的存储性能相关,所以本贴测试结果仅供参考,毕竟不同的存储卡性能会有所差异。本次测试用到的SD卡如下,CLASS4级别,名为SANDISK,实际可能是山上来的产品。


IMG_20161203_174537(1).jpg

测试中使用的关键代码如下,可以参考BSP中的JPEG解码例程

  1. timeElapsed = HAL_GetTick();
  2.                         
  3.                                 if(f_open(&JPEG_File, file, FA_READ) == FR_OK)
  4.                                 {
  5.                                         /*##-6- JPEG decoding with DMA (Not Blocking ) Method ################*/
  6.                                         JPEG_Decode_DMA(&JPEG_Handle, &JPEG_File, JPEG_OUTPUT_DATA_BUFFER);
  7.                                        
  8.                                         /*##-7- Wait till end of JPEG decoding and perfom Input/Output Processing in BackGround  #*/
  9.                                         do
  10.                                         {
  11.                                                 JPEG_InputHandler(&JPEG_Handle);
  12.                                                 JpegProcessing_End = JPEG_OutputHandler(&JPEG_Handle);
  13.                                                 
  14.                                         }while(JpegProcessing_End == 0);
  15.                                        
  16.                                         /*##-8- Get JPEG Info  ###############################################*/
  17.                                         HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);      
  18.                                        
  19.                                         /*##-9- Copy RGB decoded Data to the display FrameBuffer  ############*/
  20.                                         //xPos = (BSP_LCD_GetXSize() - JPEG_Info.ImageWidth)/2;
  21.                                         //yPos = (BSP_LCD_GetYSize() - JPEG_Info.ImageHeight)/2;   

  22.                                         volatile int width, height;
  23.                                         width = BSP_LCD_GetXSize() > JPEG_Info.ImageWidth? JPEG_Info.ImageWidth: BSP_LCD_GetXSize();
  24.                                         height = BSP_LCD_GetYSize() > JPEG_Info.ImageHeight? JPEG_Info.ImageHeight: BSP_LCD_GetYSize();        
  25.                                          DMA2D_CopyBuffer((uint32_t *)JPEG_OUTPUT_DATA_BUFFER, (uint32_t *)LCD_FRAME_BUFFER, 0 , 0, width, height);
  26.                                        
  27.                                         /*##-10- Close the JPG file ##########################################*/
  28.                                         f_close(&JPEG_File);  
  29.                                        
  30.                                         timeElapsed = HAL_GetTick() - timeElapsed;
  31.                                 }
复制代码


解码时间精确到MS级别,一般来讲该精度应该足够。

测试使用图片涵盖不同分辨率图片,以进行对比。不过分辨率只是其中一个要素,毕竟JPEG图像压缩时还可以指定不同的质量标准,这里特别指出来。

下面为实际测试时输出结果,看图说话。

IMG_20161203_172713.jpg

IMG_20161203_172627.jpg

IMG_20161203_172551.jpg

IMG_20161203_172510.jpg

IMG_20161203_172348.jpg

IMG_20161203_172311.jpg


LCD显示输出解码后的图像。同时还在LCD上输出图像名,图像大小及解码时间。
注意到其中有两幅相同图片的解码,其中一次使用的时间为104MS,而另一次使用的时间为101MS,有些微的差别。另外工具链使用的是MDK,优化级别为-O3。

最后附上本次测试用的图片压缩包,欢迎对比,大家一起讨论。另外代码直接基于BSP包,做了很小的修改,就不上代码了。

test_images.zip (522.46 KB, 下载次数: 64)

评分

参与人数 1ST金币 +20 收起 理由
zero99 + 20

查看全部评分

回复

使用道具 举报

11

主题

1139

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-10
发表于 2016-12-3 18:16:56 | 显示全部楼层
很强,学习一下
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
 楼主| 发表于 2016-12-3 18:24:53 | 显示全部楼层

一起学习
回复 支持 反对

使用道具 举报

6

主题

462

回帖

0

蝴蝶豆

金牌会员

最后登录
2019-12-28
发表于 2016-12-3 19:43:12 | 显示全部楼层
学习学习,不知道libjpeg和硬解码有没有啥关系;是不是libjpeg库就是用来软解码的,而F7是用硬解码,所以在F769i代码里没看到libjpeg的目录?

mulu

mulu

回复 支持 反对

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2016-12-3 20:37:15 | 显示全部楼层
厉害

点评

谢谢  发表于 2016-12-5 10:57
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2016-12-3 20:49:31 | 显示全部楼层
学习了。。。

点评

一起学习,哈哈  发表于 2016-12-5 10:57
回复 支持 反对

使用道具 举报

22

主题

1005

回帖

12

蝴蝶豆

金牌会员

最后登录
2020-11-17
发表于 2016-12-4 08:20:15 | 显示全部楼层
不错,谢谢分享

点评

3Q  发表于 2016-12-5 10:57
回复 支持 反对

使用道具 举报

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2016-12-4 08:34:20 | 显示全部楼层
不错,谢谢分享

点评

大神评点,感谢  发表于 2016-12-5 10:58
回复 支持 反对

使用道具 举报

29

主题

1256

回帖

59

蝴蝶豆

论坛元老

最后登录
2020-11-16
发表于 2016-12-4 09:41:26 | 显示全部楼层
前排占多

点评

占座必胜  发表于 2016-12-5 10:58
回复 支持 反对

使用道具 举报

4

主题

484

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-8-12
发表于 2016-12-5 07:12:06 来自手机 | 显示全部楼层
谢楼主分享

点评

谢谢  发表于 2016-12-5 10:58
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版