[F769DISCOVERY]官方JPEG Demo学习笔记二——更改图像源

[复制链接]
 楼主| colin2135 发表于 2017-1-17 23:18 | 显示全部楼层 |阅读模式
本帖最后由 colin2135 于 2017-1-17 23:18 编辑

上一次分享是学习笔记,对代码的一些解释,这一篇是当时自己看完代码后,作了一点小小的改动。
官方的DEMO里,需要把JPEG图片放到SD卡中,并改名为image.jpg,非常不方便。
这篇分享,我更改了官方的demo,图片的输入源通过F446连接相机获取JPEG图片,通过串口发送到F769,再进行JPEG解码,并显示到LCD。
原理我画了个小图,如下:
9.jpg 先放最终的效果图吧,看完有兴趣的继续看,没兴趣的点个赞哈。
模特找了个小公仔,也不知道是叫啥,图片用的是320*240分辨率,在这个800*480的屏幕上显得有点少。
10.jpg
用杜邦线接的线,有点乱,但是功能正常。
11.jpg
保存到SD卡后,用电脑显示:
IMAGE.JPG

OK,下面开始又是代码介绍啦,想看的继续哈。




关于F446部分就不再介绍了,之前以前发过帖子了,【f446RE开发板试用】教你用HAL库DCMI捕捉OV2640

先说下控制流程(F769):
按USER键 -> 启动外部中断 ->中断回调用串口发送拍照指令0x12,0x34->等待F446返回8字节大小数据(关于JPEG图像的大小length)->接收长度为length长度的Jpeg图像->保存到SD卡->调用Jpeg解码->将ARGB8888图像显示到LCD->回到第一步

非常简单明了,下面只讲重点。

1.外部中断回调,发送拍照指令,aTxBuffer是拍照指令Buffer为0x12,0x34
  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.   if (GPIO_Pin == GPIO_PIN_0)
  4.   {
  5.     /* Toggle LED2 */
  6.     BSP_LED_Toggle(LED2);
  7.                 HAL_UART_Transmit_DMA(&UartHandle, (uint8_t*)aTxBuffer, 2);
  8.   }
  9. }
2.串口接收中断里设置两个标志位rxLengthFlag、rxDataFlag,一个是接收到JPEG数据长度标志,一个是接收到JPEG图像标志
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
  2. {
  3.   /* Set transmission flag: trasfer complete*/
  4.   if(rxLengthFlag==0)
  5.                 rxLengthFlag=1;
  6.         else{
  7.                 rxDataFlag=1;
  8.         }
  9. }


3.当接收到图像长度标志位时,解析这个8字节的数据包,在F446里,我设置了8个字节发送,前面4个字节是”JPEG“,后面4字节是JPEG长度
uint32_t *p=(uint32_t *)(aRxBuffer+4);
dataLength=(uint32_t)*p;知道长度后,就可以调用DMA接收图像了,图像放在uint8_t JPEGDate[10240]一个10K的数组里面,对了320*240的JPEG图像只有6K左右,所以足够
  1. if(rxLengthFlag==1){
  2.                         if(rxDataFlag==0){
  3.                                         if(aRxBuffer[0]=='J' && aRxBuffer[1]=='P' && aRxBuffer[2]=='E' && aRxBuffer[3]=='G' ){
  4.                                                 uint32_t *p=(uint32_t *)(aRxBuffer+4);
  5.                                                 dataLength=(uint32_t)*p;
  6.                                                 HAL_UART_Receive_DMA(&UartHandle, (uint8_t *)JPEGDate, dataLength);
  7.                                         }
  8.                         }
4.接收完成图像后,在SD卡里新建一张叫Image.jpg的图像,注意这里的参数FA_CREATE_ALWAYS|FA_WRITE,字面的意思是说,每次的创建新的一张,并且可读。
  1. if(f_open(&JPEG_File, "image.jpg", FA_CREATE_ALWAYS|FA_WRITE) == FR_OK)
5.把JPEGDate数据里的JPEG图像数据写入image.jpg
  1. while(f_write (&JPEG_File, JPEGDate, dataLength,&bw)!=FR_OK)        /* Write data to a file */
  2.                                          {
  3.                                                  
  4.                                          }
  5.                                          f_close(&JPEG_File);  
6.下面的就跟官方demo里的一样了,调用Jpeg解码,并显示到LCD,很简单,原理参考上一 讲的笔记。

巧克力娃娃 发表于 2017-1-18 11:40 | 显示全部楼层
牛X@@lkl0305
zhanzr21 发表于 2017-1-18 23:49 | 显示全部楼层
好, 参考一下, 正在搞摄像头
joing1999 发表于 2017-2-5 15:59 | 显示全部楼层
MARK  谢谢分享!
碧螺春_123 发表于 2017-2-16 20:19 | 显示全部楼层
感谢分享
dawei360 发表于 2017-2-18 14:57 | 显示全部楼层
摄像头是哪一款,OV7670还是OV5640
 楼主| colin2135 发表于 2017-2-18 22:09 | 显示全部楼层
dawei360 发表于 2017-2-18 14:57
摄像头是哪一款,OV7670还是OV5640

第一张图有啊,ov2640
皈依 发表于 2017-2-25 10:51 | 显示全部楼层
这个厉害了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

533

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部

144

主题

533

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部