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();