TA的每日心情 | 开心 2019-6-20 14:08 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
|
今天抽空又拿起之前RT1052的工程分析了一下(上周带孩子出去旅游,所以休整了一周时间),将之前工程里含有的bug给kill掉了(参看前一贴https://www.cirmall.com/bbs/thread-100854-1-1.html),现在能完整的将ov5640拍摄的图像保存到sd中,而且写sd卡的速度也很快。接下来的工作就是看能否给lcd添加触摸功能的按键以及设计菜单了,这些工作量挺大的,还得等等原子/野火的资料。废话少说,直接上图。 此次试验,我连续进行了3次拍摄工作,以验证程序,当然更多次应该更合适些,但还是偷懒了。
说明: (1)图1 - 图3 为手机拍摄的LCD显示的图片。
(2)图4 - 图6 为SD卡中保存的摄像头拍摄的图片。
(3)图7 串口输出截图
(4)图8 SD中内容的截图
图1 LCD上显示魔方
图2 LCD上显示保证盒
图3 LCD上显示9V电池
图4 对应图1的SD卡中保存的图片
图5 对应图2的SD卡中保存的图片
图6 对应图3的SD卡中保存的图片
图7 串口输出信息截图
图8 SD中内容的截图
实验分析:
(1) 因为光线的问题,SD卡中保存的图片(图4~图6),相对于手机拍摄LCD显示的图片(图1~图3)亮度较暗,但是色彩还是比较分明的(此次LCD采用的RGB565模式)。如图1~图3所示,LCD显示的左边有bug,这个应该是显存刷新时产生的(也就是显存驱动的问题,如果按下reset,那么有时会显示完整的图像,这个bug有待进一步解决),但是保存的图像完整无缺。
(2) 如图7所示,第二次串口输出差为2MB,这个应该也是个bug,因为每张图片(摄像头设定APP_CAMERA_HEIGHT= 480和APP_CAMERA_WIDTH=800,即图片大小为800*480,每个像素点为24bit-RGB三色构成)实际800*480*24/8=1152000(1.09MB)。
(3)如图8所示,橙色圈画显示的是sd卡中保存的bmp格式的文件,因为爱板网不允许上传bmp文件,所以我又倒了一下文件格式。
(4) 修改的地方,刚看了下前一贴,才发现截屏算法代码没有贴全(不知道为什么,当初是全贴了的),现在补充完整。
- /**
- * @brief 设置截取BMP图片
- * @param x :截取区域的起点x坐标
- * @param y :截取区域的起点y坐标
- * @param Width :区域宽度
- * @param Height :区域高度
- * @retval ÎÞ
- * 该参数为以下值之一:
- * @arg 0 : 截图成功
- * @arg -1 :截图失败
- */
- int Screen_Shot( uint16_t x, uint16_t y, uint16_t Width, uint16_t Height, char * filename)
- {
- /* bmp 文件头54个字节 */
- unsigned char header[54] =
- {
- 0x42, 0x4d, 0, 0, 0, 0,
- 0, 0, 0, 0, 54, 0,
- 0, 0, 40,0, 0, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 24, 0,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0
- };
-
- int i;
- int j;
- long file_size;
- long width;
- long height;
- unsigned char r,g,b;
- unsigned int mybw;
- unsigned int read_data;
- char kk[4]={0,0,0,0};
-
- uint8_t ucAlign;//
-
- /* 宽*高 + 补充的字节 + 头部信息 */
- file_size = (long)Width * (long)Height * 3 + Height*(Width%4) + 54;
- /* 文件大小 4个字节 */
- header[2] = (unsigned char)(file_size &0x000000ff);
- header[3] = (file_size >> 8) & 0x000000ff;
- header[4] = (file_size >> 16) & 0x000000ff;
- header[5] = (file_size >> 24) & 0x000000ff;
-
- /* 位图宽4个字节 */
- width=Width;
- header[18] = width & 0x000000ff;
- header[19] = (width >> 8) &0x000000ff;
- header[20] = (width >> 16) &0x000000ff;
- header[21] = (width >> 24) &0x000000ff;
-
- /* 位图高 4个字节 */
- height = Height;
- header[22] = height &0x000000ff;
- header[23] = (height >> 8) &0x000000ff;
- header[24] = (height >> 16) &0x000000ff;
- header[25] = (height >> 24) &0x000000ff;
-
- /* 新建一个文件 */
- bmpres = f_open( &bmpfsrc , (char*)filename, FA_CREATE_ALWAYS | FA_WRITE );
-
- /* 新建一个文件之后要先关闭再打开才能写入 */
- f_close(&bmpfsrc);
-
- bmpres = f_open( &bmpfsrc , (char*)filename, FA_OPEN_EXISTING | FA_WRITE);
- if ( bmpres == FR_OK )
- {
- /* 将预先定义好的bmp头部信息写进文件里面 */
- bmpres = f_write(&bmpfsrc, header,sizeof(unsigned char)*54, &mybw);
-
- ucAlign = Width % 4;
-
- for(i=0; i<Height; i++)
- {
- for(j=0; j<Width; j++)
- {
-
- //read_data = ILI9341_GetPointPixel ( x + j, y + Height - 1 - i );
- //read_data = *(__IO uint32_t*) (activeFrameAddr + (APP_BPP*((x + j ) + LCD_PIXEL_WIDTH *(y + Height - 1 - i)))) ; // 前一个帖子中bmp图片的bug的处理公式,当然可以用它来一幅图重复显示多个对象
- read_data = *(__IO uint32_t*) (activeFrameAddr + (APP_BPP*((x + j )/2 + LCD_PIXEL_WIDTH *(y + Height - 1 - i)/2))) ; // 修改后的公式
- r = GETR_FROM_RGB16(read_data);
- g = GETG_FROM_RGB16(read_data);
- b = GETB_FROM_RGB16(read_data);
- bmpres = f_write(&bmpfsrc, &b,sizeof(unsigned char), &mybw);
- bmpres = f_write(&bmpfsrc, &g,sizeof(unsigned char), &mybw);
- bmpres = f_write(&bmpfsrc, &r,sizeof(unsigned char), &mybw);
- }
-
- if( ucAlign ) /* 如果不是4字节对齐 */
- bmpres = f_write ( & bmpfsrc, kk, sizeof(unsigned char) * ( ucAlign ), & mybw );
- }/*截屏完毕 */
- f_close(&bmpfsrc);
-
- return 0;
-
- }
- else/* 截屏失败 */
- return -1;
- }
复制代码
|
|