|
终于搞定了,这里总结一下我的心得
1. 在2440板中,BSP提供的驱动程序源代码为camera.cpp文件,其中实现了对相机的控制和外部程序调用的接口;
2. 正如各位老大的说明,驱动程序在CIS_IOControl接口函数中实现外部程序调用的功能,包括开始、停止和获取最新帧数据等;
3. 应用程序需要使用相机时,调用CreateFile(_T("CIS1:"), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); 函数获取控制相机的句柄;
4. 调用DeviceIoControl(m_hCameraFile,CAM_IOCTL_MOVIE_START,NULL,0,NULL,0,&dwBytesReceive,NULL); 来启动相机采集;
5. 调用DeviceIoControl(m_hCameraFile,CAM_IOCTL_MOVIE_STOP,NULL,0,NULL,0,&dwBytesReceive,NULL); 来停止采集数据;
6. 调用 DeviceIoControl(m_hCameraFile,
CAM_IOCTL_GET_LATEST_FRAME,
NULL,
0,
m_pYUVBuffer,
(CIF_XSIZE*CIF_YSIZE+CIF_XSIZE*CIF_YSIZE/2+sizeof(YUVINFO)),
&dwBytesReceive,
NULL); 函数来获取最新一帧的图像数据,数据为YUV420结构,如需显示,需调用rgb420_to_rgb24函数转换为RGB格式,然后用StretchDIBits来绘制位图,或者存为位图图片;
7. 可定时调用6中的函数并绘制出来实现图片预览,可以方便地控制频率和预览位置,但是比调用驱动中的预览功能慢一些,CPU占用也多一些;
8. 调用驱动的预览功能使用 DeviceIoControl(m_hCameraFile,
IOCTL_CAM_SETGAMMA,
NULL,
0,
&chPrevEnable,
1,
&dwBytesReceive,
NULL); 函数来实现。
9. 厂家给我的BSP源码里面相机的驱动程序源代码camera.cpp代码组织极烂,不知道是没责任心还是咋回事,如果有清晰的结构,简单扼要的注释将对初学者有莫大的帮助。
10. 正如各位老大所说的,多看驱动源代码是很有帮助的,看懂了还可以自己重写一下,可以实现很多特别的功能。
总结就这么多了,能够搞到这个样子与各位的帮助是分不开的,在此感谢各位了;另外如今网络很发达,多用搜索引擎会有意想不到的好处;
到目前,遗留的问题还很多,听说通过调用CAM_IOCTL_SAMSUNG_CAM_PR可以直接获取到RGB数据,还没有试通,如果真能直接得到RGB数据将大大提高效率,留待后续研究。。。 |
|