STM32玩百万象素摄像头,分享经验

2019-12-14 12:37发布

本帖最后由 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

其他的一些算法移植也小有成绩(不是成就),不过还属于玩家,也就是玩物丧志的家伙,如果打开门,有人围观起哄的话,还比较容易想起自己远大的理想,所以决定,有时间的话就上传一些源程序,分享一下心得,希望能遇到同道。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
98条回答
zl20094463
1楼-- · 2019-12-21 10:48
楼主厉害!
chunxx
2楼-- · 2019-12-21 14:27
 精彩回答 2  元偷偷看……
chunxx
3楼-- · 2019-12-21 17:05
UVC摄像头我只是作为一种调试手段,不过很不喜欢这东西,太TMD娇气了,一不小心就搞得Explorer也死掉。
DirectShow这个框架搞得巨复杂,也就巨脆弱。
这两天测试帧差运算,相邻2帧相减,没有好的测试方法,还是通过UVC,接到PC显示,用DirectShow DDK内置的AMCap.exe程序捕捉视频,能捕捉到AVI文件,Capture时显示是正确的,AVI文件播放确巨慢,几十秒的视频在播放器中打开成了几分钟,AMCap的帧率设置不起作用,不知道这么搞它,谁能帮我看一下?
更搞笑的是,这个几十秒的AVI文件6M多,用RAR压缩,只有91K!Microsoft真的Out了。
uvc_test2.rar (90.83 KB, 下载次数: 74) 2012-10-15 17:55 上传 点击文件名下载附件

xts
4楼-- · 2019-12-21 17:21
两帧相减就一个函数,无处可折腾,郁闷。

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! 逐点运算很可怕。
lvhaian
5楼-- · 2019-12-21 20:06
楼主是偶像啊!
chunxx
6楼-- · 2019-12-21 23:57
楼主在么, 发我个消息。有项目合作。

一周热门 更多>