正文

USB摄像头编程2006-09-24 21:44:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/18784.html

分享到:

USB摄像头编程

(vcer.net)

 

注意包含头文件qedit.h,dshow.h

几个函数如下,其中有一些全局变量,程序写的充忙,也就不整理了。参考了一些资料。

BOOL initVideo(void)

{

AM_MEDIA_TYPE   amt;

CoInitialize(NULL);                                     // COM的初期化

        // ---- 输入计算的准备 ----

        // 搜索输入装置

        IBaseFilter  *pbf = NULL;

        IMoniker * pMoniker = NULL;

    ULONG cFetched;

    // 制作装置的各个部分

    CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,

                                          IID_ICreateDevEnum, (void ** ) &pDevEnum);

    // 制作视频输入装置的各个部分

    IEnumMoniker * pClassEnum = NULL;

    pDevEnum -> CreateClassEnumerator(

                                        CLSID_VideoInputDeviceCategory, &pClassEnum, 0);

    if (pClassEnum == NULL){

                AfxMessageBox("No video device, program exit!");

                pDevEnum -> Release();

                CoUninitialize();

                //OnOK();

        return FALSE ;

    }

    // 取得最初发现的视频输入装置object的接口

    pClassEnum -> Next(1, &pMoniker, &cFetched);

        pMoniker->BindToObject( 0, 0, IID_IBaseFilter, (void**)&pbf );

       

        // ---- 过虑图像的准备 ----

    // 制作过虑图像,取得接口

    CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC,

                                          IID_IGraphBuilder, (void **) &pGraph);

    pGraph -> QueryInterface( IID_IMediaControl, (LPVOID *) &pMC );

        // 把输入图像追加到过虑图像

    pGraph -> AddFilter( pbf, L"Video Capture");

        // 因为进行了追加所以解除参照的输入图像

    pbf -> Release();

        // ---- 过虑图像的准备 ----

    // 制作过虑图像,取得接口

        CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,

                      IID_IBaseFilter, (LPVOID *)&pF);

        pF -> QueryInterface( IID_ISampleGrabber, (void **)&pGrab );

        // 把输入图像追加到过虑图像

        ZeroMemory(&amt, sizeof(AM_MEDIA_TYPE));

        amt.majortype  = MEDIATYPE_Video;

        amt.subtype    = MEDIASUBTYPE_RGB24;

        amt.formattype = FORMAT_VideoInfo;

        pGrab -> SetMediaType( &amt );

        // 把grubber过虑追加到过虑图像

        pGraph -> AddFilter(pF, L"SamGra");

        // ---- 输入图像的准备 ----

        // 制作输入图像  

        CoCreateInstance( CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,

                                      IID_ICaptureGraphBuilder2, (void **) &pCapture );

    // 把过虑图像编入到输入图像

    pCapture -> SetFiltergraph( pGraph );

    // 输入图像的设定,设定grubber为rendering输出

    pCapture -> RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,

                                pbf, NULL, pF);

 

        // ---- 表示窗口的准备 ----

        // 位图信息的取得      

        pGrab -> GetConnectedMediaType( &amt );

        // 获得视频头部的信息

        VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)amt.pbFormat;

        // 在视频的头部包含位图的信息

        // 把位图的信息复制到BITMAPINFO的结构体中

        BITMAPINFO BitmapInfo;

        ZeroMemory( &BitmapInfo, sizeof(BitmapInfo) );

        CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader),

                                sizeof(BITMAPINFOHEADER));

        img00.bih = BitmapInfo.bmiHeader;

        long n = img00.bih.biSizeImage;

       

        char s[100];

        sprintf(s, "Video Width: %ld  Video Height: %ld", img00.bih.biWidth, img00.bih.biHeight);

        AfxMessageBox(s);

       

        img00.lpBmpData = (BYTE *)malloc( n );

       

        // ************* 追加 *****************

        if (img00.lpBmpData == NULL) {

                AfxMessageBox("Insufficient Memory!");

        }

       

        img00.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );

        return true;

}

void initGraphic(void)

{

        // 把位图的信息复制到BITMAPINFO的结构体中

        BITMAPINFO BitmapInfo;

        ZeroMemory( &BitmapInfo, sizeof(BitmapInfo) );

        CopyMemory( &BitmapInfo.bmiHeader, &img00.bih,

                                sizeof(BITMAPINFOHEADER));

        img01.bih = BitmapInfo.bmiHeader;

        long n = img01.bih.biSizeImage;

        img01.lpBmpData = (BYTE *)malloc( n );

       

        // **************** 追加 ******************

        if (img01.lpBmpData == NULL) {

                printf("Insufficient memory available (img01.lpBmpData)\n");

        }

        img01.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );

}

void closeVideo(void)

{

    // 接口的解除

    pMC -> Release();          

        pDevEnum -> Release();

    pGraph -> Release();

    pCapture -> Release();

       

        CoUninitialize();

        free( img00.lpBmpData );

}

 

阅读(272) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册