您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 在BF533摄像头实验中,需要对拍照的图像进行... 
本帖共有409个阅读者
发表帖子 发表投票 回复主题
在BF533摄像头实验中,需要对拍照的图像进行像素转化,这个转换程序size_convert()什么意思?
mx125211(论坛新手)
mx125211
头衔:社区公民
帮派:无帮无派
帖数:28
金钱:336
积分:38
注册时间:2015/1/31
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
在BF533摄像头实验中,需要对拍照的图像进行像素转化,这个转换程序size_convert()什么意思?
void size_convert(unsigned char *src, unsigned char *dst)
{
int i;
int j;
for(i=0;i<272;i++)
{
for(j=0;j<1920;j++)
{
dst[((i*480*3)+j)] = src[(271-i)*640*3+j];
}
}
}

调用的时候是这样的,size_convert(rgbdata_buffer,DisplayBuffer);
这个函数是对rgb图像进行压缩还是裁剪?我看了一下,有点乱,好像都不像。求帮助。



上传的图片
  201582015435783.jpg [ 40.26 KB 457×217 ] (缩略时请点击查看原图)

 





「该帖子被 mx125211 在 2015-08-20 15:45:21 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2015/8/17 18:09:35
mx125211(论坛新手)
mx125211
头衔:社区公民
帮派:无帮无派
帖数:28
金钱:336
积分:38
注册时间:2015/1/31
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
    哦哦,我试了一下,把函数里面的1920改成1440,显示结果还是不变的。其实使用1440就可以了。这个函数的作用是用来翻转图片和裁剪图片。操作方法和上图的标号一样。
    如果用了1920,那么多余的部分被后面的数据填补去了。因此也不会有事。
    如果我把函数改成    out_img[((i*480*3)+j)] = in_img[i*640*3+j];  那么图像就会上下翻转一下。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2015/8/20 15:52:17
mx125211(论坛新手)
mx125211
头衔:社区公民
帮派:无帮无派
帖数:28
金钱:336
积分:38
注册时间:2015/1/31
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
不过有一点需要注意的,图片中3,4那一个方向其实是图片的底部。不过这个也是相对于BF533配套的开发板和摄像头组合才是这样的。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2015/8/20 16:13:25
mx125211(论坛新手)
mx125211
头衔:社区公民
帮派:无帮无派
帖数:28
金钱:336
积分:38
注册时间:2015/1/31
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个是压缩图片的程序。把640*480 转化成 480*272的函数。
//压缩图片
void Resize(unsigned char *in_img,unsigned char *center_buffer,unsigned char *out_img)
{
long i,j;
long fX;
long fY;


for(j=0; j<480; j++)         //对图像480行进列压缩
{
for(i=0; i<1440; i++)    //640列→480列
{
fX = (long)((13333*i/10000 + 0.5) + 640*3*j); //计算相应的列
center_buffer[i + 480*3*j] = in_img[fX];      //转换
}
}

for(i=0; i<1440; i++)        
{
for(j=0; j<272; j++)
{
fY = (long)(480*3*((long)(17647*j/10000 + 0.5))+ i);//计算相应的行
out_img[480*3*j + i] = center_buffer[fY];         //转换
}
}
}


使用如下

unsigned char rgbdata_buffer[480*1920];   //rgb是24为的,因此三个字节 640*3=1920

unsigned char center_buffer[480*1440];    //列压缩后存进去的数组

unsigned char DisplayBuffer[272*1440] ;   //裁剪成272*480, rgb       480*3=1440


Resize(rgbdata_buffer,center_buffer,DisplayBuffer);//压缩图片,640*480--480*272

然后DisplayBuffer这个数组就可以直线液晶屏显示了。这时会发现,图片比开发板提供的显示范围大了一整圈。



「该帖子被 mx125211 在 2015-08-21 09:37:26 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2015/8/21 9:36:09
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢分享

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2015/9/9 22:35:36
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154480 Call, 1 Queries, Processed in 0.031250 second(s),