请问各位大侠,如何在一段视频流中截取一帧一帧的图像?具体如何实现?多谢各位!

解决方案 »

  1.   

    VFW 采集图像有一个简单的方法: 
    BOOL capFileSaveAs( 
    hwnd, 
    szName 
    ); 直接把当前帧保存为 bmp 图像(对于 YUV 显示模式无效) 
      

  2.   

    我现在要做的并不是单纯的截取某一帧图像然后保存到某个目录下,而是要把视频流的每一帧都截取下来(现在使用的是市场上买回来的视频服务器,厂家只提供了.DLL文件和部分函数的定义,具体的源码没有提供,请问我要是在此基础上进行食品视频帧的截取该如何做呢?)
      

  3.   

    DWORD CVMR_Capture::ImageCapture(LPCTSTR szFile)//视频截图,拍摄的RAW图像位数24bits/pixel
    {
    BYTE *pImage;
    DWORD dwSize,dwWritten;
    dwSize=this->GrabFrame ();
    this->GetFrame (&pImage);

    HANDLE hFile = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_READ, NULL,
      CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE)
    return FALSE; WriteFile(hFile, (LPCVOID)pImage , m_nFramelen, &dwWritten, 0);
    // Close the file
    CloseHandle(hFile);
    return dwWritten;
    }DirectShow或VMR里有这些功能。
      

  4.   

    class CVMR_Capture  
    {
    public:
    int GetHeight();
    int GetWidth();
    BOOL SaveBMP( BYTE* Buffer, int width, int height, long paddedsize, const char* bmpfile );
    long GetFramLength(); CVMR_Capture();
    int EnumDevices(HWND hList);
    HRESULT Init(int iDeviceID,HWND hWnd,int iWidth,int iHeight);
    DWORD GetFrame(BYTE ** pFrame);
    BOOL Pause();
    DWORD ImageCapture(LPCTSTR szFile);
    DWORD GrabFrame();
    virtual ~CVMR_Capture();
    protected:

    IGraphBuilder *m_pGB ;
    IMediaControl *m_pMC;
    IMediaEventEx *m_pME ;
    //IMediaEvent *pME ;


    IVMRWindowlessControl9 *m_pWC;
    IPin * m_pCamOutPin;
    IBaseFilter *m_pDF; PLAYSTATE m_psCurrent; int m_nWidth;
    int m_nHeight; BYTE *m_pFrame;
    long m_nFramelen;

    bool BindFilter(int deviceId, IBaseFilter **pFilter);
    HRESULT InitializeWindowlessVMR(HWND hWnd);
    HRESULT InitVideoWindow(HWND hWnd,int width, int height);
    void StopCapture();
    void CloseInterfaces(void);

    void DeleteMediaType(AM_MEDIA_TYPE *pmt);
    bool Convert24Image(BYTE *p32Img,BYTE *p24Img,DWORD dwSize32);private:

    };这是头文件,你随便从里面截一段代码搜一下,就知道怎么回事了