(转)VFW摄像头采集程序设计

时间:2022-09-02 19:19:58

http://blogold.chinaunix.net/u/28849/showart.php?id=220054

VFW控制摄像头采集图像

       我的这篇文装置属于初级水平,毕竟我不是专业搞软件编程,很多课程我都没有学过,也没有时间来学,另外现在流行directshow,我也不会,VFW我才学了4天,我认为对于我来说VFW够用了。
       接触了H264 ,所以想采集摄像头的图像进行编码,采集的图像是BMP要转换成YUV420,其间要先转换成YUV444。在这里我要先说一下YUV420,希望读到的人少走弯路。

(转)VFW摄像头采集程序设计

   上边的是YUV420采样图,这是16个像素,每个叉表示一个Y,每个圆圈表示一个U和V,但这不是YUV420在磁盘上的存储格式,存储是这样的,先把一桢的Y顺序存放(从上到先从左到右),然后是这一桢的U,最后是V,中间没有间隙,如果你听过跨度这个词,把他忘了吧,我把跨度考虑进去根本显示不了图像,是一片绿。
        首先调用m_hCaptureWnd=::capCreateCaptureWindow("Capture Window",WS_VISIBLE|WS_CHILD,0,0,352,288,this->m_hWnd,1);创建一个显示的窗口,返回窗口句柄给HANDLE  m_hCaptureWnd;
       然后capCaptureGetSetup(m_hCaptureWnd,&capturepar,sizeof(CAPTUREPARMS ));
得到默认的CAPTUREPARMS参数给变量CAPTUREPARMS   capturepar;
 capturepar.dwRequestMicroSecPerFrame =33333;设置每秒30桢,默认的是15桢,不爽。capCaptureSetSetup(m_hCaptureWnd,&capturepar,sizeof(CAPTUREPARMS ));将你修改之后的参数返回窗口。
    第三capPreviewRate(m_hCaptureWnd,33);修改预览模式,每秒显示30桢
            capDriverConnect(m_hCaptureWnd,  0);连接驱动
            capPreview(m_hCaptureWnd,TRUE);打开预览模式  到这里就应该显示画面了
    我在程序中实现采集5秒的视频流,如下面这样设置:
            capCaptureGetSetup(m_hCaptureWnd,&capturepar,sizeof(CAPTUREPARMS ));还是先获得CAPTRUEPARMS参数给变量capturepar
            capturepar.fLimitEnabled=TRUE;打开时间显示功能
            capturepar.wTimeLimit =5;设置时间是5秒
            capCaptureSetSetup(m_hCaptureWnd,&capturepar,sizeof(CAPTUREPARMS ));将改变的参数返回给窗口
            capSetCallbackOnVideoStream(m_hCaptureWnd,&capVideoStreamCallback);这句很关键,是设置回调函数,capVideoStreamCallback是回调函数(capVideoStreamCallback只是个函数名,VC里默认的是capVideoStreamCallback,你可以任意起名,当然你得先声明),capSetCallbackOnVideoStream意思是说当采集视频发生的时候,每采集一桢之后都会调用capVideoStreamCallback函数,所以你可以在capVideoStreamCallback函数里边自己的程序对每一桢图像处理。
          LRESULT CALLBACK capVideoStreamCallback(HWND hWnd, LPVIDEOHDR lpVHdr)这是 capVideoStreamCallback的原型,lpVHdr是个VIDEOHDR的指针变量,里面装着图像,lpVHdr->lpData就指向了原始的未经过任何加工的图像数据,如果你对BMP图像格式了解,那么lpVHdr->lpData就指向了BMP去掉BITMAPFILEHEADER,去掉BITMAPINFO的数据,所以你如果加上这两个东西就可以组成一幅BMP图像,我所得到lpVHdr->lpData每个象素24位也就是RGB24,蓝绿红各8位。如果你想产生16色或者256色的BMP,要用capGetVideoFormat和capSetVideoFormat来设置。
        有了原始的图像数据我就要转换成先转换成YUV444,然后转换成YUV420。
产生的一桢一桢的YUV420文件可以合并成*.yuv文件,最后编一个程序将一桢一桢的YUV连成一个视频流。也可以使用DOS的COPY /b命令,就是麻烦点。就可以用YUVViewerplus观看了。更进一步还可以把H264编码程序加进去生成264码流。