Buongiorno,
premetto che conosco pochissimo le DirectX.
Devo modificare un programma console che usava VFW per acquisire un'immagine da una webcam, elaborarla e fare diversi lavori.
Ora devo passare alle DirectX perché devo lavorare in automatico con 2 webcam.
Sono riuscito, modificando un esempio trovato su internet, a fare quello che mi serve a parte che mi si apre il preview e devo chiuderlo a mano per andare avanti con il programma.
Eppure ho levato l'interfaccia IVideoWindow che pensavo fosse quella della finestra preview.
Dove sbaglio?
Mille grazie
Paolo
codice:HRESULT hr; // variabili per la gestione dell'anteprima IGraphBuilder *pGraph; ICaptureGraphBuilder2 *pBuild; //IVideoWindow * g_pVW = NULL; IMoniker * pMon = NULL; IBaseFilter *myFilt; IAMStreamConfig *pConfig = NULL; IMediaControl * g_pMC = NULL; AM_MEDIA_TYPE *pmt; // variabili per la gestione del grabber video IBaseFilter *pSG_Filter; // filtro x il grab del singolo frame ISampleGrabber *myGrab; // il vero grabber. SampleGrabberCallback g_StillCapCB; // la classe che si occuperà del callback del grabber ... // Recupera il riferimento alla periferica selezionata pMon= getDevices(num_camera); // Crea il filtro da aggiungere al grafo dei filtri di Dshow hr = pMon->BindToObject(0,0,IID_IBaseFilter,(void **)&myFilt); if (hr!=S_OK) { return FALSE; } // Crea il filtro da aggiugnere al grafo ( il grabber del singolo frame ) hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pSG_Filter); if (hr!=S_OK) { return FALSE; } // Crea il builder per il grafo dei filtri hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild ); if (hr!=S_OK) { return FALSE; } // Crea il manager dei filtri hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); if (hr!=S_OK) { return FALSE; } // Setta il manager dei filtri del builder. pBuild->SetFiltergraph(pGraph); // aggiunge i filtri che ci servono al grafico dei filtri. pGraph->AddFilter(myFilt,L"Devices"); pGraph->AddFilter(pSG_Filter,L"Grabber"); pBuild->FindInterface(&PIN_CATEGORY_CAPTURE, NULL, myFilt,IID_IAMStreamConfig, (void**)&pConfig); hr = pConfig->GetFormat(&pmt); VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat); pVih->bmiHeader.biWidth = sizeW; pVih->bmiHeader.biHeight = sizeH; hr = pConfig->SetFormat(pmt); // Utilizza il PIN di preview per generare un'anteprima dell'immagine che sarà // catturata. Dall'anteprima lo passa al grabber. hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,myFilt,pSG_Filter,NULL); // Recuperiamo l'interfaccia per la gestione del grabber. hr = pSG_Filter->QueryInterface(IID_ISampleGrabber,(void **)&myGrab); // impostiamo il grabber in modo da fargli salvare la bitmap in un percorso myGrab->SetOneShot(true); myGrab->SetBufferSamples(true); myGrab->SetCallback(&g_StillCapCB,1); // 1 xè deve usare il bufferCb myGrab->GetConnectedMediaType(&g_StillMediaType); // Recupera la finestra di preview e il media control //pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW); pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC); // Setta la finestra di preview come visibile //hr = g_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN| WS_VISIBLE| WS_OVERLAPPEDWINDOW); //hr = g_pVW->put_Visible(OATRUE); catturata_img = FALSE; // Avvia il redering del flusso nella finestra di preview g_pMC->Run(); *MSG msg; // Main message loop while(GetMessage(&msg,NULL,0,0) && (catturata_img == FALSE)) { TranslateMessage(&msg); DispatchMessage(&msg); } g_pMC->Stop(); g_pMC->Release(); //g_pVW->Release(); pGraph->Release(); myGrab->Release(); pSG_Filter->Release(); pBuild->Release(); pConfig->Release();

Rispondi quotando
.