想用vc做个简单的摄像头显示程序,请问有什么书可以参考?步骤如何?
用DirectShow。
下载Direct SDK,\\DXSDK\Samples\C++\DirectShow\Capture\PlayCap
参考这个例程
还可以参考vfw
在许多关于视频的软件(如视频会议、可视电话等)开发中,都应用了视频捕获技术。视频捕获是指由专用的视频采集卡捕获声频和视频信息,然后将其进行数据化处理,再经过软件的压缩进行处理,这时就可对这些数据进行保存、回放、传输等各种操作。
微软为软件开发人员提供了一个专门用于视频捕获的VFW (Video for Windows) SDK来对视频处理进行支持,VFW SDK为在Windows系统中实现视频捕获提供了标准的接口,这些接口可以被大多数的视频采集卡支持,并有多种视频压缩驱动供选择(当然视频压缩可以自己开发),采集卡支持摄像头,TV等多种输入,从而大大降低了程序的开发难度。
VFW能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。
用VFW采集视频的主要步骤和用到的主要函数有:
(1) 在进行视频捕获之前必需要先创建一个“捕获窗”,并以它为基础进行所有的捕获及设置操作。
m_hWndCapture=::capCreateCaptureWindow("Capture Window",WS_VISIBLE|WS_CHILD,0,0,320,240,m_hWnd,1);
(2) 单独定义的一个捕获窗是不能工作的,它必须与一个设备相关联,这样才能取得视频信号。用函数CapDriverConnect可使一个捕获窗与一个设备驱动程序相关联。
capDriverConnect(m_hWndCapture,0);
(3) 在连接设备以后,要设置采集图像的大小及格式,需要传入一个BITMAPINFO的结构体。
capSetVideoFormat(m_hWndCapture,&m_InInfo,sizeof(BITMAPINFO));
(4) 然后设置采集的速率,为每秒采集多少帧图像。
capPreviewRate(m_hWndCapture,40);
(5) 接下来就可以预览捕获的图像了
capPreview(m_hWndCapture,TRUE);
(6)为了取得每一帧图像进行处理,需要定义一个回调函数FrameCallBack,所谓回调函数,即用户定义的但是由操作系统来调用的函数。
capSetCallbackOnFrame(m_hWndCapture,FrameCallBack);
(7) 回调函数可以取得每帧捕获的图像的数据区,这样就可以对每一帧图像进行处理了。
LRESULT CALLBACK CDlg::FrameCallBack(HWND hWnd, LPVIDEOHDR lpVHdr)
{
lpVHdr->lpData;//这里就是指向的图像数据指针,是没有BMP头的
return TRUE;
}