求助:WINCE S3C2440 30万像素摄像头显示出现多张相同的画面平铺是为什么?

ali50m   2009-11-18 21:57 楼主
具体情况:我用的LCD为800*600的屏,开发板为S3C2440,摄像头驱动原先为130万像素,现在我想弄成30万像素,改可驱动,结果显示在LCD上的画面是多张相同的画面平铺,就是类似于电脑桌面,原先拉伸的图片变为平铺??请问这是怎么回事??我在注册表中已经把分辨率 设置为800*600了,怎么还是出现上面的情况?我想 是不是因为30万像素的摄像头的分辨率不够,所以造成图象只能平铺??我是新人  不懂  请教了

回复评论 (8)

楼主这个现象我曾经也碰到过,说来给楼主参考下,
以前的屏的分辨率是480*272,显示正常,当换了哥屏,分辨率该为800*480后就出现楼主描述的现象了,在我的板子上出现这个问题的原因是在Camera的驱动问题,我的Camera的驱动中,显示图像的时候,是把摄像头采集到的数据经过转换后,形成RGB16的数据,然后把这个数据拷贝到屏的显示内存,这样来显示图像的,所以在小屏的时候显示正常的驱动,在换了大屏时就不正常了,原因是显存的布局不一样了,把同样的显示信息拷贝到大屏的显存就会出问题,解决的方法,是修改驱动中这里的拷贝方式,
希望对楼主有所帮助
点赞  2009-11-19 09:22
楼上说得很有道理,摄像头的驱动要做相应调整
点赞  2009-11-19 09:40
先谢谢楼上两位前辈,我按照你们说的去改下~~有结果再回来结帖~谢谢了~没有分数给,不好意思~
点赞  2009-11-19 23:47
应该是你的CAMERA做了平铺的显示,显存(显示什么)是无辜的只是被你的驱动随便操作了.
点赞  2009-11-20 09:58
有可能是你将CMOS SENSOR的输出改成了30万像素,也就是640*480,但LCD的显示buffer是按你设定的800*600大小进行的,所以复制显示数据的时候每一行需要将多余的点空出来,上面lailzhihou的说法是对的
点赞  2009-11-20 10:34
#if 1
SetKMode(TRUE);
      for(y=0;y<640;y++)
              {
                for (x=0; x<480; x++) // YCbCr 4:2:0 format
        {
                *(U16*)((U8*)(IMAGE_FRAMEBUFFER_UA_BASE+y*2+640*(479-x)*2))=*(U16*)((U8*)

(buffer_rgb+y*480*2+x*2));
                //memcpy((U8 *)(FRAMEBUF_BASE + (y*2)+240*(319-x)*2),(U8 *)(buffer_rgb+y*320*2+x*2),2);
        }
              }
SetKMode(FALSE);

#endif  拷贝内存数据是指这里吗?如果我把        s2440CAM->CIPRTAREA= PrDstWidth*PrDstHeight;

        // LJY, added 040615       
        // initialization for buffer addresses
        y_address = s2440CAM->CICOYSA1;
        cb_address = s2440CAM->CICOCBSA1;
        cr_address = s2440CAM->CICOCRSA1;
        rgb_address = s2440CAM->CIPRCLRSA1;
}中 PrDstWidth的值加大有用吗?因为我显示的时候是有5张图片平铺,高度是对的~宽度是5倍~呵呵~基础不好~实在不好 意思i
点赞  2009-11-20 12:53
void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8 port)
函数中有一段直接在LCD上显示的语句:#if 1
SetKMode(TRUE);
        for (y=0; y         {
                //memcpy((void *)(FRAMEBUF_BASE+0x5e00+y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
                memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (PREVIEW_X*pos_y + pos_x) + y*PREVIEW_X*2),(void

*)buffer_rgb,(PREVIEW_X)*2);
                buffer_rgb += (PREVIEW_X*2);
//                RETAILMSG(1,(TEXT("\r\nPREVIEW_X=%d,PREVIEW_Y=%d\r\n"),PREVIEW_X,PREVIEW_Y));
        }
SetKMode(FALSE); 然后打印出信息~~我想 你们所说的把多余的点空出来是指,我读到满30W像素的分辨率后,输出全部为空?    我还想问下void Display_Cam_Image2()有什么作用~我看了下好像也是读内存信息吧~那不是和void Display_Cam_Image冲突?   我实在笨的要死
点赞  2009-11-20 13:37
改了后,有效果了 ~原先是5张平铺的~现在可以了~呵呵~谢谢你们~学了很多~
点赞  2009-11-21 18:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复