首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求助:怎么从摄像头取到像素,然后把它载入数组中,谢谢2! [已结帖,结帖人:MJXQJ888]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MJXQJ888
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-19 08:30:59 楼主
    请教:
    我是找 DX 自己带的一个源码(摄像头扑获),编译后,是可以看到预览的
    但是,我不知道怎么把每一帧图象变成像素载入数组

    源代码为:
    #define REGISTER_FILTERGRAPH

    HWND ghApp=0;
    DWORD g_dwGraphRegister=0;

    IVideoWindow  * g_pVW = NULL;
    IMediaControl * g_pMC = NULL;
    IMediaEventEx * g_pME = NULL;
    IGraphBuilder * g_pGraph = NULL;
    ICaptureGraphBuilder2 * g_pCapture = NULL;
    PLAYSTATE g_psCurrent = Stopped;


    HRESULT CaptureVideo()
    {
        HRESULT hr;
        IBaseFilter *pSrcFilter=NULL;

        // Get DirectShow interfaces
        hr = GetInterfaces();
        if (FAILED(hr))
        {
            Msg(TEXT("Failed to get video interfaces!  hr=0x%x"), hr);
            return hr;
        }

        // Attach the filter graph to the capture graph
        hr = g_pCapture->SetFiltergraph(g_pGraph);
        if (FAILED(hr))
        {
            Msg(TEXT("Failed to set capture filter graph!  hr=0x%x"), hr);
            return hr;
        }

        // Use the system device enumerator and class enumerator to find
        // a video capture/preview device, such as a desktop USB video camera.
        hr = FindCaptureDevice(&pSrcFilter);
        if (FAILED(hr))
        {
            // Don't display a message because FindCaptureDevice will handle it
            return hr;
        }
     
        // Add Capture filter to our graph.
        hr = g_pGraph->AddFilter(pSrcFilter, L"Video Capture");
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't add capture filter to graph!  hr=0x%x"), hr);
            pSrcFilter->Release();
            return hr;
        }

        // Render the preview pin on the video capture filter
        // Use this instead of g_pGraph->RenderFile
        hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
                                    pSrcFilter, NULL, NULL);
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't render capture stream.  ")
                TEXT("The device may already be in use.\r\n\r\nhr=0x%x"), hr);
            pSrcFilter->Release();
            return hr;
        }

        // Now that the filter has been added to the graph and we have
        // rendered its stream, we can release this reference to the filter.
        pSrcFilter->Release();

        // Set video window style and position
        hr = SetupVideoWindow();
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't initialize video window!  hr=0x%x"), hr);
            return hr;
        }

        // Add our graph to the running object table, which will allow
        // the GraphEdit application to "spy" on our graph
    #ifdef REGISTER_FILTERGRAPH
        hr = AddGraphToRot(g_pGraph, &g_dwGraphRegister);
        if (FAILED(hr))
        {
            Msg(TEXT("Failed to register filter graph with ROT!  hr=0x%x"), hr);
            g_dwGraphRegister = 0;
        }
    #endif

        // Start previewing video data
        hr = g_pMC->Run();
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't run the graph!  hr=0x%x"), hr);
            return hr;
        }

        // Remember current state
        g_psCurrent = Running;
           
        return S_OK;
    }


    HRESULT FindCaptureDevice(IBaseFilter ** ppSrcFilter)
    {
        HRESULT hr;
        IBaseFilter * pSrc = NULL;
        CComPtr <IMoniker> pMoniker =NULL;
        ULONG cFetched;
     
        // Create the system device enumerator
        CComPtr <ICreateDevEnum> pDevEnum =NULL;

        hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
            IID_ICreateDevEnum, (void ** ) &pDevEnum);
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't create system enumerator!  hr=0x%x"), hr);
            return hr;
        }

        // Create an enumerator for the video capture devices
        CComPtr <IEnumMoniker> pClassEnum = NULL;

        hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
        if (FAILED(hr))
        {
            Msg(TEXT("Couldn't create class enumerator!  hr=0x%x"), hr);
            return hr;
        }

        // If there are no enumerators for the requested type, then
        // CreateClassEnumerator will succeed, but pClassEnum will be NULL.
        if (pClassEnum == NULL)
        {
            return E_FAIL;
        }

        // check that the return code is S_OK instead of using SUCCEEDED() macro.
        if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))
        {
            // Bind Moniker to a filter object
            hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);
            if (FAILED(hr))
            {
                Msg(TEXT("Couldn't bind moniker to filter object!  hr=0x%x"), hr);
                return hr;
            }
        }
        else
        {
            Msg(TEXT("Unable to access video capture device!")); 
            return E_FAIL;
        }

        // Copy the found filter pointer to the output parameter.
        // Do NOT Release() the reference, since it will still be used
        // by the calling function.
        *ppSrcFilter = pSrc;

        return hr;
    }


    HRESULT GetInterfaces(void)
    {
        HRESULT hr;

        // Create the filter graph
        hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
            IID_IGraphBuilder, (void **) &g_pGraph);
        if (FAILED(hr))
            return hr;

        // Create the capture graph builder
        hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
            IID_ICaptureGraphBuilder2, (void **) &g_pCapture);
        if (FAILED(hr))
            return hr;
       
        // Obtain interfaces for media control and Video Window
        hr = g_pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC);
        if (FAILED(hr))
            return hr;

        hr = g_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW);
        if (FAILED(hr))
            return hr;

        hr = g_pGraph->QueryInterface(IID_IMediaEvent, (LPVOID *) &g_pME);
        if (FAILED(hr))
            return hr;

        // Set the window handle used to process graph events
        hr = g_pME->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0);

        return hr;
    }


    HRESULT SetupVideoWindow(void)
    {
        HRESULT hr;

        // Set the video window to be a child of the main window
        hr = g_pVW->put_Owner((OAHWND)ghApp);
        if (FAILED(hr))
            return hr;
       
        // Set video window style
        hr = g_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
        if (FAILED(hr))
            return hr;

        // Use helper function to position video window in client rect
        // of main application window
        ResizeVideoWindow();

        // Make the video window visible, now that it is properly positioned
        hr = g_pVW->put_Visible(OATRUE);
        if (FAILED(hr))
            return hr;

        return hr;
    }


    #ifdef REGISTER_FILTERGRAPH

    HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
    {
        IMoniker * pMoniker;
        IRunningObjectTable *pROT;
        WCHAR wsz[128];
        HRESULT hr;

        if (FAILED(GetRunningObjectTable(0, &pROT))) {
            return E_FAIL;
        }

        wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph,
                  GetCurrentProcessId());

        hr = CreateItemMoniker(L"!", wsz, &pMoniker);
        if (SUCCEEDED(hr)) {
            hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
            pMoniker->Release();
        }
        pROT->Release();
        return hr;
    }


    void RemoveGraphFromRot(DWORD pdwRegister)
    {
        IRunningObjectTable *pROT;

        if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
            pROT->Revoke(pdwRegister);
            pROT->Release();
        }
    }

    #endif


    HRESULT HandleGraphEvent(void)
    {
        LONG evCode, evParam1, evParam2;
        HRESULT hr=S_OK;

        while(SUCCEEDED(g_pME->GetEvent(&evCode, (LONG_PTR *) &evParam1,
                      (LONG_PTR *) &evParam2, 0)))
        {
            //
            // Free event parameters to prevent memory leaks associated with
            // event parameter data.  While this application is not interested
            // in the received events, applications should always process them.
            //
            hr = g_pME->FreeEventParams(evCode, evParam1, evParam2);
           
            // Insert event processing code here, if desired
        }

        return hr;
    }

    各位大哥,我还要加什么程序,才能取到每一帧像素.
    非常感谢!
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mxw5495
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 09:56:321楼 得分:10
    这个链接里面有具体的说明http://ksolecn.spaces.live.com/blog/cns!57C7D91533ECC09A!122.entry
    主要是使用 Sample Grabber filter 来做
    第一步, 定义一个类实现Sample Grabber的回调接口IsampleGrabberCB
    第二步,调用RenderStream依次把Still pin、Sample Grabber和系统默认Renderer Filter连接起来
    第三步,配置Sample Grabber以捕获数据
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MJXQJ888
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 17:32:372楼 得分:0
    非常感谢大哥!
    差不多可以了!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved