您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]关于Blackfin的视频截取图像的程序
本帖共有2043个阅读者
发表帖子 发表投票 回复主题
[求助]关于Blackfin的视频截取图像的程序
kmxtye(论坛新手)
kmxtye
头衔:社区公民
帮派:无帮无派
帖数:21
金钱:244
积分:22
注册时间:2014/7/17
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]关于Blackfin的视频截取图像的程序
这段程序是通过按键调用,截取视频图像保存为bmp格式,然后存入SD卡,求大神帮忙分析一下
void fnPrintScreen(void)
{
    unsigned int i, j, n = 0;
    FRESULT ret;
    FIL fbmpout;
    unsigned char *psrc = (unsigned char *)((int)&gRGBBuf[iRGBRdyBufNo][0+640*3*479]);
    unsigned char *pdst = (unsigned char *)(0x01C00000);
    for ( j = 0; j < 480; j++)
    {        
        for ( i = 0; i < 640; i++ )
        {
            pdst[2] = *psrc++;
            pdst[1] = *psrc++;
            pdst[0] = *psrc++;
            pdst += 3;
        }
        psrc -= 3840;
    }

    char sFileName[20];
    char str[10];
    strcpy(sFileName, tUvStatus.sAviName);
    sprintf(str, "%d.bmp", tUvStatus.iAviCnt);
    strcat(sFileName, str);
    LOG_INFO("enc:filename=%s.\r\n", sFileName);
    
    ret = f_open(&fbmpout, sFileName, FA_CREATE_ALWAYS | FA_WRITE);

    if(FR_OK != ret)
    {  
        LOG_DEBUG("Error: Output file err... exiting\n");
        return (-1);
    }

    ret = f_write (&fbmpout, (const void *)sBmpVgaRgb24Hdr, sizeof(sBmpVgaRgb24Hdr), &n);

    ret = f_write(&fbmpout, (const void *)(0x01C00000), RES_VGA_SIZE_RGB24, &n);

    if(FR_OK != ret)
    {
        LOG_DEBUG("Error: Fwrite Output err... exiting\n");
        return (-1);
    }
    tUvStatus.iAviCnt++;
    Sys_SaveIniFile();
    LOG_INFO("enc:save ini ok.\r\n");
    f_close(&fbmpout);

}


「该帖子被 OpenADSP 在 2014-07-18 08:27:14 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/17 17:20:40
kmxtye(论坛新手)
kmxtye
头衔:社区公民
帮派:无帮无派
帖数:21
金钱:244
积分:22
注册时间:2014/7/17
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
特别就是这段不太能理解
unsigned char *psrc = (unsigned char *)((int)&gRGBBuf[iRGBRdyBufNo][0+640*3*479]);
    unsigned char *pdst = (unsigned char *)(0x01C00000);
    for ( j = 0; j < 480; j++)
    {        
        for ( i = 0; i < 640; i++ )
        {
            pdst[2] = *psrc++;
            pdst[1] = *psrc++;
            pdst[0] = *psrc++;
            pdst += 3;
        }
        psrc -= 3840;
    }

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/17 17:21:36
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BMP图像格式是BGR排列,你采集的图像时RGB排列,所以你的代码出现了倒数据:
for ( i = 0; i < 640; i++ )
        {
            pdst[2] = *psrc++;
            pdst[1] = *psrc++;
            pdst[0] = *psrc++;
            pdst += 3;
        }
即将R 和B的位置互换。
BMP图像格式是从最下面一行开始扫描的,而你的图像是从最上面一行开始扫描的,所以你的代码是先从最下面一行开始转数据,然后将指针指向上一行数据,你的一行数据大小为640*3 = 1920,代码中 psrc -= 3840; 即完成一行数据采集后,向上移动了两行,以匹配BMP图像格式。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/7/17 22:59:21
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
插播广告,OpenADSP开源社区提供Blackfin芯片、开发板、仿真器正品现货,如有需要,请联系OP的QQ:5516164,邮箱:sale@openadsp.com

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/7/18 8:28:24
kmxtye(论坛新手)
kmxtye
头衔:社区公民
帮派:无帮无派
帖数:21
金钱:244
积分:22
注册时间:2014/7/17
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢版主的认真仔细回复,但是上面定义的是这样
unsigned char *psrc = (unsigned char *)((int)&gRGBBuf[iRGBRdyBufNo][0+640*3*479]);
unsigned char *pdst = (unsigned char *)(0x01C00000);
这里不是定义两个指针变量psrc和pdst吗?
那为什么下面可以写成这种pdst[2]、pdst[1]、pdst[0] 。
实在是没看过这种写法
怎么理解和解释呢??

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/18 10:39:45
kmxtye(论坛新手)
kmxtye
头衔:社区公民
帮派:无帮无派
帖数:21
金钱:244
积分:22
注册时间:2014/7/17
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我是OP,我为自己代言,哈哈,我就是上次买资料的那个啊
至于开发板什么的,公司暂时有一块官方的
等哪天我自己需要买的时候,一定在你们这里买的哈

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/18 10:46:29
kmxtye(论坛新手)
kmxtye
头衔:社区公民
帮派:无帮无派
帖数:21
金钱:244
积分:22
注册时间:2014/7/17
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
顶一顶啊,大神们看不到我的帖子么

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/21 15:47:57
kmxtye(论坛新手)
kmxtye
头衔:社区公民
帮派:无帮无派
帖数:21
金钱:244
积分:22
注册时间:2014/7/17
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
还有就是我上面那开头的程序实现了bmp图像的保存,
如果我现在想实现保存为jpg图像格式
通过jpeg编码库该如何现实呢,
在我开头上面那段程序中如何修改,
试了好多次都不成功,求助大神啦,谢谢


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/21 16:45:19
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
http://www.openadsp.com/bbs/topic.asp?id=2381&boardid=18&tb=1

533上的JPEG编码库,供参考。你的是BF548,需要对应的改一下。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/7/21 18:19:29
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这里有一个把BF548里的机制可供参考。

是640*480尺寸的RGB565数据转为YUV422格式后,再用JPEG库进行编码,然后把编码后的数据通过文件系统保存再工程文件夹下的例程机制。

代码通过#include 加载了一个640*480 尺寸RGB565 格式的数据,然后将RGB565 格式的数据转为YUV422 格式,
函数如下:
RGB565ToYuv(640,480,rgbdatabuffer,yuvdatabuffer);
将 rgbdatabuffer 中640*480 尺寸的RGB565 数据转为YUV422 格式,存入yuvdatabuffer

JPEG 编码函数:
jpeg_len = JPEG_ENCODE(640,480,yuvdatabuffer,jpgedata);

将yuvdatabuffe 中640*480 尺寸的 YUV422 数据送入JPEG 编码库编码,编码后数据保存在jpgedata 中,返回
文件大小保存在jpeg_len 中。




我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/7/21 18:50:12
13
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159157 Call, 1 Queries, Processed in 0.015625 second(s),