作者:gooogleman@foxmail.com 日期:2012-12-12
今天,一个S5pv210 工控板客户问了一个问题,我觉得有必要详细回答一下他的问题。
------------------------------------------------------------------------------------------------------
回答(1):wince5.0 下摄像头驱动开发普遍用的是直接驱动获取摄像头数据帧的办法来拍照和预览的,但是wince6.0 以后都用directshow的架构来写摄像头驱动,三星提供的demo 就属于这个。他们是完全不同的。你想在S5pv210 上来做wince5.0 2440 下那种简单的方式是可以的。但是这个驱动你得自己照着2440 的来写,这个难度算中等,但是效果不会太好,因为这样要自己写图片格式转换算法,效率和一些图像处理我们一般人都是做不好的, 摄像头数据直接保存成bmp,bmp 太大了,你如果要小就保存成JPG,但是要经过转换,这些都要自己写。而directshow 随便表面上驱动非常庞大,但是微软提供了完整的架构,也有非常多的例子编程,这点我觉得你有必要去了解,可以很多丰富的API来调用实现,可以保存照片,预览,录像都有,非常强大。我建议不要回到2440 那种原始的古老方式去。
回答(2) 上面已经回答,最好是用!这个是趋势。你自己百度一下wince6.0 摄像头directshow的字眼,非常多的文章,好好学习吧。
BTW,微软下面我给你的那个cameraapp 你不要用,那个是win32 写的太底层了,不适合你们玩,你找一个C#或者MFC的程序来改吧。
下面的这些接口是2440 的,在S5pv210 上也可以这么写,但是难度不算小的。
WINCE下CMOS接口摄像头驱动接口说明
设备名:CIS1
hCam = CreateFile (TEXT("CIS1:"), GENERIC_READ,
0, NULL, OPEN_EXISTING, 0, NULL);
hCam为文件句柄,失败时返回INVALID_HANDLE_VALUE。
read:f=ReadFile(hCam,bufOut,pic_size,(LPDWORD)&nBytesRead,NULL);
bufOut为数据buf,pic_size为要读取的数据量。
该函数可用于读取一帧的数据。
ioctl: f = DeviceIoControl (hCam, IOCTL_CAM_CONE,
0, 0, 0, 0, NULL, NULL);
ioctl函数支持的命令如下:(定义位于/inc/camera.h中)
命令 | 参数 | 描述 |
IOCTL_CAM_SHOW | NULL | 显示采集到的图像(RGB565模式时可用);默认 |
IOCTL_CAM_HIDE | NULL | 隐藏采集到的图像 |
IOCTL_CAM_CONT | NULL | 开始采集 |
IOCTL_CAM_STOP | NULL | 停止采集 |
IOCTL_CAM_SETGAMMA | 1:RGB565 2:YUV420 | 设置采集输出格式:目前仅支持RGB565和YUV420两种,默认为RGB565 |
CAM_IOCTL_IMAGE_SIZE | 3:VGA(640*480) 5:PQVGA(320*240) 6:QCIF(176*144) | 设置采集到的图像大小 默认为320×240 |
IOCTL_CAM_ENVINT | NULL | 中断使能(默认) |
IOCTL_CAM_DISVINT | NULL | 禁止中断 |
简单的摄像头流驱动方式应该放弃了,没用的。
hCam = CreateFile (TEXT("CIS1:"), GENERIC_WRITE | GENERIC_READ,
0, NULL, OPEN_EXISTING, 0, NULL); //打开设备句柄
这个方式已经太老了。实现不了复杂的功能。还是用directshow吧。