本帖最后由 chunxx 于 2012-9-25 17:12 编辑
在STM32上做了一个平台,搞定了130万象素的MT9M111 CMOS Sensor接口,后来又分离出来做成一个独立模块,有时间就在上面玩玩图像算法,可以LCD预览显示,OSD叠加,压缩存储,二值化,特征提取,目标识别。。。。 广阔天地呀!呵呵,先上图:
平台:
IMG0001.JPG (389.92 KB, 下载次数: 19)
下载附件
2012-9-25 17:04 上传
1280x1024这个JPEG图,就是由MT9M111捕捉、STM32压缩写到SD卡上的,4mm的小镜头,没有背光随手拍的,虽然比较暗淡没艺术感,但分辨率是硬道理啊!一直只是玩玩,看到这个图,感觉可以用来做点东西,虽然还没想好做什么。
用这个平台做过了一些USB Video Class的探索,在论坛上发过的:
http://www.amobbs.com/thread-5262477-1-1.html
程序是相通的,JPEG编码源程序也在那里。那个开始用的是OV7670,STM32 firewware还是v2.02的,后来改成MT9M111,fireware懒得升级了。
先贡献MT9M111的驱动源程序,带注释无码版本,不是原装但绝对是原创的。
MT9M1111.rar
(12.13 KB, 下载次数: 684)
2012-9-25 17:08 上传
点击文件名下载附件
这个程序,代码以外的文字总结,在我的博客上:
chunxx.21ic.org
其他的一些算法移植也小有成绩(不是成就),不过还属于玩家,也就是玩物丧志的家伙,如果打开门,有人围观起哄的话,还比较容易想起自己远大的理想,所以决定,有时间的话就上传一些源程序,分享一下心得,希望能遇到同道。
uint16_t IMA_FrameDelta(uint16 width, uint16 height, uint8 offset)
{
int32 x, y;
int16 tmp1;
uint16 tmp2, prev_frame, near_frame;
volatile uint16_t *img_ptr;
uint16 *buf;
uint32 ticks;
ticks = SysTickTime; //for debug
near_frame = PLD_LockImageFrame(1);
prev_frame = Pld_SweepPage(near_frame);
buf = (uint16 *)g_IMG_RowBuffer;
for(y=0; y<height; y++)
{
//从最新帧读取1行放在Buffer中
Pld_SetFsmcPage(near_frame);
Pld_SelectImgRow(y);
img_ptr = (uint16 *)Pld_PixelPtr(0);
for(x=0; x<width; x++)
{
buf[x] = (uint16)(*img_ptr++);
}
//行Buffer与次新帧的对应行相减,Update到次新帧
Pld_SetFsmcPage(prev_frame);
Pld_SelectImgRow(y);
img_ptr = (uint16 *)Pld_PixelPtr(0);
for(x=0; x<width; x++)
{
//逐点亮度相减, {MOD}度丢弃或从单帧中取
tmp2 = (*img_ptr);
tmp1 = abs((tmp2 & 0x00ff) - (buf[x] & 0x00ff)) + offset;
if (tmp1<0) tmp1 = 0;
if (tmp1>255) tmp1 = 255; //规范化
// tmp2 = tmp1 | 0x8000; //只取亮度
// tmp2 = (tmp2 & 0xff00)|tmp1; // {MOD}度从次新帧取
tmp2 = (buf[x] & 0xff00)|tmp1; // {MOD}度从最新帧取
(*img_ptr++) = tmp2;
}
}
Pld_SetFsmcPage(prev_frame);
ticks = SysTickTime - ticks;
printf(" Frame SUB run times:%dms", ticks*5);
return(prev_frame);
}
两幅1280x1024的图这样相减,时间居然要2s! 逐点运算很可怕。
一周热门 更多>